From 1e1bf25514abe726066abe4094dacd3f5004bd28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 4 Sep 2023 16:41:58 +0200 Subject: [PATCH 01/47] gateway: disconnect inactive duplicate clients (#3796) * gateway: disconnect inactive duplicate clients * wip: see if we can switch to single ping at a time * Finish reworking ping pong request flow * Use workspace version of tokio * Bundle active client channels into struct * Fix typo --- gateway/Cargo.toml | 2 +- .../node/client_handling/active_clients.rs | 33 +++- .../connection_handler/authenticated.rs | 163 +++++++++++++++--- .../websocket/connection_handler/fresh.rs | 109 ++++++++++-- .../websocket/connection_handler/mod.rs | 2 +- .../websocket/message_receiver.rs | 15 +- .../receiver/connection_handler.rs | 4 +- 7 files changed, 279 insertions(+), 49 deletions(-) diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 8e907a9eee..2c3f6f00d6 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -37,7 +37,7 @@ serde_json = { workspace = true } sqlx = { version = "0.5", features = [ "runtime-tokio-rustls", "sqlite", "macros", "migrate", ] } subtle-encoding = { version = "0.5", features = ["bech32-preview"] } thiserror = "1" -tokio = { version = "1.24.1", features = [ "rt-multi-thread", "net", "signal", "fs", ] } +tokio = { workspace = true, features = [ "rt-multi-thread", "net", "signal", "fs", "time" ] } tokio-stream = { version = "0.1.11", features = ["fs"] } tokio-tungstenite = "0.14" tokio-util = { version = "0.7.4", features = ["codec"] } diff --git a/gateway/src/node/client_handling/active_clients.rs b/gateway/src/node/client_handling/active_clients.rs index d2de2cc5b5..280027dacd 100644 --- a/gateway/src/node/client_handling/active_clients.rs +++ b/gateway/src/node/client_handling/active_clients.rs @@ -1,13 +1,23 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::node::client_handling::websocket::message_receiver::MixMessageSender; use dashmap::DashMap; use nym_sphinx::DestinationAddressBytes; use std::sync::Arc; +use super::websocket::message_receiver::{IsActiveRequestSender, MixMessageSender}; + #[derive(Clone)] -pub(crate) struct ActiveClientsStore(Arc>); +pub(crate) struct ActiveClientsStore(Arc>); + +#[derive(Clone)] +pub(crate) struct ClientIncomingChannels { + // Mix messages coming from the mixnet to the handler of a client. + pub mix_message_sender: MixMessageSender, + + // Requests sent from the handler of one client to the handler of other clients. + pub is_active_request_sender: IsActiveRequestSender, +} impl ActiveClientsStore { /// Creates new instance of `ActiveClientsStore` to store in-memory handles to all currently connected clients. @@ -21,13 +31,13 @@ impl ActiveClientsStore { /// # Arguments /// /// * `client`: address of the client for which to obtain the handle. - pub(crate) fn get(&self, client: DestinationAddressBytes) -> Option { + pub(crate) fn get(&self, client: DestinationAddressBytes) -> Option { let entry = self.0.get(&client)?; let handle = entry.value(); // if the entry is stale, remove it from the map // if handle.is_valid() { - if !handle.is_closed() { + if !handle.mix_message_sender.is_closed() { Some(handle.clone()) } else { // drop the reference to the map to prevent deadlocks @@ -52,8 +62,19 @@ impl ActiveClientsStore { /// /// * `client`: address of the client for which to insert the handle. /// * `handle`: the sender channel for all mix packets to be pushed back onto the websocket - pub(crate) fn insert(&self, client: DestinationAddressBytes, handle: MixMessageSender) { - self.0.insert(client, handle); + pub(crate) fn insert( + &self, + client: DestinationAddressBytes, + handle: MixMessageSender, + is_active_request_sender: IsActiveRequestSender, + ) { + self.0.insert( + client, + ClientIncomingChannels { + mix_message_sender: handle, + is_active_request_sender, + }, + ); } /// Get number of active clients in store diff --git a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs index 0fe930a96d..1bbd85b5f1 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs @@ -1,28 +1,39 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::node::client_handling::websocket::connection_handler::{ClientDetails, FreshHandler}; -use crate::node::client_handling::websocket::message_receiver::MixMessageReceiver; -use crate::node::storage::error::StorageError; -use crate::node::storage::Storage; -use futures::StreamExt; +use futures::{ + future::{FusedFuture, OptionFuture}, + FutureExt, StreamExt, +}; use log::*; -use nym_gateway_requests::iv::IVConversionError; -use nym_gateway_requests::types::{BinaryRequest, ServerResponse}; -use nym_gateway_requests::{ClientControlRequest, GatewayRequestsError}; +use nym_gateway_requests::{ + iv::{IVConversionError, IV}, + types::{BinaryRequest, ServerResponse}, + ClientControlRequest, GatewayRequestsError, +}; use nym_sphinx::forwarding::packet::MixPacket; -use rand::{CryptoRng, Rng}; -use std::convert::TryFrom; -use std::process; -use thiserror::Error; -use tokio::io::{AsyncRead, AsyncWrite}; -use tokio_tungstenite::tungstenite::protocol::Message; - -use crate::node::client_handling::bandwidth::Bandwidth; -use crate::node::client_handling::FREE_TESTNET_BANDWIDTH_VALUE; -use nym_gateway_requests::iv::IV; use nym_task::TaskClient; use nym_validator_client::coconut::CoconutApiError; +use rand::{CryptoRng, Rng}; +use thiserror::Error; +use tokio::io::{AsyncRead, AsyncWrite}; +use tokio_tungstenite::tungstenite::{protocol::Message, Error as WsError}; + +use std::{convert::TryFrom, process, time::Duration}; + +use crate::node::{ + client_handling::{ + bandwidth::Bandwidth, + websocket::{ + connection_handler::{ClientDetails, FreshHandler}, + message_receiver::{ + IsActive, IsActiveRequestReceiver, IsActiveResultSender, MixMessageReceiver, + }, + }, + FREE_TESTNET_BANDWIDTH_VALUE, + }, + storage::{error::StorageError, Storage}, +}; #[derive(Debug, Error)] pub(crate) enum RequestHandlingError { @@ -97,6 +108,11 @@ pub(crate) struct AuthenticatedHandler { inner: FreshHandler, client: ClientDetails, mix_receiver: MixMessageReceiver, + // Occasionally the handler is requested to ping the connected client for confirm that it's + // active, such as when a duplicate connection is detected. This hashmap stores the oneshot + // senders that are used to return the result of the ping to the handler requesting the ping. + is_active_request_receiver: IsActiveRequestReceiver, + is_active_ping_pending_reply: Option<(u64, IsActiveResultSender)>, } // explicitly remove handle from the global store upon being dropped @@ -127,11 +143,14 @@ where fresh: FreshHandler, client: ClientDetails, mix_receiver: MixMessageReceiver, + is_active_request_receiver: IsActiveRequestReceiver, ) -> Self { AuthenticatedHandler { inner: fresh, client, mix_receiver, + is_active_request_receiver, + is_active_ping_pending_reply: None, } } @@ -351,6 +370,29 @@ where } } + /// Handles pong message received from the client. + /// If the client is still active, the handler that requested the ping will receive a reply. + async fn handle_pong(&mut self, msg: Vec) { + if let Ok(msg) = msg.try_into() { + let msg = u64::from_be_bytes(msg); + trace!("Received pong from client: {}", msg); + if let Some((tag, _)) = &self.is_active_ping_pending_reply { + if tag == &msg { + debug!("Reporting back to the handler that the client is still active"); + let tx = self.is_active_ping_pending_reply.take().unwrap().1; + if let Err(err) = tx.send(IsActive::Active) { + warn!("Failed to send pong reply back to the requesting handler: {err:?}"); + } + } else { + warn!( + "Received pong reply from the client with unexpected tag: {}", + msg + ); + } + } + } + } + /// Attempts to handle websocket message received from the connected client. /// /// # Arguments @@ -363,10 +405,64 @@ where match raw_request { Message::Binary(bin_msg) => Some(self.handle_binary(bin_msg).await), Message::Text(text_msg) => Some(self.handle_text(text_msg).await), + Message::Pong(msg) => { + self.handle_pong(msg).await; + None + } _ => None, } } + /// Send a ping to the connected client and return a tag identifying the ping. + async fn send_ping(&mut self) -> Result + where + S: AsyncRead + AsyncWrite + Unpin, + { + let tag: u64 = rand::thread_rng().gen(); + debug!("Got request to ping our connection: {}", tag); + self.inner + .send_websocket_message(Message::Ping(tag.to_be_bytes().to_vec())) + .await?; + Ok(tag) + } + + /// Handles the ping timeout by responding back to the handler that requested the ping. + async fn handle_ping_timeout(&mut self) { + debug!("Ping timeout expired!"); + if let Some((_tag, reply_tx)) = self.is_active_ping_pending_reply.take() { + if let Err(err) = reply_tx.send(IsActive::NotActive) { + warn!("Failed to respond back to the handler requesting the ping: {err:?}"); + } + } + } + + async fn handle_is_active_request( + &mut self, + reply_tx: IsActiveResultSender, + ) -> Result<(), WsError> + where + S: AsyncRead + AsyncWrite + Unpin, + { + if self.is_active_ping_pending_reply.is_some() { + warn!("Received request to ping the client, but a ping is already in progress!"); + if let Err(err) = reply_tx.send(IsActive::BusyPinging) { + warn!("Failed to respond back to the handler requesting the ping: {err:?}"); + } + return Ok(()); + } + + match self.send_ping().await { + Ok(tag) => { + self.is_active_ping_pending_reply = Some((tag, reply_tx)); + Ok(()) + } + Err(err) => { + warn!("Failed to send ping to client: {err}. Assuming the connection is dead."); + Err(err) + } + } + } + /// Simultaneously listens for incoming client requests, which realistically should only be /// binary requests to forward sphinx packets or increase bandwidth /// and for sphinx packets received from the mix network that should be sent back to the client. @@ -377,11 +473,32 @@ where { trace!("Started listening for ALL incoming requests..."); + // Ping timeout future used to check if the client responded to our ping request + let mut ping_timeout: OptionFuture<_> = None.into(); + while !shutdown.is_shutdown() { tokio::select! { _ = shutdown.recv() => { log::trace!("client_handling::AuthenticatedHandler: received shutdown"); - } + }, + // Received a request to ping the client to check if it's still active + tx = self.is_active_request_receiver.next() => { + match tx { + None => break, + Some(reply_tx) => { + if self.handle_is_active_request(reply_tx).await.is_err() { + break; + } + // NOTE: fuse here due to .is_terminated() check below + ping_timeout = Some(Box::pin(tokio::time::sleep(Duration::from_millis(1000)).fuse())).into(); + } + }; + }, + // The ping timeout expired, meaning the client didn't respond to our ping request + _ = &mut ping_timeout, if !ping_timeout.is_terminated() => { + ping_timeout = None.into(); + self.handle_ping_timeout().await; + }, socket_msg = self.inner.read_websocket_message() => { let socket_msg = match socket_msg { None => break, @@ -406,7 +523,13 @@ where } }, mix_messages = self.mix_receiver.next() => { - let mix_messages = mix_messages.expect("sender was unexpectedly closed! this shouldn't have ever happened!"); + let mix_messages = match mix_messages { + None => { + warn!("mix receiver was closed! Assuming the connection is dead."); + break; + } + Some(mix_messages) => mix_messages, + }; if let Err(err) = self.inner.push_packets_to_client(&self.client.shared_keys, mix_messages).await { warn!("failed to send the unwrapped sphinx packets back to the client - {err}, assuming the connection is dead"); break; diff --git a/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs b/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs index f03cdc26f9..349cf4200b 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs @@ -1,33 +1,43 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::node::client_handling::active_clients::ActiveClientsStore; -use crate::node::client_handling::websocket::connection_handler::coconut::CoconutVerifier; -use crate::node::client_handling::websocket::connection_handler::{ - AuthenticatedHandler, ClientDetails, InitialAuthResult, SocketStream, +use futures::{ + channel::{mpsc, oneshot}, + SinkExt, StreamExt, }; -use crate::node::storage::error::StorageError; -use crate::node::storage::Storage; -use futures::{channel::mpsc, SinkExt, StreamExt}; use log::*; use nym_crypto::asymmetric::identity; use nym_gateway_requests::authentication::encrypted_address::{ EncryptedAddressBytes, EncryptedAddressConversionError, }; -use nym_gateway_requests::iv::{IVConversionError, IV}; -use nym_gateway_requests::registration::handshake::error::HandshakeError; -use nym_gateway_requests::registration::handshake::{gateway_handshake, SharedKeys}; -use nym_gateway_requests::types::{ClientControlRequest, ServerResponse}; -use nym_gateway_requests::{BinaryResponse, PROTOCOL_VERSION}; +use nym_gateway_requests::{ + iv::{IVConversionError, IV}, + registration::handshake::{error::HandshakeError, gateway_handshake, SharedKeys}, + types::{ClientControlRequest, ServerResponse}, + BinaryResponse, PROTOCOL_VERSION, +}; use nym_mixnet_client::forwarder::MixForwardingSender; use nym_sphinx::DestinationAddressBytes; use rand::{CryptoRng, Rng}; -use std::convert::TryFrom; -use std::sync::Arc; +use std::{convert::TryFrom, sync::Arc, time::Duration}; use thiserror::Error; use tokio::io::{AsyncRead, AsyncWrite}; use tokio_tungstenite::tungstenite::{protocol::Message, Error as WsError}; +use crate::node::{ + client_handling::{ + active_clients::ActiveClientsStore, + websocket::{ + connection_handler::{ + coconut::CoconutVerifier, AuthenticatedHandler, ClientDetails, InitialAuthResult, + SocketStream, + }, + message_receiver::{IsActive, IsActiveRequestSender}, + }, + }, + storage::{error::StorageError, Storage}, +}; + #[derive(Debug, Error)] pub(crate) enum InitialAuthenticationError { #[error("Internal gateway storage error")] @@ -394,6 +404,59 @@ where } } + async fn handle_duplicate_client( + &mut self, + address: DestinationAddressBytes, + mut is_active_request_tx: IsActiveRequestSender, + ) -> Result<(), InitialAuthenticationError> { + // Ask the other connection to ping if they are still active. + // Use a oneshot channel to return the result to us + let (ping_result_sender, ping_result_receiver) = oneshot::channel(); + log::debug!("Asking other connection handler to ping the connected client to see if it is still active"); + if let Err(err) = is_active_request_tx.send(ping_result_sender).await { + warn!("Failed to send ping request to other handler: {err}"); + } + + // Wait for the reply + match tokio::time::timeout(Duration::from_millis(2000), ping_result_receiver).await { + Ok(Ok(res)) => { + match res { + IsActive::NotActive => { + // The other handler reported that the client is not active, so we can + // disconnect the other client and continue with this connection. + log::debug!("Other handler reports it is not active"); + self.active_clients_store.disconnect(address); + } + IsActive::Active => { + // The other handled reported a positive reply, so we have to assume it's + // still active and disconnect this connection. + log::info!("Other handler reports it is active"); + return Err(InitialAuthenticationError::DuplicateConnection); + } + IsActive::BusyPinging => { + // The other handler is already busy pinging the client, so we have to + // assume it's still active and disconnect this connection. + log::debug!("Other handler reports it is already busy pinging the client"); + return Err(InitialAuthenticationError::DuplicateConnection); + } + } + } + Ok(Err(_)) => { + // Other channel failed to reply (the channel sender probably dropped) + log::info!("Other connection failed to reply, disconnecting it in favour of this new connection"); + self.active_clients_store.disconnect(address); + } + Err(_) => { + // Timeout waiting for reply + log::warn!( + "Other connection timed out, disconnecting it in favour of this new connection" + ); + self.active_clients_store.disconnect(address); + } + } + Ok(()) + } + /// Tries to handle the received authentication request by checking correctness of the received data. /// /// # Arguments @@ -418,8 +481,11 @@ where let encrypted_address = EncryptedAddressBytes::try_from_base58_string(enc_address)?; let iv = IV::try_from_base58_string(iv)?; - if self.active_clients_store.get(address).is_some() { - return Err(InitialAuthenticationError::DuplicateConnection); + // Check for duplicate clients + if let Some(client_tx) = self.active_clients_store.get(address) { + log::warn!("Detected duplicate connection for client: {}", address); + self.handle_duplicate_client(address, client_tx.is_active_request_sender) + .await?; } let shared_keys = self @@ -606,12 +672,19 @@ where } return if let Some(client_details) = auth_result.client_details { - self.active_clients_store - .insert(client_details.address, mix_sender); + // Channel for handlers to ask other handlers if they are still active. + let (is_active_request_sender, is_active_request_receiver) = + mpsc::unbounded(); + self.active_clients_store.insert( + client_details.address, + mix_sender, + is_active_request_sender, + ); Some(AuthenticatedHandler::upgrade( self, client_details, mix_receiver, + is_active_request_receiver, )) } else { None diff --git a/gateway/src/node/client_handling/websocket/connection_handler/mod.rs b/gateway/src/node/client_handling/websocket/connection_handler/mod.rs index ad6a0d03a1..ee7474f3a7 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/mod.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/mod.rs @@ -100,7 +100,7 @@ pub(crate) async fn handle_connection( .await { None => { - trace!("received shutdown signal while performing initial authetnication"); + trace!("received shutdown signal while performing initial authentication"); return; } Some(None) => { diff --git a/gateway/src/node/client_handling/websocket/message_receiver.rs b/gateway/src/node/client_handling/websocket/message_receiver.rs index 3ff265b2a7..fb41083803 100644 --- a/gateway/src/node/client_handling/websocket/message_receiver.rs +++ b/gateway/src/node/client_handling/websocket/message_receiver.rs @@ -1,7 +1,20 @@ // Copyright 2020 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use futures::channel::mpsc; +use futures::channel::{mpsc, oneshot}; pub(crate) type MixMessageSender = mpsc::UnboundedSender>>; pub(crate) type MixMessageReceiver = mpsc::UnboundedReceiver>>; + +// Channels used for one handler to requester another handler to check that the client is still +// active. The result is then passed back to the requesting handler in the oneshot channel. +pub(crate) type IsActiveRequestSender = mpsc::UnboundedSender; +pub(crate) type IsActiveRequestReceiver = mpsc::UnboundedReceiver; + +#[derive(Debug)] +pub(crate) enum IsActive { + Active, + NotActive, + BusyPinging, +} +pub(crate) type IsActiveResultSender = oneshot::Sender; diff --git a/gateway/src/node/mixnet_handling/receiver/connection_handler.rs b/gateway/src/node/mixnet_handling/receiver/connection_handler.rs index dd2bc5d402..e6071b8035 100644 --- a/gateway/src/node/mixnet_handling/receiver/connection_handler.rs +++ b/gateway/src/node/mixnet_handling/receiver/connection_handler.rs @@ -70,9 +70,9 @@ impl ConnectionHandler { } fn update_clients_store_cache_entry(&mut self, client_address: DestinationAddressBytes) { - if let Some(client_sender) = self.active_clients_store.get(client_address) { + if let Some(client_senders) = self.active_clients_store.get(client_address) { self.clients_store_cache - .insert(client_address, client_sender); + .insert(client_address, client_senders.mix_message_sender); } } From 1bb455675ea94853940ea469777b40fe199e0235 Mon Sep 17 00:00:00 2001 From: pierre Date: Tue, 5 Sep 2023 09:24:24 +0200 Subject: [PATCH 02/47] init dirs --- nym-vpn/android/.gitkeep | 0 nym-vpn/ios/.gitkeep | 0 nym-vpn/linux/.gitkeep | 0 nym-vpn/macos/.gitkeep | 0 nym-vpn/win/.gitkeep | 0 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 nym-vpn/android/.gitkeep create mode 100644 nym-vpn/ios/.gitkeep create mode 100644 nym-vpn/linux/.gitkeep create mode 100644 nym-vpn/macos/.gitkeep create mode 100644 nym-vpn/win/.gitkeep diff --git a/nym-vpn/android/.gitkeep b/nym-vpn/android/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nym-vpn/ios/.gitkeep b/nym-vpn/ios/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nym-vpn/linux/.gitkeep b/nym-vpn/linux/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nym-vpn/macos/.gitkeep b/nym-vpn/macos/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nym-vpn/win/.gitkeep b/nym-vpn/win/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 From 22c59be82cb2d993a2a16e9e4b2e42b535a0acc1 Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Tue, 5 Sep 2023 11:58:21 +0200 Subject: [PATCH 03/47] Release/v1.1.30 twix (#3836) * changed last vers. checkout to master * corrected path of config * make binaries executable * docs: typescript.md - changing variables * docs: rust.md - changing variables * docs: vesting-contract.md - changing variables * docs: mixnet-contract.md - changing variables * docs: all variables changed * operators: all variables finished * dev-portal: mixnet-integration.md - variable changed * dev-portal: faq.md - variable changed * dev-portal: moredo.md up to date w NC default * dev-portal: telegram.md - added banner & minor fix * dev-portal: matrix.md - added banner * PR finished - ready for review and merge * removed all instances of platform_release_version var * removed all instances of platform_release_version var * changed version bumper script: removed platform_release_version references * changed comment * updating changelog and bumping versions --------- Co-authored-by: serinko <97586125+serinko@users.noreply.github.com> Co-authored-by: mfahampshire Co-authored-by: mx <33262279+mfahampshire@users.noreply.github.com> Co-authored-by: benedettadavico --- CHANGELOG.md | 14 ++++++++ Cargo.lock | 18 +++++----- clients/native/Cargo.toml | 2 +- clients/socks5/Cargo.toml | 2 +- documentation/README.md | 4 +-- documentation/bump_versions.sh | 19 +++++------ documentation/dev-portal/README.md | 2 +- documentation/dev-portal/book.toml | 1 - .../dev-portal/src/images/matrix.png | Bin 0 -> 156582 bytes .../dev-portal/src/images/matrix.webp | Bin 0 -> 13680 bytes .../dev-portal/src/images/telegram.png | Bin 0 -> 2289721 bytes .../dev-portal/src/images/telegram.webp | Bin 0 -> 252390 bytes .../dev-portal/src/integrations/faq.md | 4 +-- .../src/integrations/mixnet-integration.md | 2 +- .../src/quickstart/nymconnect-gui.md | 2 +- .../dev-portal/src/tutorials/matrix.md | 1 + .../dev-portal/src/tutorials/monero.md | 32 ++++++++++-------- .../dev-portal/src/tutorials/telegram.md | 4 ++- documentation/docs/README.md | 8 +---- documentation/docs/book.toml | 1 - documentation/docs/src/SUMMARY.md | 2 +- .../docs/src/binaries/building-nym.md | 5 ++- .../docs/src/binaries/init-and-config.md | 9 ++++- .../docs/src/clients/socks5-client.md | 2 +- .../docs/src/clients/websocket-client.md | 4 +-- documentation/docs/src/nyx/mixnet-contract.md | 4 +-- .../docs/src/nyx/vesting-contract.md | 4 +-- documentation/docs/src/sdk/rust.md | 4 +-- documentation/docs/src/sdk/typescript.md | 10 +++--- documentation/operators/book.toml | 1 - documentation/operators/src/SUMMARY.md | 2 +- .../operators/src/binaries/building-nym.md | 5 ++- .../operators/src/binaries/init-and-config.md | 9 ++++- .../operators/src/nodes/gateway-setup.md | 2 +- .../operators/src/nodes/maintenance.md | 8 ++--- .../operators/src/nodes/mix-node-setup.md | 8 ++--- .../src/nodes/network-requester-setup.md | 2 +- explorer-api/Cargo.toml | 2 +- gateway/Cargo.toml | 2 +- mixnode/Cargo.toml | 2 +- nym-api/Cargo.toml | 2 +- nym-connect/desktop/CHANGELOG.md | 8 +++++ nym-connect/desktop/package.json | 2 +- nym-connect/desktop/src-tauri/Cargo.toml | 2 +- nym-connect/desktop/src-tauri/tauri.conf.json | 2 +- .../network-requester/Cargo.toml | 2 +- .../network-statistics/Cargo.toml | 2 +- tools/nym-cli/Cargo.toml | 2 +- 48 files changed, 127 insertions(+), 98 deletions(-) create mode 100644 documentation/dev-portal/src/images/matrix.png create mode 100644 documentation/dev-portal/src/images/matrix.webp create mode 100644 documentation/dev-portal/src/images/telegram.png create mode 100644 documentation/dev-portal/src/images/telegram.webp diff --git a/CHANGELOG.md b/CHANGELOG.md index 2df4f7e732..1421d63898 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,20 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [Unreleased] +## [v1.1.30-twix] (2023-09-05) + +- geo_aware_provider: fix too much filtering of gateways ([#3826]) +- network-requester: add description to config ([#3799]) +- Speedy mode - selects gateway based on latency in medium / speedy mode ([#3770]) +- Chore/enable versioning ([#3768]) +- Create explorer-client and use in geo aware provider ([#3824]) + +[#3826]: https://github.com/nymtech/nym/pull/3826 +[#3799]: https://github.com/nymtech/nym/pull/3799 +[#3770]: https://github.com/nymtech/nym/issues/3770 +[#3768]: https://github.com/nymtech/nym/pull/3768 +[#3824]: https://github.com/nymtech/nym/pull/3824 + ## [v1.1.29-snickers] (2023-08-29) - Add EXPLORER_API configurable url ([#3810]) diff --git a/Cargo.lock b/Cargo.lock index b60d064a0e..5e8ae04207 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2768,7 +2768,7 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "explorer-api" -version = "1.1.27" +version = "1.1.28" dependencies = [ "chrono", "clap 4.3.21", @@ -5638,7 +5638,7 @@ dependencies = [ [[package]] name = "nym-api" -version = "1.1.28" +version = "1.1.29" dependencies = [ "actix-web", "anyhow", @@ -5785,7 +5785,7 @@ dependencies = [ [[package]] name = "nym-cli" -version = "1.1.27" +version = "1.1.28" dependencies = [ "anyhow", "base64 0.13.1", @@ -5858,7 +5858,7 @@ dependencies = [ [[package]] name = "nym-client" -version = "1.1.27" +version = "1.1.28" dependencies = [ "clap 4.3.21", "dirs 4.0.0", @@ -6166,7 +6166,7 @@ dependencies = [ [[package]] name = "nym-gateway" -version = "1.1.27" +version = "1.1.28" dependencies = [ "anyhow", "async-trait", @@ -6321,7 +6321,7 @@ dependencies = [ [[package]] name = "nym-mixnode" -version = "1.1.28" +version = "1.1.29" dependencies = [ "anyhow", "bs58 0.4.0", @@ -6439,7 +6439,7 @@ dependencies = [ [[package]] name = "nym-network-requester" -version = "1.1.27" +version = "1.1.28" dependencies = [ "anyhow", "async-file-watcher", @@ -6486,7 +6486,7 @@ dependencies = [ [[package]] name = "nym-network-statistics" -version = "1.1.27" +version = "1.1.28" dependencies = [ "dirs 4.0.0", "log", @@ -6651,7 +6651,7 @@ dependencies = [ [[package]] name = "nym-socks5-client" -version = "1.1.27" +version = "1.1.28" dependencies = [ "clap 4.3.21", "lazy_static", diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index 351f8fb295..1143f4ad60 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-client" -version = "1.1.27" +version = "1.1.28" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] description = "Implementation of the Nym Client" edition = "2021" diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index a52422b5d0..c13f3b8525 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-socks5-client" -version = "1.1.27" +version = "1.1.28" authors = ["Dave Hrycyszyn "] description = "A SOCKS5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address" edition = "2021" diff --git a/documentation/README.md b/documentation/README.md index 9e490e4d57..59c5e32133 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -7,7 +7,7 @@ Each directory contains a readme with more information about running and contrib * `operators` contains node setup and maintenance guides hosted at [https://nymtech.net/operators](https://nymtech.net/operators) ## Scripts -* `bump_versions.sh` allows you to update the `platform_release_version` and `wallet_release_version` variables in the `book.toml` of each mdbook project at once. You can also optionally update the `minimum_rust_version` as well. Helpful for lazy-updating when cutting a new version of the docs. - * `build_all_to_dist.sh` is used by the `ci-dev.yml` and `cd-dev.yml` scripts for building all mdbook projects and moving the rendered html to `../dist/` to be rsynced with various servers. +* `bump_versions.sh` allows you to update the ~~`platform_release_version` and~~ `wallet_release_version` variable~~s~~ in the `book.toml` of each mdbook project at once. You can also optionally update the `minimum_rust_version` as well. Helpful for lazy-updating when cutting a new version of the docs. +* `build_all_to_dist.sh` is used by the `ci-dev.yml` and `cd-dev.yml` scripts for building all mdbook projects and moving the rendered html to `../dist/` to be rsynced with various servers. diff --git a/documentation/bump_versions.sh b/documentation/bump_versions.sh index 03e698faac..2ff1c2c882 100755 --- a/documentation/bump_versions.sh +++ b/documentation/bump_versions.sh @@ -1,21 +1,21 @@ #!/usr/bin/env bash -# this takes two args: platform release version and wallet release version. +# takes one manadatory arg and one optional arg: wallet release and minimum rust versions # it then uses sed to bump them in the three book.toml files. # -# e.g if the upcoming platform release was v1.1.29 and the release version 1.2.9 you'd run this as: -# `./bump_versions.sh "1.1.29" "1.2.9"` +# e.g if the upcoming wallet release version was 1.2.9 you'd run this as: +# `./bump_versions.sh "1.2.9"` # -# you can also set the minumum rust version by passing an optional 3rd argument: -# `./bump_versions.sh "1.1.29" "1.2.9" "1.67"` +# you can also set the minumum rust version by passing an optional additional argument: +# `./bump_versions.sh "1.2.9" "1.67"` # array of project dirs declare -a projects=("docs" "dev-portal" "operators") # check number of args passed -if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; +if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then - echo "failure: please pass at least 2 and at most 3 args: " - echo "./bump_version.sh [OPTIONAL]" + echo "failure: please pass at least 1 and at most 2 args: " + echo "./bump_version.sh [OPTIONAL]" exit 0 fi @@ -29,8 +29,7 @@ else for i in "${projects[@]}" do # sed the vars in the book.toml file for each project - echo "setting platform and wallet versions in $i/" - sed -i 's/platform_release_version =.*/platform_release_version = "'$1'"/' "$i"/book.toml + echo "setting wallet version in $i/" sed -i 's/wallet_release_version =.*/wallet_release_version = "'$2'"/' "$i"/book.toml if [ "$3" ] then diff --git a/documentation/dev-portal/README.md b/documentation/dev-portal/README.md index b43fbc7d2c..0b53b8e984 100644 --- a/documentation/dev-portal/README.md +++ b/documentation/dev-portal/README.md @@ -12,7 +12,7 @@ If you have built a project with Nym or are compiling and writing resources abou ## Variables There are some variables that are shared across this book, such as the current latest software version. -Variables are denoted in the `.md` files wrapped in `{{}}` (e.g `{{platform_release_version}}` is the most recent release), and are located in the `book.toml` file under the `[preprocessor.variables.variables]` heading. If you are changing something like the software release version, minimum code versions in prerequisites, etc, **check in here first!** +Variables are denoted in the `.md` files wrapped in `{{}}` (e.g `{{wallet_release_version}}`), and are located in the `book.toml` file under the `[preprocessor.variables.variables]` heading. If you are changing something like the software release version, minimum code versions in prerequisites, etc, **check in here first!** ## Building When working locally, it is recommended that you use `mdbook serve` to have a local version of the docs served on `localhost:3000`, with hot reloading on any changes made to files in the `src/` directory. diff --git a/documentation/dev-portal/book.toml b/documentation/dev-portal/book.toml index 315f28698a..fb083e36a4 100644 --- a/documentation/dev-portal/book.toml +++ b/documentation/dev-portal/book.toml @@ -49,7 +49,6 @@ assets_version = "2.0.0" # do not edit: managed by `mdbook-admonish install` # https://gitlab.com/tglman/mdbook-variables/ [preprocessor.variables.variables] minimum_rust_version = "1.66" -platform_release_version = "1.1.29" wallet_release_version = "1.2.8" [preprocessor.last-changed] diff --git a/documentation/dev-portal/src/images/matrix.png b/documentation/dev-portal/src/images/matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..2ea4ae4bf08f0d44d49b23cba5097744111e2f95 GIT binary patch literal 156582 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 ZMIi9sspS8U;@rQj!2TDf{73Si{U0R@FYo{W literal 0 HcmV?d00001 diff --git a/documentation/dev-portal/src/images/telegram.png b/documentation/dev-portal/src/images/telegram.png new file mode 100644 index 0000000000000000000000000000000000000000..e65407a5b654049954402d9e63fa2cba930b6b15 GIT binary patch literal 2289721 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
JUq52`gyY>{hX+>FEx|dsFsp3emTMDN) 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

fE0fp711@H9l|7h0lb1iC(tFc4s^B`uji0}Y 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 z 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ðWYVQz2Q+@BR6~Gf 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

)D=9tt`-w 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 z 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

  • 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

    K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/nym-vpn/android/gradle/wrapper/gradle-wrapper.properties b/nym-vpn/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..96f2e7a959 --- /dev/null +++ b/nym-vpn/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Apr 24 22:46:45 EDT 2023 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/nym-vpn/android/gradlew b/nym-vpn/android/gradlew new file mode 100755 index 0000000000..4f906e0c81 --- /dev/null +++ b/nym-vpn/android/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/nym-vpn/android/gradlew.bat b/nym-vpn/android/gradlew.bat new file mode 100644 index 0000000000..107acd32c4 --- /dev/null +++ b/nym-vpn/android/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/nym-vpn/android/settings.gradle.kts b/nym-vpn/android/settings.gradle.kts new file mode 100644 index 0000000000..aaebe93cd6 --- /dev/null +++ b/nym-vpn/android/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "NymConnect" +include(":app") + \ No newline at end of file From 28800491964ebc28aa095bf8c9f7a203d6dd8b06 Mon Sep 17 00:00:00 2001 From: Mark Sinclair Date: Wed, 6 Sep 2023 18:08:17 +0100 Subject: [PATCH 19/47] Revert "init" This reverts commit 8d2e8b3d26d9f6295b4b489bdfd07884427acb9e. --- nym-vpn/android/.gitignore | 71 --- nym-vpn/android/.gitkeep | 0 nym-vpn/android/LICENSE | 21 - nym-vpn/android/README.md | 42 -- nym-vpn/android/app/.gitignore | 2 - nym-vpn/android/app/build.gradle.kts | 159 ------- .../android/app/objectbox-models/default.json | 99 ----- .../app/objectbox-models/default.json.bak | 94 ---- nym-vpn/android/app/proguard-rules.pro | 21 - .../ExampleInstrumentedTest.kt | 24 - .../android/app/src/main/AndroidManifest.xml | 115 ----- .../app/src/main/ic_launcher-playstore.png | Bin 39338 -> 0 bytes .../wireguardautotunnel/Constants.kt | 6 - .../WireGuardAutoTunnel.kt | 27 -- .../wireguardautotunnel/module/BoxModule.kt | 40 -- .../module/RepositoryModule.kt | 25 -- .../module/ServiceModule.kt | 29 -- .../module/TunnelModule.kt | 31 -- .../receiver/BootReceiver.kt | 39 -- .../receiver/NotificationActionReceiver.kt | 39 -- .../repository/Repository.kt | 16 - .../repository/SettingsBox.kt | 63 --- .../repository/TunnelBox.kt | 57 --- .../service/foreground/Action.kt | 6 - .../service/foreground/ForegroundService.kt | 64 --- .../service/foreground/ServiceManager.kt | 90 ---- .../service/foreground/ServiceState.kt | 6 - .../WireGuardConnectivityWatcherService.kt | 210 --------- .../foreground/WireGuardTunnelService.kt | 154 ------- .../service/network/BaseNetworkService.kt | 117 ----- .../service/network/MobileDataService.kt | 10 - .../service/network/NetworkService.kt | 10 - .../service/network/NetworkStatus.kt | 10 - .../service/network/WifiService.kt | 10 - .../notification/NotificationService.kt | 21 - .../notification/WireGuardNotification.kt | 77 ---- .../service/shortcut/ShortcutsActivity.kt | 28 -- .../service/shortcut/ShortcutsManager.kt | 73 --- .../service/tile/TunnelControlTile.kt | 142 ------ .../service/tunnel/HandshakeStatus.kt | 14 - .../service/tunnel/VpnService.kt | 18 - .../service/tunnel/WireGuardTunnel.kt | 131 ------ .../service/tunnel/model/Settings.kt | 15 - .../service/tunnel/model/TunnelConfig.kt | 89 ---- .../wireguardautotunnel/ui/MainActivity.kt | 201 --------- .../wireguardautotunnel/ui/Routes.kt | 36 -- .../wireguardautotunnel/ui/ViewState.kt | 9 - .../ui/common/ClickableIconButton.kt | 31 -- .../common/PermissionRequestFailedScreen.kt | 35 -- .../ui/common/RowListItem.kt | 55 --- .../ui/common/SearchBar.kt | 80 ---- .../ui/common/navigation/BottomNavBar.kt | 42 -- .../ui/common/navigation/BottomNavItem.kt | 9 - .../ui/screens/config/ConfigScreen.kt | 241 ---------- .../ui/screens/config/ConfigViewModel.kt | 152 ------- .../ui/screens/detail/DetailScreen.kt | 139 ------ .../ui/screens/detail/DetailViewModel.kt | 45 -- .../ui/screens/main/MainScreen.kt | 336 -------------- .../ui/screens/main/MainViewModel.kt | 179 -------- .../ui/screens/settings/SettingsScreen.kt | 415 ------------------ .../ui/screens/settings/SettingsViewModel.kt | 124 ------ .../ui/screens/support/SupportScreen.kt | 83 ---- .../wireguardautotunnel/ui/theme/Color.kt | 17 - .../wireguardautotunnel/ui/theme/Theme.kt | 80 ---- .../ui/theme/TransparentSystemBars.kt | 22 - .../wireguardautotunnel/ui/theme/Type.kt | 34 -- .../wireguardautotunnel/util/NumberUtils.kt | 25 -- .../app/src/main/res/drawable/discord.xml | 10 - .../app/src/main/res/drawable/github.xml | 12 - .../res/drawable/ic_launcher_background.xml | 170 ------- .../res/drawable/ic_launcher_foreground.xml | 30 -- .../app/src/main/res/drawable/shield.xml | 5 - .../app/src/main/res/drawable/vpn_off.xml | 5 - .../app/src/main/res/drawable/vpn_on.xml | 5 - .../main/res/mipmap-anydpi-v26/ic_banner.xml | 5 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 2004 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 2936 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 3568 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 1268 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 1926 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 2242 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_banner.png | Bin 3578 -> 0 bytes .../res/mipmap-xhdpi/ic_banner_foreground.png | Bin 3770 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 2728 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 3956 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 5030 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 4246 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 6154 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 7718 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 5854 -> 0 bytes .../ic_launcher_foreground.webp | Bin 8314 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 10402 -> 0 bytes .../app/src/main/res/values/colors.xml | 11 - .../main/res/values/ic_banner_background.xml | 4 - .../res/values/ic_launcher_background.xml | 4 - .../app/src/main/res/values/strings.xml | 90 ---- .../app/src/main/res/values/themes.xml | 6 - .../app/src/main/res/xml/backup_rules.xml | 13 - .../main/res/xml/data_extraction_rules.xml | 19 - .../wireguardautotunnel/ExampleUnitTest.kt | 17 - nym-vpn/android/build.gradle.kts | 19 - nym-vpn/android/gradle.properties | 25 -- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - nym-vpn/android/gradlew | 185 -------- nym-vpn/android/gradlew.bat | 89 ---- nym-vpn/android/settings.gradle.kts | 18 - 109 files changed, 5463 deletions(-) delete mode 100644 nym-vpn/android/.gitignore create mode 100644 nym-vpn/android/.gitkeep delete mode 100644 nym-vpn/android/LICENSE delete mode 100644 nym-vpn/android/README.md delete mode 100644 nym-vpn/android/app/.gitignore delete mode 100644 nym-vpn/android/app/build.gradle.kts delete mode 100644 nym-vpn/android/app/objectbox-models/default.json delete mode 100644 nym-vpn/android/app/objectbox-models/default.json.bak delete mode 100644 nym-vpn/android/app/proguard-rules.pro delete mode 100644 nym-vpn/android/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt delete mode 100644 nym-vpn/android/app/src/main/AndroidManifest.xml delete mode 100644 nym-vpn/android/app/src/main/ic_launcher-playstore.png delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/BootReceiver.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/NotificationActionReceiver.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceManager.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsActivity.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsManager.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile/TunnelControlTile.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/HandshakeStatus.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/SearchBar.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigScreen.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigViewModel.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailScreen.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailViewModel.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt delete mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/NumberUtils.kt delete mode 100644 nym-vpn/android/app/src/main/res/drawable/discord.xml delete mode 100644 nym-vpn/android/app/src/main/res/drawable/github.xml delete mode 100644 nym-vpn/android/app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 nym-vpn/android/app/src/main/res/drawable/ic_launcher_foreground.xml delete mode 100644 nym-vpn/android/app/src/main/res/drawable/shield.xml delete mode 100644 nym-vpn/android/app/src/main/res/drawable/vpn_off.xml delete mode 100644 nym-vpn/android/app/src/main/res/drawable/vpn_on.xml delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp delete mode 100644 nym-vpn/android/app/src/main/res/values/colors.xml delete mode 100644 nym-vpn/android/app/src/main/res/values/ic_banner_background.xml delete mode 100644 nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml delete mode 100644 nym-vpn/android/app/src/main/res/values/strings.xml delete mode 100644 nym-vpn/android/app/src/main/res/values/themes.xml delete mode 100644 nym-vpn/android/app/src/main/res/xml/backup_rules.xml delete mode 100644 nym-vpn/android/app/src/main/res/xml/data_extraction_rules.xml delete mode 100644 nym-vpn/android/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt delete mode 100644 nym-vpn/android/build.gradle.kts delete mode 100644 nym-vpn/android/gradle.properties delete mode 100644 nym-vpn/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 nym-vpn/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 nym-vpn/android/gradlew delete mode 100644 nym-vpn/android/gradlew.bat delete mode 100644 nym-vpn/android/settings.gradle.kts diff --git a/nym-vpn/android/.gitignore b/nym-vpn/android/.gitignore deleted file mode 100644 index 31caa0cedf..0000000000 --- a/nym-vpn/android/.gitignore +++ /dev/null @@ -1,71 +0,0 @@ -# Built application files -*.apk -*.aar -*.ap_ -*.aab -# Files for the ART/Dalvik VM -*.dex -# Java class files -*.class -# Generated files -bin/ -gen/ -out/ -release/ -build/ -# Gradle files -.gradle/ -# Local configuration file (sdk path, etc) -local.properties -# Proguard folder generated by Eclipse -proguard/ -# Log Files -*.log -# Android Studio Navigation editor temp files -.navigation/ -# Android Studio captures folder -captures/ -# IntelliJ -*.iml -.idea/ -# .idea/workspace.xml -# .idea/tasks.xml -# .idea/gradle.xml -# .idea/assetWizardSettings.xml -# .idea/dictionaries -.idea/libraries -# Android Studio 3 in .gitignore file. -.idea/caches -.idea/modules.xml -# Comment next line if keeping position of elements in Navigation Editor is relevant for you -.idea/navEditor.xml -# Keystore files -# Uncomment the following lines if you do not want to check your keystore files in. -*.jks -*.keystore -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild -.cxx/ -# Freeline -freeline.py -freeline/ -freeline_project_description.json -# fastlane -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -fastlane/readme.md -# Version control -vcs.xml -# lint -lint/intermediates/ -lint/generated/ -lint/outputs/ -lint/tmp/ -# lint/reports/ -# MacOS -.DS_Store -# App Specific cases -app/release/output.json -.idea/codeStyles/ diff --git a/nym-vpn/android/.gitkeep b/nym-vpn/android/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nym-vpn/android/LICENSE b/nym-vpn/android/LICENSE deleted file mode 100644 index 51f3844dba..0000000000 --- a/nym-vpn/android/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 NymConnect - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/nym-vpn/android/README.md b/nym-vpn/android/README.md deleted file mode 100644 index e4a334e993..0000000000 --- a/nym-vpn/android/README.md +++ /dev/null @@ -1,42 +0,0 @@ -## NymConnect for Android - -### Prerequisites - -_TODO_ - -### Getting started - -[Install](https://developer.android.com/studio/install) Android Studio and open -the project.\ -Setup an android emulator using AVD.\ -[Run](https://developer.android.com/studio/run/emulator) the project. - -**⚠ NOTE**: be sure -to [set](https://developer.android.com/studio/run#changing-variant) -the build variant to `x86_64Debug` when running on emulator - -### Features - -* Add tunnels via .conf file -* Auto connect to VPN based on Wi-Fi SSID -* Split tunneling by application with search -* Always-on VPN for Android support -* Quick tile support for vpn toggling -* Dynamic shortcuts support for automation integration -* Configurable Trusted Network list -* Optional auto connect on mobile data -* Automatic service restart after reboot -* Service will stay running in background after app has been closed - -### Building - -_TODO_ - -### Credits - -This project is based on the "WG Tunnel" project made by Zane Schepke -https://github.com/zaneschepke/wgtunnel - -### License - -MIT diff --git a/nym-vpn/android/app/.gitignore b/nym-vpn/android/app/.gitignore deleted file mode 100644 index 956c004dc0..0000000000 --- a/nym-vpn/android/app/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build -/release \ No newline at end of file diff --git a/nym-vpn/android/app/build.gradle.kts b/nym-vpn/android/app/build.gradle.kts deleted file mode 100644 index bc158e58e9..0000000000 --- a/nym-vpn/android/app/build.gradle.kts +++ /dev/null @@ -1,159 +0,0 @@ -val rExtra = rootProject.extra - -plugins { - id("com.android.application") - id("org.jetbrains.kotlin.android") - kotlin("kapt") - id("com.google.dagger.hilt.android") - id("org.jetbrains.kotlin.plugin.serialization") - id("io.objectbox") -} - -android { - namespace = "net.nymtech.nymconnect" - compileSdk = 34 - - val versionMajor = 1 - val versionMinor = 0 - val versionPatch = 0 - val versionBuild = 0 - - defaultConfig { - applicationId = "net.nymtech.nymconnect" - minSdk = 28 - targetSdk = 34 - versionCode = versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild - versionName = "${versionMajor}.${versionMinor}.${versionPatch}" - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables { - useSupportLibrary = true - } - } - - buildTypes { - release { - isDebuggable = false - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - kotlinOptions { - jvmTarget = "17" - } - buildFeatures { - compose = true - } - composeOptions { - kotlinCompilerExtensionVersion = "1.4.8" - } - packaging { - resources { - excludes += "/META-INF/{AL2.0,LGPL2.1}" - } - } - - /* flavorDimensions += "abi" - productFlavors { - create("universal") { - dimension = "abi" - ndk { - abiFilters += listOf("arm64-v8a", "armeabi-v7a", "x86_64", "x86") - } - } - create("arch64") { - dimension = "abi" - ndk { - abiFilters += listOf("arm64-v8a", "x86_64") - } - } - create("arm64") { - dimension = "abi" - ndk { - abiFilters += "arm64-v8a" - } - } - create("arm") { - dimension = "abi" - ndk { - abiFilters += "armeabi-v7a" - } - } - create("x86_64") { - dimension = "abi" - ndk { - abiFilters += "x86_64" - } - } - create("x86") { - dimension = "abi" - ndk { - abiFilters += "x86" - } - } - } */ -} - -dependencies { - implementation("androidx.core:core-ktx:1.10.1") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") - implementation("androidx.activity:activity-compose:1.7.2") - implementation(platform("androidx.compose:compose-bom:2023.03.00")) - implementation("androidx.compose.ui:ui") - implementation("androidx.compose.ui:ui-graphics") - implementation("androidx.compose.ui:ui-tooling-preview") - implementation("androidx.compose.material3:material3:1.1.1") - implementation("androidx.appcompat:appcompat:1.6.1") - - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) - androidTestImplementation("androidx.compose.ui:ui-test-junit4") - debugImplementation("androidx.compose.ui:ui-tooling") - debugImplementation("androidx.compose.ui:ui-test-manifest") - - //wireguard tunnel - implementation("com.wireguard.android:tunnel:1.0.20230706") - - //logging - implementation("com.jakewharton.timber:timber:5.0.1") - - // compose navigation - implementation("androidx.navigation:navigation-compose:2.7.1") - implementation("androidx.hilt:hilt-navigation-compose:1.0.0") - - // hilt - implementation("com.google.dagger:hilt-android:${rExtra.get("hiltVersion")}") - kapt("com.google.dagger:hilt-android-compiler:${rExtra.get("hiltVersion")}") - - //accompanist - implementation("com.google.accompanist:accompanist-systemuicontroller:${rExtra.get("accompanistVersion")}") - implementation("com.google.accompanist:accompanist-permissions:${rExtra.get("accompanistVersion")}") - implementation("com.google.accompanist:accompanist-flowlayout:${rExtra.get("accompanistVersion")}") - implementation("com.google.accompanist:accompanist-navigation-animation:${rExtra.get("accompanistVersion")}") - implementation("com.google.accompanist:accompanist-drawablepainter:${rExtra.get("accompanistVersion")}") - - //db - implementation("io.objectbox:objectbox-kotlin:${rExtra.get("objectBoxVersion")}") - - //lifecycle - implementation("androidx.lifecycle:lifecycle-runtime-compose:2.6.1") - - //icons - implementation("androidx.compose.material:material-icons-extended:1.5.0") - - - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") -} - -kapt { - correctErrorTypes = true -} \ No newline at end of file diff --git a/nym-vpn/android/app/objectbox-models/default.json b/nym-vpn/android/app/objectbox-models/default.json deleted file mode 100644 index dd7a8ab78e..0000000000 --- a/nym-vpn/android/app/objectbox-models/default.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", - "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", - "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", - "entities": [ - { - "id": "1:2692736974585027589", - "lastPropertyId": "15:5057486545428188436", - "name": "TunnelConfig", - "properties": [ - { - "id": "1:1985347930017457084", - "name": "id", - "type": 6, - "flags": 1 - }, - { - "id": "12:2409068226744965585", - "name": "name", - "indexId": "1:4811206443952699137", - "type": 9, - "flags": 34848 - }, - { - "id": "13:8987443291286312275", - "name": "wgQuick", - "type": 9 - } - ], - "relations": [] - }, - { - "id": "2:8887605597748372702", - "lastPropertyId": "9:4468844863383145378", - "name": "Settings", - "properties": [ - { - "id": "1:7485739868216068651", - "name": "id", - "type": 6, - "flags": 1 - }, - { - "id": "2:5814013113141456749", - "name": "isAutoTunnelEnabled", - "type": 1 - }, - { - "id": "4:5645665441196906014", - "name": "trustedNetworkSSIDs", - "type": 30 - }, - { - "id": "5:4989886999117763881", - "name": "isTunnelOnMobileDataEnabled", - "type": 1 - }, - { - "id": "6:3370284381040192129", - "name": "defaultTunnel", - "type": 9 - }, - { - "id": "9:4468844863383145378", - "name": "isAlwaysOnVpnEnabled", - "type": 1 - } - ], - "relations": [] - } - ], - "lastEntityId": "2:8887605597748372702", - "lastIndexId": "1:4811206443952699137", - "lastRelationId": "0:0", - "lastSequenceId": "0:0", - "modelVersion": 5, - "modelVersionParserMinimum": 5, - "retiredEntityUids": [], - "retiredIndexUids": [], - "retiredPropertyUids": [ - 1763475292291320186, - 6483820955437198310, - 8323071516033820771, - 5904440563612311217, - 1408037976996390989, - 7737847485212546994, - 8215616901775229364, - 8021610768066328637, - 6174306582797008721, - 2175939938544485767, - 7555225587864607050, - 969146862000617878, - 5057486545428188436, - 2814640993034665120, - 4981008812459251156 - ], - "retiredRelationUids": [], - "version": 1 -} \ No newline at end of file diff --git a/nym-vpn/android/app/objectbox-models/default.json.bak b/nym-vpn/android/app/objectbox-models/default.json.bak deleted file mode 100644 index d4084866ef..0000000000 --- a/nym-vpn/android/app/objectbox-models/default.json.bak +++ /dev/null @@ -1,94 +0,0 @@ -{ - "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", - "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", - "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", - "entities": [ - { - "id": "1:2692736974585027589", - "lastPropertyId": "15:5057486545428188436", - "name": "TunnelConfig", - "properties": [ - { - "id": "1:1985347930017457084", - "name": "id", - "type": 6, - "flags": 1 - }, - { - "id": "12:2409068226744965585", - "name": "name", - "indexId": "1:4811206443952699137", - "type": 9, - "flags": 34848 - }, - { - "id": "13:8987443291286312275", - "name": "wgQuick", - "type": 9 - } - ], - "relations": [] - }, - { - "id": "2:8887605597748372702", - "lastPropertyId": "8:4981008812459251156", - "name": "Settings", - "properties": [ - { - "id": "1:7485739868216068651", - "name": "id", - "type": 6, - "flags": 1 - }, - { - "id": "2:5814013113141456749", - "name": "isAutoTunnelEnabled", - "type": 1 - }, - { - "id": "4:5645665441196906014", - "name": "trustedNetworkSSIDs", - "type": 30 - }, - { - "id": "5:4989886999117763881", - "name": "isTunnelOnMobileDataEnabled", - "type": 1 - }, - { - "id": "6:3370284381040192129", - "name": "defaultTunnel", - "type": 9 - } - ], - "relations": [] - } - ], - "lastEntityId": "2:8887605597748372702", - "lastIndexId": "1:4811206443952699137", - "lastRelationId": "0:0", - "lastSequenceId": "0:0", - "modelVersion": 5, - "modelVersionParserMinimum": 5, - "retiredEntityUids": [], - "retiredIndexUids": [], - "retiredPropertyUids": [ - 1763475292291320186, - 6483820955437198310, - 8323071516033820771, - 5904440563612311217, - 1408037976996390989, - 7737847485212546994, - 8215616901775229364, - 8021610768066328637, - 6174306582797008721, - 2175939938544485767, - 7555225587864607050, - 969146862000617878, - 5057486545428188436, - 2814640993034665120, - 4981008812459251156 - ], - "retiredRelationUids": [], - "version": 1 -} \ No newline at end of file diff --git a/nym-vpn/android/app/proguard-rules.pro b/nym-vpn/android/app/proguard-rules.pro deleted file mode 100644 index 481bb43481..0000000000 --- a/nym-vpn/android/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/nym-vpn/android/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt b/nym-vpn/android/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt deleted file mode 100644 index c006861187..0000000000 --- a/nym-vpn/android/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package net.nymtech.nymconnect - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("net.nymtech.nymconnect", appContext.packageName) - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/AndroidManifest.xml b/nym-vpn/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 2ff4f063bb..0000000000 --- a/nym-vpn/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/ic_launcher-playstore.png b/nym-vpn/android/app/src/main/ic_launcher-playstore.png deleted file mode 100644 index e5d8e99564658add3373147cb1504f3eb1e9776f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39338 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 UitnrlZu;iLF&ndYM?E6{2jO2F=>Px# diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt deleted file mode 100644 index c34ccaa493..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt +++ /dev/null @@ -1,6 +0,0 @@ -package net.nymtech.nymconnect - -object Constants { - const val VPN_CONNECTIVITY_CHECK_INTERVAL = 3000L; - const val VPN_STATISTIC_CHECK_INTERVAL = 10000L; -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt deleted file mode 100644 index f0d53e5162..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt +++ /dev/null @@ -1,27 +0,0 @@ -package net.nymtech.nymconnect - -import android.app.Application -import android.content.Context -import android.content.pm.PackageManager -import net.nymtech.nymconnect.repository.Repository -import net.nymtech.nymconnect.service.tunnel.model.Settings -import dagger.hilt.android.HiltAndroidApp -import javax.inject.Inject - -@HiltAndroidApp -class WireGuardAutoTunnel : Application() { - - @Inject - lateinit var settingsRepo : Repository - - override fun onCreate() { - super.onCreate() - settingsRepo.init() - } - - companion object { - fun isRunningOnAndroidTv(context : Context) : Boolean { - return context.packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK) - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt deleted file mode 100644 index 032232369b..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt +++ /dev/null @@ -1,40 +0,0 @@ -package net.nymtech.nymconnect.module - -import android.content.Context -import net.nymtech.nymconnect.service.tunnel.model.MyObjectBox -import net.nymtech.nymconnect.service.tunnel.model.Settings -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.components.SingletonComponent -import io.objectbox.Box -import io.objectbox.BoxStore -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -class BoxModule { - - @Provides - @Singleton - fun provideBoxStore(@ApplicationContext context : Context) : BoxStore { - return MyObjectBox.builder() - .androidContext(context.applicationContext) - .build() - } - - @Provides - @Singleton - fun provideBoxForSettings(store : BoxStore) : Box { - return store.boxFor(Settings::class.java) - } - - @Provides - @Singleton - fun provideBoxForTunnels(store : BoxStore) : Box { - return store.boxFor(TunnelConfig::class.java) - } - -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt deleted file mode 100644 index e402249cba..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt +++ /dev/null @@ -1,25 +0,0 @@ -package net.nymtech.nymconnect.module - -import net.nymtech.nymconnect.repository.Repository -import net.nymtech.nymconnect.repository.SettingsBox -import net.nymtech.nymconnect.repository.TunnelBox -import net.nymtech.nymconnect.service.tunnel.model.Settings -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import dagger.Binds -import dagger.Module -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -abstract class RepositoryModule { - - @Binds - @Singleton - abstract fun provideSettingsRepository(settingsBox: SettingsBox) : Repository - - @Binds - @Singleton - abstract fun provideTunnelRepository(tunnelBox: TunnelBox) : Repository -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt deleted file mode 100644 index fa043ec549..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt +++ /dev/null @@ -1,29 +0,0 @@ -package net.nymtech.nymconnect.module - -import net.nymtech.nymconnect.service.network.MobileDataService -import net.nymtech.nymconnect.service.network.NetworkService -import net.nymtech.nymconnect.service.network.WifiService -import net.nymtech.nymconnect.service.notification.NotificationService -import net.nymtech.nymconnect.service.notification.WireGuardNotification -import dagger.Binds -import dagger.Module -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ServiceComponent -import dagger.hilt.android.scopes.ServiceScoped - -@Module -@InstallIn(ServiceComponent::class) -abstract class ServiceModule { - - @Binds - @ServiceScoped - abstract fun provideNotificationService(wireGuardNotification: WireGuardNotification) : NotificationService - - @Binds - @ServiceScoped - abstract fun provideWifiService(wifiService: WifiService) : NetworkService - - @Binds - @ServiceScoped - abstract fun provideMobileDataService(mobileDataService : MobileDataService) : NetworkService -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt deleted file mode 100644 index b5962a39d9..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt +++ /dev/null @@ -1,31 +0,0 @@ -package net.nymtech.nymconnect.module - -import android.content.Context -import com.wireguard.android.backend.Backend -import com.wireguard.android.backend.GoBackend -import net.nymtech.nymconnect.service.tunnel.VpnService -import net.nymtech.nymconnect.service.tunnel.WireGuardTunnel -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -class TunnelModule { - - @Provides - @Singleton - fun provideBackend(@ApplicationContext context : Context) : Backend { - return GoBackend(context) - } - - @Provides - @Singleton - fun provideVpnService(backend: Backend) : VpnService { - return WireGuardTunnel(backend) - } - -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/BootReceiver.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/BootReceiver.kt deleted file mode 100644 index 8fcf823c4f..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/BootReceiver.kt +++ /dev/null @@ -1,39 +0,0 @@ -package net.nymtech.nymconnect.receiver - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import net.nymtech.nymconnect.repository.Repository -import net.nymtech.nymconnect.service.foreground.ServiceManager -import net.nymtech.nymconnect.service.tunnel.model.Settings -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.cancel -import kotlinx.coroutines.launch -import javax.inject.Inject - -@AndroidEntryPoint -class BootReceiver : BroadcastReceiver() { - - @Inject - lateinit var settingsRepo : Repository - - override fun onReceive(context: Context, intent: Intent) { - if (intent.action == Intent.ACTION_BOOT_COMPLETED) { - CoroutineScope(Dispatchers.IO).launch { - try { - val settings = settingsRepo.getAll() - if (!settings.isNullOrEmpty()) { - val setting = settings.first() - if (setting.isAutoTunnelEnabled && setting.defaultTunnel != null) { - ServiceManager.startWatcherService(context, setting.defaultTunnel!!) - } - } - } finally { - cancel() - } - } - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/NotificationActionReceiver.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/NotificationActionReceiver.kt deleted file mode 100644 index 97033a8f63..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/NotificationActionReceiver.kt +++ /dev/null @@ -1,39 +0,0 @@ -package net.nymtech.nymconnect.receiver - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import net.nymtech.nymconnect.repository.Repository -import net.nymtech.nymconnect.service.foreground.ServiceManager -import net.nymtech.nymconnect.service.tunnel.model.Settings -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.cancel -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import javax.inject.Inject - -@AndroidEntryPoint -class NotificationActionReceiver : BroadcastReceiver() { - - @Inject - lateinit var settingsRepo : Repository - override fun onReceive(context: Context, intent: Intent?) { - CoroutineScope(Dispatchers.IO).launch { - try { - val settings = settingsRepo.getAll() - if (!settings.isNullOrEmpty()) { - val setting = settings.first() - if (setting.defaultTunnel != null) { - ServiceManager.stopVpnService(context) - delay(1000) - ServiceManager.startVpnService(context, setting.defaultTunnel.toString()) - } - } - } finally { - cancel() - } - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt deleted file mode 100644 index 187957132c..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt +++ /dev/null @@ -1,16 +0,0 @@ -package net.nymtech.nymconnect.repository - -import kotlinx.coroutines.flow.Flow - -interface Repository { - suspend fun save(t : T) - suspend fun saveAll(t : List) - suspend fun getById(id : Long) : T? - suspend fun getAll() : List? - suspend fun delete(t : T) : Boolean? - suspend fun count() : Long? - - val itemFlow : Flow> - - fun init() -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt deleted file mode 100644 index f56247463c..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt +++ /dev/null @@ -1,63 +0,0 @@ -package net.nymtech.nymconnect.repository - -import net.nymtech.nymconnect.service.tunnel.model.Settings -import io.objectbox.Box -import io.objectbox.BoxStore -import io.objectbox.kotlin.awaitCallInTx -import io.objectbox.kotlin.toFlow -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.launch -import javax.inject.Inject - - -class SettingsBox @Inject constructor(private val box : Box, private val boxStore : BoxStore) : Repository { - - @OptIn(ExperimentalCoroutinesApi::class) - override val itemFlow = box.query().build().subscribe().toFlow() - - override fun init() { - CoroutineScope(Dispatchers.IO).launch { - if(getAll().isNullOrEmpty()) { - save(Settings()) - } - } - } - - override suspend fun save(t : Settings) { - boxStore.awaitCallInTx { - box.put(t) - } - } - - override suspend fun saveAll(t : List) { - boxStore.awaitCallInTx { - box.put(t) - } - } - - override suspend fun getById(id: Long): Settings? { - return boxStore.awaitCallInTx { - box[id] - } - } - - override suspend fun getAll(): List? { - return boxStore.awaitCallInTx { - box.all - } - } - - override suspend fun delete(t : Settings): Boolean? { - return boxStore.awaitCallInTx { - box.remove(t) - } - } - - override suspend fun count() : Long? { - return boxStore.awaitCallInTx { - box.count() - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt deleted file mode 100644 index c57621d53c..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt +++ /dev/null @@ -1,57 +0,0 @@ -package net.nymtech.nymconnect.repository - -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import io.objectbox.Box -import io.objectbox.BoxStore -import io.objectbox.kotlin.awaitCallInTx -import io.objectbox.kotlin.toFlow -import kotlinx.coroutines.ExperimentalCoroutinesApi -import timber.log.Timber -import javax.inject.Inject - -class TunnelBox @Inject constructor(private val box : Box,private val boxStore : BoxStore) : Repository { - - @OptIn(ExperimentalCoroutinesApi::class) - override val itemFlow = box.query().build().subscribe().toFlow() - override fun init() { - - } - - override suspend fun save(t : TunnelConfig) { - Timber.d("Saving tunnel config") - boxStore.awaitCallInTx { - box.put(t) - } - - } - - override suspend fun saveAll(t : List) { - boxStore.awaitCallInTx { - box.put(t) - } - } - - override suspend fun getById(id: Long): TunnelConfig? { - return boxStore.awaitCallInTx { - box[id] - } - } - - override suspend fun getAll(): List? { - return boxStore.awaitCallInTx { - box.all - } - } - - override suspend fun delete(t : TunnelConfig): Boolean? { - return boxStore.awaitCallInTx { - box.remove(t) - } - } - - override suspend fun count() : Long? { - return boxStore.awaitCallInTx { - box.count() - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt deleted file mode 100644 index ba4f930b12..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt +++ /dev/null @@ -1,6 +0,0 @@ -package net.nymtech.nymconnect.service.foreground - -enum class Action { - START, - STOP -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt deleted file mode 100644 index 9aaf0b93d8..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt +++ /dev/null @@ -1,64 +0,0 @@ -package net.nymtech.nymconnect.service.foreground - -import android.app.Service -import android.content.Intent -import android.os.Bundle -import android.os.IBinder -import timber.log.Timber - - -open class ForegroundService : Service() { - - private var isServiceStarted = false - - override fun onBind(intent: Intent): IBinder? { - // We don't provide binding, so return null - return null - } - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - Timber.d("onStartCommand executed with startId: $startId") - if (intent != null) { - val action = intent.action - Timber.d("using an intent with action $action") - when (action) { - Action.START.name -> startService(intent.extras) - Action.STOP.name -> stopService(intent.extras) - "android.net.VpnService" -> { - Timber.d("Always-on VPN starting service") - startService(intent.extras) - } - else -> Timber.d("This should never happen. No action in the received intent") - } - } else { - Timber.d( - "with a null intent. It has been probably restarted by the system." - ) - } - // by returning this we make sure the service is restarted if the system kills the service - return START_STICKY - } - - - override fun onDestroy() { - super.onDestroy() - Timber.d("The service has been destroyed") - } - - protected open fun startService(extras : Bundle?) { - if (isServiceStarted) return - Timber.d("Starting ${this.javaClass.simpleName}") - isServiceStarted = true - } - - protected open fun stopService(extras : Bundle?) { - Timber.d("Stopping ${this.javaClass.simpleName}") - try { - stopForeground(STOP_FOREGROUND_REMOVE) - stopSelf() - } catch (e: Exception) { - Timber.d("Service stopped without being started: ${e.message}") - } - isServiceStarted = false - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceManager.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceManager.kt deleted file mode 100644 index c00a796453..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceManager.kt +++ /dev/null @@ -1,90 +0,0 @@ -package net.nymtech.nymconnect.service.foreground - -import android.app.ActivityManager -import android.app.Application -import android.app.Service -import android.content.Context -import android.content.Context.ACTIVITY_SERVICE -import android.content.Intent -import net.nymtech.nymconnect.R -import timber.log.Timber - -object ServiceManager { - @Suppress("DEPRECATION") - private // Deprecated for third party Services. - fun Context.isServiceRunning(service: Class) = - (getSystemService(ACTIVITY_SERVICE) as ActivityManager) - .getRunningServices(Integer.MAX_VALUE) - .any { it.service.className == service.name } - - fun getServiceState(context: Context, cls : Class): ServiceState { - val isServiceRunning = context.isServiceRunning(cls) - return if(isServiceRunning) ServiceState.STARTED else ServiceState.STOPPED - } - - private fun actionOnService(action: Action, context: Context, cls : Class, extras : Map? = null) { - if (getServiceState(context, cls) == ServiceState.STOPPED && action == Action.STOP) return - if (getServiceState(context, cls) == ServiceState.STARTED && action == Action.START) return - val intent = Intent(context, cls).also { - it.action = action.name - extras?.forEach {(k, v) -> - it.putExtra(k, v) - } - } - intent.component?.javaClass - try { - when(action) { - Action.START -> { - try { - context.startForegroundService(intent) - } catch (e : Exception) { - Timber.e("Unable to start service foreground ${e.message}") - context.startService(intent) - } - } - Action.STOP -> context.startService(intent) - } - } catch (e : Exception) { - Timber.tag("ServiceManager").e(e) - } - } - - fun startVpnService(context : Context, tunnelConfig : String) { - actionOnService( - Action.START, - context, - WireGuardTunnelService::class.java, - mapOf(context.getString(R.string.tunnel_extras_key) to tunnelConfig)) - } - fun stopVpnService(context : Context) { - actionOnService( - Action.STOP, - context, - WireGuardTunnelService::class.java - ) - } - - fun startWatcherService(context : Context, tunnelConfig : String) { - actionOnService( - Action.START, context, - WireGuardConnectivityWatcherService::class.java, mapOf(context. - getString(R.string.tunnel_extras_key) to - tunnelConfig)) - } - - fun stopWatcherService(context : Context) { - actionOnService( - Action.STOP, context, - WireGuardConnectivityWatcherService::class.java) - } - - fun toggleWatcherService(context: Context, tunnelConfig : String) { - when(getServiceState( - context, - WireGuardConnectivityWatcherService::class.java, - )) { - ServiceState.STARTED -> stopWatcherService(context) - ServiceState.STOPPED -> startWatcherService(context, tunnelConfig) - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt deleted file mode 100644 index 9c26fa0795..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt +++ /dev/null @@ -1,6 +0,0 @@ -package net.nymtech.nymconnect.service.foreground - -enum class ServiceState { - STARTED, - STOPPED, -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt deleted file mode 100644 index fcfa811ea2..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt +++ /dev/null @@ -1,210 +0,0 @@ -package net.nymtech.nymconnect.service.foreground - -import android.app.AlarmManager -import android.app.PendingIntent -import android.content.Context -import android.content.Intent -import android.os.Bundle -import android.os.PowerManager -import android.os.SystemClock -import com.wireguard.android.backend.Tunnel -import net.nymtech.nymconnect.Constants -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.repository.Repository -import net.nymtech.nymconnect.service.network.MobileDataService -import net.nymtech.nymconnect.service.network.NetworkService -import net.nymtech.nymconnect.service.network.NetworkStatus -import net.nymtech.nymconnect.service.network.WifiService -import net.nymtech.nymconnect.service.notification.NotificationService -import net.nymtech.nymconnect.service.tunnel.VpnService -import net.nymtech.nymconnect.service.tunnel.model.Settings -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import timber.log.Timber -import javax.inject.Inject - -@AndroidEntryPoint -class WireGuardConnectivityWatcherService : ForegroundService() { - - private val foregroundId = 122; - - @Inject - lateinit var wifiService : NetworkService - - @Inject - lateinit var mobileDataService : NetworkService - - @Inject - lateinit var settingsRepo: Repository - - @Inject - lateinit var notificationService : NotificationService - - @Inject - lateinit var vpnService : VpnService - - private var isWifiConnected = false; - private var isMobileDataConnected = false; - private var currentNetworkSSID = ""; - - private lateinit var watcherJob : Job; - private lateinit var setting : Settings - private lateinit var tunnelConfig: String - - private var wakeLock: PowerManager.WakeLock? = null - private val tag = this.javaClass.name; - - - override fun startService(extras: Bundle?) { - super.startService(extras) - val tunnelId = extras?.getString(getString(R.string.tunnel_extras_key)) - if (tunnelId != null) { - this.tunnelConfig = tunnelId - } - // we need this lock so our service gets not affected by Doze Mode - initWakeLock() - cancelWatcherJob() - launchWatcherNotification() - if(this::tunnelConfig.isInitialized) { - startWatcherJob() - } else { - stopService(extras) - } - } - - override fun stopService(extras: Bundle?) { - super.stopService(extras) - wakeLock?.let { - if (it.isHeld) { - it.release() - } - } - cancelWatcherJob() - stopSelf() - } - - private fun launchWatcherNotification() { - val notification = notificationService.createNotification( - channelId = getString(R.string.watcher_channel_id), - channelName = getString(R.string.watcher_channel_name), - description = getString(R.string.watcher_notification_text)) - super.startForeground(foregroundId, notification) - } - - //try to start task again if killed - override fun onTaskRemoved(rootIntent: Intent) { - Timber.d("Task Removed called") - val restartServiceIntent = Intent(rootIntent) - val restartServicePendingIntent: PendingIntent = PendingIntent.getService(this, 1, restartServiceIntent, - PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE); - applicationContext.getSystemService(Context.ALARM_SERVICE); - val alarmService: AlarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager; - alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent); - } - - private fun initWakeLock() { - wakeLock = - (getSystemService(Context.POWER_SERVICE) as PowerManager).run { - newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "$tag::lock").apply { - acquire() - } - } - } - - private fun cancelWatcherJob() { - if(this::watcherJob.isInitialized) { - watcherJob.cancel() - } - } - - private fun startWatcherJob() { - watcherJob = CoroutineScope(Dispatchers.IO).launch { - val settings = settingsRepo.getAll(); - if(!settings.isNullOrEmpty()) { - setting = settings[0] - } - launch { - watchForWifiConnectivityChanges() - } - if(setting.isTunnelOnMobileDataEnabled) { - launch { - watchForMobileDataConnectivityChanges() - } - } - launch { - manageVpn() - } - } - } - - private suspend fun watchForMobileDataConnectivityChanges() { - mobileDataService.networkStatus.collect { - when(it) { - is NetworkStatus.Available -> { - Timber.d("Gained Mobile data connection") - isMobileDataConnected = true - } - is NetworkStatus.CapabilitiesChanged -> { - isMobileDataConnected = true - Timber.d("Mobile data capabilities changed") - } - is NetworkStatus.Unavailable -> { - isMobileDataConnected = false - Timber.d("Lost mobile data connection") - } - - else -> {} - } - } - } - - private suspend fun watchForWifiConnectivityChanges() { - wifiService.networkStatus.collect { - when (it) { - is NetworkStatus.Available -> { - Timber.d("Gained Wi-Fi connection") - isWifiConnected = true - } - is NetworkStatus.CapabilitiesChanged -> { - Timber.d("Wifi capabilities changed") - isWifiConnected = true - currentNetworkSSID = wifiService.getNetworkName(it.networkCapabilities) ?: ""; - } - is NetworkStatus.Unavailable -> { - isWifiConnected = false - Timber.d("Lost Wi-Fi connection") - } - - else -> {} - } - } - } - - private suspend fun manageVpn() { - while(watcherJob.isActive) { - if(setting.isTunnelOnMobileDataEnabled && - !isWifiConnected && - isMobileDataConnected - && vpnService.getState() == Tunnel.State.DOWN) { - ServiceManager.startVpnService(this, tunnelConfig) - } else if(!setting.isTunnelOnMobileDataEnabled && - !isWifiConnected && - vpnService.getState() == Tunnel.State.UP) { - ServiceManager.stopVpnService(this) - } else if(isWifiConnected && - !setting.trustedNetworkSSIDs.contains(currentNetworkSSID) && - (vpnService.getState() != Tunnel.State.UP)) { - ServiceManager.startVpnService(this, tunnelConfig) - } else if((isWifiConnected && - setting.trustedNetworkSSIDs.contains(currentNetworkSSID)) && - (vpnService.getState() == Tunnel.State.UP)) { - ServiceManager.stopVpnService(this) - } - delay(Constants.VPN_CONNECTIVITY_CHECK_INTERVAL) - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt deleted file mode 100644 index 776928e649..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt +++ /dev/null @@ -1,154 +0,0 @@ -package net.nymtech.nymconnect.service.foreground - -import android.app.PendingIntent -import android.content.Intent -import android.os.Bundle -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.receiver.NotificationActionReceiver -import net.nymtech.nymconnect.repository.Repository -import net.nymtech.nymconnect.service.notification.NotificationService -import net.nymtech.nymconnect.service.tunnel.HandshakeStatus -import net.nymtech.nymconnect.service.tunnel.VpnService -import net.nymtech.nymconnect.service.tunnel.model.Settings -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.launch -import timber.log.Timber -import javax.inject.Inject - -@AndroidEntryPoint -class WireGuardTunnelService : ForegroundService() { - - private val foregroundId = 123; - - @Inject - lateinit var vpnService : VpnService - - @Inject - lateinit var settingsRepo: Repository - - @Inject - lateinit var notificationService : NotificationService - - private lateinit var job : Job - - private var tunnelName : String = "" - - override fun startService(extras : Bundle?) { - super.startService(extras) - val tunnelConfigString = extras?.getString(getString(R.string.tunnel_extras_key)) - cancelJob() - job = CoroutineScope(Dispatchers.IO).launch { - if(tunnelConfigString != null) { - try { - val tunnelConfig = TunnelConfig.from(tunnelConfigString) - tunnelName = tunnelConfig.name - vpnService.startTunnel(tunnelConfig) - launchVpnStartingNotification() - } catch (e : Exception) { - Timber.e("Problem starting tunnel: ${e.message}") - stopService(extras) - } - } else { - Timber.d("Tunnel config null, starting default tunnel") - val settings = settingsRepo.getAll(); - if(!settings.isNullOrEmpty()) { - val setting = settings[0] - if(setting.defaultTunnel != null && setting.isAlwaysOnVpnEnabled) { - val tunnelConfig = TunnelConfig.from(setting.defaultTunnel!!) - tunnelName = tunnelConfig.name - vpnService.startTunnel(tunnelConfig) - launchVpnStartingNotification() - } - } - } - } - CoroutineScope(job).launch { - var didShowConnected = false - var didShowFailedHandshakeNotification = false - vpnService.handshakeStatus.collect { - when(it) { - HandshakeStatus.NOT_STARTED -> { - } - HandshakeStatus.NEVER_CONNECTED -> { - if(!didShowFailedHandshakeNotification) { - launchVpnConnectionFailedNotification(getString(R.string.initial_connection_failure_message)) - didShowFailedHandshakeNotification = true - didShowConnected = false - } - } - HandshakeStatus.HEALTHY -> { - if(!didShowConnected) { - launchVpnConnectedNotification() - didShowConnected = true - } - } - HandshakeStatus.UNHEALTHY -> { - if(!didShowFailedHandshakeNotification) { - launchVpnConnectionFailedNotification(getString(R.string.lost_connection_failure_message)) - didShowFailedHandshakeNotification = true - didShowConnected = false - } - } - } - } - } - } - - override fun stopService(extras : Bundle?) { - super.stopService(extras) - CoroutineScope(Dispatchers.IO).launch() { - vpnService.stopTunnel() - } - cancelJob() - stopSelf() - } - - private fun launchVpnConnectedNotification() { - val notification = notificationService.createNotification( - channelId = getString(R.string.vpn_channel_id), - channelName = getString(R.string.vpn_channel_name), - title = getString(R.string.tunnel_start_title), - onGoing = false, - showTimestamp = true, - description = "${getString(R.string.tunnel_start_text)} $tunnelName" - ) - super.startForeground(foregroundId, notification) - } - - private fun launchVpnStartingNotification() { - val notification = notificationService.createNotification( - channelId = getString(R.string.vpn_channel_id), - channelName = getString(R.string.vpn_channel_name), - title = getString(R.string.vpn_starting), - onGoing = false, - showTimestamp = true, - description = getString(R.string.attempt_connection) - ) - super.startForeground(foregroundId, notification) - } - - private fun launchVpnConnectionFailedNotification(message : String) { - val notification = notificationService.createNotification( - channelId = getString(R.string.vpn_channel_id), - channelName = getString(R.string.vpn_channel_name), - action = PendingIntent.getBroadcast(this,0,Intent(this, NotificationActionReceiver::class.java),PendingIntent.FLAG_IMMUTABLE), - actionText = getString(R.string.restart), - title = getString(R.string.vpn_connection_failed), - onGoing = false, - showTimestamp = true, - description = message - ) - super.startForeground(foregroundId, notification) - } - - - private fun cancelJob() { - if(this::job.isInitialized) { - job.cancel() - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt deleted file mode 100644 index 9574d659ef..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt +++ /dev/null @@ -1,117 +0,0 @@ -package net.nymtech.nymconnect.service.network - -import android.content.Context -import android.net.ConnectivityManager -import android.net.Network -import android.net.NetworkCapabilities -import android.net.NetworkRequest -import android.net.wifi.SupplicantState -import android.net.wifi.WifiInfo -import android.net.wifi.WifiManager -import android.os.Build -import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.flow.map - - -abstract class BaseNetworkService>(val context: Context, networkCapability : Int) : NetworkService { - private val connectivityManager = - context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - - private val wifiManager = - context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager - - override val networkStatus = callbackFlow { - val networkStatusCallback = when (Build.VERSION.SDK_INT) { - in Build.VERSION_CODES.S..Int.MAX_VALUE -> { - object : ConnectivityManager.NetworkCallback( - FLAG_INCLUDE_LOCATION_INFO - ) { - override fun onAvailable(network: Network) { - trySend(NetworkStatus.Available(network)) - } - - override fun onLost(network: Network) { - trySend(NetworkStatus.Unavailable(network)) - } - - override fun onCapabilitiesChanged( - network: Network, - networkCapabilities: NetworkCapabilities - ) { - trySend(NetworkStatus.CapabilitiesChanged(network, networkCapabilities)) - } - } - } - - else -> { - object : ConnectivityManager.NetworkCallback() { - - override fun onAvailable(network: Network) { - trySend(NetworkStatus.Available(network)) - } - - override fun onLost(network: Network) { - trySend(NetworkStatus.Unavailable(network)) - } - - override fun onCapabilitiesChanged( - network: Network, - networkCapabilities: NetworkCapabilities - ) { - trySend(NetworkStatus.CapabilitiesChanged(network, networkCapabilities)) - } - } - } - } - val request = NetworkRequest.Builder() - .addTransportType(networkCapability) - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) - .build() - connectivityManager.registerNetworkCallback(request, networkStatusCallback) - - awaitClose { - connectivityManager.unregisterNetworkCallback(networkStatusCallback) - } - } - - - override fun getNetworkName(networkCapabilities: NetworkCapabilities): String? { - var ssid: String? = getWifiNameFromCapabilities(networkCapabilities) - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { - val info = wifiManager.connectionInfo - if (info.supplicantState === SupplicantState.COMPLETED) { - ssid = info.ssid - } - } - return ssid?.trim('"') - } - - - companion object { - private fun getWifiNameFromCapabilities(networkCapabilities: NetworkCapabilities): String? { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - val info: WifiInfo - if (networkCapabilities.transportInfo is WifiInfo) { - info = networkCapabilities.transportInfo as WifiInfo - return info.ssid - } - } - return null - } - } -} - -inline fun Flow.map( - crossinline onUnavailable: suspend (network : Network) -> Result, - crossinline onAvailable: suspend (network : Network) -> Result, - crossinline onCapabilitiesChanged: suspend (network : Network, networkCapabilities : NetworkCapabilities) -> Result, -): Flow = map { status -> - when (status) { - is NetworkStatus.Unavailable -> onUnavailable(status.network) - is NetworkStatus.Available -> onAvailable(status.network) - is NetworkStatus.CapabilitiesChanged -> onCapabilitiesChanged(status.network, status.networkCapabilities) - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt deleted file mode 100644 index a067af06cf..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt +++ /dev/null @@ -1,10 +0,0 @@ -package net.nymtech.nymconnect.service.network - -import android.content.Context -import android.net.NetworkCapabilities -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject - -class MobileDataService @Inject constructor(@ApplicationContext context: Context) : - BaseNetworkService(context, NetworkCapabilities.TRANSPORT_CELLULAR) { -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt deleted file mode 100644 index 6c274dab03..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt +++ /dev/null @@ -1,10 +0,0 @@ -package net.nymtech.nymconnect.service.network - -import android.net.NetworkCapabilities -import kotlinx.coroutines.flow.Flow - -interface NetworkService { - fun getNetworkName(networkCapabilities: NetworkCapabilities) : String? - val networkStatus : Flow - -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt deleted file mode 100644 index 5446ce52a6..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt +++ /dev/null @@ -1,10 +0,0 @@ -package net.nymtech.nymconnect.service.network - -import android.net.Network -import android.net.NetworkCapabilities - -sealed class NetworkStatus { - class Available(val network : Network) : NetworkStatus() - class Unavailable(val network : Network) : NetworkStatus() - class CapabilitiesChanged(val network : Network, val networkCapabilities : NetworkCapabilities) : NetworkStatus() -} diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt deleted file mode 100644 index a01ebba746..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt +++ /dev/null @@ -1,10 +0,0 @@ -package net.nymtech.nymconnect.service.network - -import android.content.Context -import android.net.NetworkCapabilities -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject - -class WifiService @Inject constructor(@ApplicationContext context: Context) : - BaseNetworkService(context, NetworkCapabilities.TRANSPORT_WIFI) { -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt deleted file mode 100644 index 4071e64202..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt +++ /dev/null @@ -1,21 +0,0 @@ -package net.nymtech.nymconnect.service.notification - -import android.app.Notification -import android.app.NotificationManager -import android.app.PendingIntent - -interface NotificationService { - fun createNotification( - channelId: String, - channelName: String, - title: String = "", - action: PendingIntent? = null, - actionText: String? = null, - description: String, - showTimestamp : Boolean = false, - importance: Int = NotificationManager.IMPORTANCE_HIGH, - vibration: Boolean = true, - onGoing: Boolean = true, - lights: Boolean = true - ): Notification -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt deleted file mode 100644 index 4e4cdb3e1b..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt +++ /dev/null @@ -1,77 +0,0 @@ -package net.nymtech.nymconnect.service.notification - -import android.app.Notification -import android.app.NotificationChannel -import android.app.NotificationManager -import android.app.PendingIntent -import android.content.Context -import android.content.Intent -import android.graphics.Color -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.ui.MainActivity -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject - -class WireGuardNotification @Inject constructor(@ApplicationContext private val context: Context) : NotificationService { - - private val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager; - - override fun createNotification( - channelId: String, - channelName: String, - title: String, - action: PendingIntent?, - actionText: String?, - description: String, - showTimestamp: Boolean, - importance: Int, - vibration: Boolean, - onGoing: Boolean, - lights: Boolean - ): Notification { - val channel = NotificationChannel( - channelId, - channelName, - importance - ).let { - it.description = title - it.enableLights(lights) - it.lightColor = Color.RED - it.enableVibration(vibration) - it.vibrationPattern = longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400) - it - } - notificationManager.createNotificationChannel(channel) - val pendingIntent: PendingIntent = - Intent(context, MainActivity::class.java).let { notificationIntent -> - PendingIntent.getActivity( - context, - 0, - notificationIntent, - PendingIntent.FLAG_IMMUTABLE - ) - } - - val builder: Notification.Builder = - Notification.Builder( - context, - channelId - ) - return builder.let { - if(action != null && actionText != null) { - //TODO find a not deprecated way to do this - it.addAction( - Notification.Action.Builder(0, actionText, action) - .build()) - it.setAutoCancel(true) - } - it.setContentTitle(title) - .setContentText(description) - .setContentIntent(pendingIntent) - .setOngoing(onGoing) - .setShowWhen(showTimestamp) - .setSmallIcon(R.mipmap.ic_launcher_foreground) - .build() - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsActivity.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsActivity.kt deleted file mode 100644 index c88825e71e..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsActivity.kt +++ /dev/null @@ -1,28 +0,0 @@ -package net.nymtech.nymconnect.service.shortcut - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.service.foreground.Action -import net.nymtech.nymconnect.service.foreground.ServiceManager -import net.nymtech.nymconnect.service.foreground.WireGuardTunnelService -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class ShortcutsActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - if(intent.getStringExtra(ShortcutsManager.CLASS_NAME_EXTRA_KEY) - .equals(WireGuardTunnelService::class.java.name)) { - intent.getStringExtra(getString(R.string.tunnel_extras_key))?.let { - ServiceManager.toggleWatcherService(this, it) - } - when(intent.action){ - Action.STOP.name -> ServiceManager.stopVpnService(this) - Action.START.name -> intent.getStringExtra(getString(R.string.tunnel_extras_key)) - ?.let { ServiceManager.startVpnService(this, it) } - } - } - finish() - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsManager.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsManager.kt deleted file mode 100644 index 13df427ebd..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsManager.kt +++ /dev/null @@ -1,73 +0,0 @@ -package net.nymtech.nymconnect.service.shortcut - -import android.content.Context -import android.content.Intent -import androidx.core.content.pm.ShortcutInfoCompat -import androidx.core.content.pm.ShortcutManagerCompat -import androidx.core.graphics.drawable.IconCompat -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.service.foreground.Action -import net.nymtech.nymconnect.service.foreground.WireGuardTunnelService -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig - -object ShortcutsManager { - - private const val SHORT_LABEL_MAX_SIZE = 10; - private const val LONG_LABEL_MAX_SIZE = 25; - private const val APPEND_ON = " On"; - private const val APPEND_OFF = " Off" - const val CLASS_NAME_EXTRA_KEY = "className" - - private fun createAndPushShortcut(context : Context, intent : Intent, id : String, shortLabel : String, - longLabel : String, drawable : Int ) { - val shortcut = ShortcutInfoCompat.Builder(context, id) - .setShortLabel(shortLabel) - .setLongLabel(longLabel) - .setIcon(IconCompat.createWithResource(context, drawable)) - .setIntent(intent) - .build() - ShortcutManagerCompat.pushDynamicShortcut(context, shortcut) - } - - fun createTunnelShortcuts(context : Context, tunnelConfig : TunnelConfig) { - createAndPushShortcut(context, - createTunnelOnIntent(context, mapOf(context.getString(R.string.tunnel_extras_key) to tunnelConfig.toString())), - tunnelConfig.id.toString() + APPEND_ON, - tunnelConfig.name.take((SHORT_LABEL_MAX_SIZE - APPEND_ON.length)) + APPEND_ON, - tunnelConfig.name.take((LONG_LABEL_MAX_SIZE - APPEND_ON.length)) + APPEND_ON, - R.drawable.vpn_on - ) - createAndPushShortcut(context, - createTunnelOffIntent(context, mapOf(context.getString(R.string.tunnel_extras_key) to tunnelConfig.toString())), - tunnelConfig.id.toString() + APPEND_OFF, - tunnelConfig.name.take((SHORT_LABEL_MAX_SIZE - APPEND_OFF.length)) + APPEND_OFF, - tunnelConfig.name.take((LONG_LABEL_MAX_SIZE - APPEND_OFF.length)) + APPEND_OFF, - R.drawable.vpn_off - ) - } - - fun removeTunnelShortcuts(context : Context, tunnelConfig : TunnelConfig) { - ShortcutManagerCompat.removeDynamicShortcuts(context, listOf(tunnelConfig.id.toString() + APPEND_ON, - tunnelConfig.id.toString() + APPEND_OFF )) - } - - private fun createTunnelOnIntent(context: Context, extras : Map) : Intent { - return Intent(context, ShortcutsActivity::class.java).also { - it.action = Action.START.name - it.putExtra(CLASS_NAME_EXTRA_KEY, WireGuardTunnelService::class.java.name) - extras.forEach {(k, v) -> - it.putExtra(k, v) - } - } - } - - private fun createTunnelOffIntent(context : Context, extras : Map) : Intent { - return Intent(context, ShortcutsActivity::class.java).also { - it.action = Action.STOP.name - it.putExtra(CLASS_NAME_EXTRA_KEY, WireGuardTunnelService::class.java.name) - extras.forEach {(k, v) -> - it.putExtra(k, v) - } - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile/TunnelControlTile.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile/TunnelControlTile.kt deleted file mode 100644 index 38c774c963..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile/TunnelControlTile.kt +++ /dev/null @@ -1,142 +0,0 @@ -package net.nymtech.nymconnect.service.tile - -import android.os.Build -import android.service.quicksettings.Tile -import android.service.quicksettings.TileService -import com.wireguard.android.backend.Tunnel -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.repository.Repository -import net.nymtech.nymconnect.service.foreground.ServiceManager -import net.nymtech.nymconnect.service.tunnel.VpnService -import net.nymtech.nymconnect.service.tunnel.model.Settings -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.cancel -import kotlinx.coroutines.launch -import timber.log.Timber -import javax.inject.Inject - -@AndroidEntryPoint -class TunnelControlTile : TileService() { - - @Inject - lateinit var settingsRepo : Repository - - @Inject - lateinit var configRepo : Repository - - @Inject - lateinit var vpnService : VpnService - - private val scope = CoroutineScope(Dispatchers.Main); - - private lateinit var job : Job - - override fun onStartListening() { - job = scope.launch { - updateTileState() - } - super.onStartListening() - } - - override fun onTileAdded() { - super.onTileAdded() - qsTile.contentDescription = this.resources.getString(R.string.toggle_vpn) - scope.launch { - updateTileState(); - } - } - - override fun onTileRemoved() { - super.onTileRemoved() - cancelJob() - } - - override fun onClick() { - super.onClick() - unlockAndRun { - scope.launch { - try { - val tunnel = determineTileTunnel(); - if(tunnel != null) { - attemptWatcherServiceToggle(tunnel.toString()) - if(vpnService.getState() == Tunnel.State.UP) { - ServiceManager.stopVpnService(this@TunnelControlTile) - } else { - ServiceManager.startVpnService(this@TunnelControlTile, tunnel.toString()) - } - } - } catch (e : Exception) { - Timber.e(e.message) - } finally { - cancel() - } - } - } - } - - private suspend fun determineTileTunnel() : TunnelConfig? { - var tunnelConfig : TunnelConfig? = null; - val settings = settingsRepo.getAll() - if (!settings.isNullOrEmpty()) { - val setting = settings.first() - tunnelConfig = if (setting.defaultTunnel != null) { - TunnelConfig.from(setting.defaultTunnel!!); - } else { - val config = configRepo.getAll()?.first(); - config; - } - } - return tunnelConfig; - } - - - private fun attemptWatcherServiceToggle(tunnelConfig : String) { - scope.launch { - val settings = settingsRepo.getAll() - if (!settings.isNullOrEmpty()) { - val setting = settings.first() - if(setting.isAutoTunnelEnabled) { - ServiceManager.toggleWatcherService(this@TunnelControlTile, tunnelConfig) - } - } - } - } - - private suspend fun updateTileState() { - vpnService.state.collect { - when(it) { - Tunnel.State.UP -> { - qsTile.state = Tile.STATE_ACTIVE - } - Tunnel.State.DOWN -> { - qsTile.state = Tile.STATE_INACTIVE; - } - else -> { - qsTile.state = Tile.STATE_UNAVAILABLE - } - } - val config = determineTileTunnel(); - setTileDescription(config?.name ?: this.resources.getString(R.string.no_tunnel_available)) - qsTile.updateTile() - } - } - - private fun setTileDescription(description : String) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - qsTile.subtitle = description - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - qsTile.stateDescription = description; - } - } - - private fun cancelJob() { - if(this::job.isInitialized) { - job.cancel(); - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/HandshakeStatus.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/HandshakeStatus.kt deleted file mode 100644 index 1d2fa54ea7..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/HandshakeStatus.kt +++ /dev/null @@ -1,14 +0,0 @@ -package net.nymtech.nymconnect.service.tunnel - -enum class HandshakeStatus { - HEALTHY, - UNHEALTHY, - NEVER_CONNECTED, - NOT_STARTED; - - companion object { - private const val WG_TYPICAL_HANDSHAKE_INTERVAL_WHEN_HEALTHY_SEC = 120 - const val UNHEALTHY_TIME_LIMIT_SEC = WG_TYPICAL_HANDSHAKE_INTERVAL_WHEN_HEALTHY_SEC + 60 - const val NEVER_CONNECTED_TO_UNHEALTHY_TIME_LIMIT_SEC = 30 - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt deleted file mode 100644 index 15c8c1b676..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt +++ /dev/null @@ -1,18 +0,0 @@ -package net.nymtech.nymconnect.service.tunnel - -import com.wireguard.android.backend.Statistics -import com.wireguard.android.backend.Tunnel -import com.wireguard.crypto.Key -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import kotlinx.coroutines.flow.SharedFlow - -interface VpnService : Tunnel { - suspend fun startTunnel(tunnelConfig : TunnelConfig) : Tunnel.State - suspend fun stopTunnel() - val state : SharedFlow - val tunnelName : SharedFlow - val statistics : SharedFlow - val lastHandshake : SharedFlow> - val handshakeStatus : SharedFlow - fun getState() : Tunnel.State -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt deleted file mode 100644 index ae9a3c233d..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt +++ /dev/null @@ -1,131 +0,0 @@ -package net.nymtech.nymconnect.service.tunnel - -import com.wireguard.android.backend.Backend -import com.wireguard.android.backend.BackendException -import com.wireguard.android.backend.Statistics -import com.wireguard.android.backend.Tunnel -import com.wireguard.crypto.Key -import net.nymtech.nymconnect.Constants -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import net.nymtech.nymconnect.util.NumberUtils -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.channels.BufferOverflow -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.flow.asSharedFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch -import timber.log.Timber -import javax.inject.Inject - - -class WireGuardTunnel @Inject constructor(private val backend : Backend, -) : VpnService { - - private val _tunnelName = MutableStateFlow("") - override val tunnelName get() = _tunnelName.asStateFlow() - - private val _state = MutableSharedFlow( - onBufferOverflow = BufferOverflow.DROP_OLDEST, - replay = 1) - - private val _handshakeStatus = MutableSharedFlow(replay = 1, - onBufferOverflow = BufferOverflow.DROP_OLDEST) - override val state get() = _state.asSharedFlow() - - private val _statistics = MutableSharedFlow(replay = 1) - override val statistics get() = _statistics.asSharedFlow() - - private val _lastHandshake = MutableSharedFlow>(replay = 1) - override val lastHandshake get() = _lastHandshake.asSharedFlow() - - override val handshakeStatus: SharedFlow - get() = _handshakeStatus.asSharedFlow() - - private lateinit var statsJob : Job - - - override suspend fun startTunnel(tunnelConfig: TunnelConfig) : Tunnel.State{ - return try { - if(getState() == Tunnel.State.UP && _tunnelName.value != tunnelConfig.name) { - stopTunnel() - } - _tunnelName.emit(tunnelConfig.name) - val config = TunnelConfig.configFromQuick(tunnelConfig.wgQuick) - val state = backend.setState( - this, Tunnel.State.UP, config) - _state.emit(state) - state; - } catch (e : Exception) { - Timber.e("Failed to start tunnel with error: ${e.message}") - Tunnel.State.DOWN - } - } - - override fun getName(): String { - return _tunnelName.value - } - - override suspend fun stopTunnel() { - try { - if(getState() == Tunnel.State.UP) { - val state = backend.setState(this, Tunnel.State.DOWN, null) - _state.emit(state) - } - } catch (e : BackendException) { - Timber.e("Failed to stop tunnel with error: ${e.message}") - } - } - - override fun getState(): Tunnel.State { - return backend.getState(this) - } - - override fun onStateChange(state : Tunnel.State) { - val tunnel = this; - _state.tryEmit(state) - if(state == Tunnel.State.UP) { - statsJob = CoroutineScope(Dispatchers.IO).launch { - val handshakeMap = HashMap() - var neverHadHandshakeCounter = 0 - while (true) { - val statistics = backend.getStatistics(tunnel) - _statistics.emit(statistics) - statistics.peers().forEach { - val handshakeEpoch = statistics.peer(it)?.latestHandshakeEpochMillis ?: 0L - handshakeMap[it] = handshakeEpoch - if(handshakeEpoch == 0L) { - if(neverHadHandshakeCounter >= HandshakeStatus.NEVER_CONNECTED_TO_UNHEALTHY_TIME_LIMIT_SEC) { - _handshakeStatus.emit(HandshakeStatus.NEVER_CONNECTED) - } else { - _handshakeStatus.emit(HandshakeStatus.NOT_STARTED) - } - if(neverHadHandshakeCounter <= HandshakeStatus.NEVER_CONNECTED_TO_UNHEALTHY_TIME_LIMIT_SEC) { - neverHadHandshakeCounter += 10 - } - return@forEach - } - if(NumberUtils.getSecondsBetweenTimestampAndNow(handshakeEpoch) >= HandshakeStatus.UNHEALTHY_TIME_LIMIT_SEC) { - _handshakeStatus.emit(HandshakeStatus.UNHEALTHY) - } else { - _handshakeStatus.emit(HandshakeStatus.HEALTHY) - } - } - _lastHandshake.emit(handshakeMap) - delay(Constants.VPN_STATISTIC_CHECK_INTERVAL) - } - } - } - if(state == Tunnel.State.DOWN) { - if(this::statsJob.isInitialized) { - statsJob.cancel() - } - _handshakeStatus.tryEmit(HandshakeStatus.NOT_STARTED) - _lastHandshake.tryEmit(emptyMap()) - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt deleted file mode 100644 index 2aff4e9f11..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt +++ /dev/null @@ -1,15 +0,0 @@ -package net.nymtech.nymconnect.service.tunnel.model - -import io.objectbox.annotation.Entity -import io.objectbox.annotation.Id - -@Entity -data class Settings( - @Id - var id : Long = 0, - var isAutoTunnelEnabled : Boolean = false, - var isTunnelOnMobileDataEnabled : Boolean = false, - var trustedNetworkSSIDs : MutableList = mutableListOf(), - var defaultTunnel : String? = null, - var isAlwaysOnVpnEnabled : Boolean = false, -) diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt deleted file mode 100644 index 91f7440d0d..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt +++ /dev/null @@ -1,89 +0,0 @@ -package net.nymtech.nymconnect.service.tunnel.model - -import com.wireguard.config.Config -import io.objectbox.annotation.ConflictStrategy -import io.objectbox.annotation.Entity -import io.objectbox.annotation.Id -import io.objectbox.annotation.Unique -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.Json -import java.io.InputStream - - -@Entity -@Serializable -data class TunnelConfig( - @Id - var id : Long = 0, - @Unique(onConflict = ConflictStrategy.REPLACE) - var name : String, - var wgQuick : String -) { - - - override fun toString(): String { - return Json.encodeToString(serializer(), this) - } - - companion object { - private const val INCLUDED_APPLICATIONS = "IncludedApplications = " - private const val EXCLUDED_APPLICATIONS = "ExcludedApplications = " - private const val INTERFACE = "[Interface]" - private const val NEWLINE_CHAR = "\n" - private const val APP_CONFIG_SEPARATOR = ", " - - private fun addApplicationsToConfig(appConfig : String, wgQuick : String) : String { - val configList = wgQuick.split(NEWLINE_CHAR).toMutableList() - val interfaceIndex = configList.indexOf(INTERFACE) - configList.add(interfaceIndex + 1, appConfig) - return configList.joinToString(NEWLINE_CHAR) - } - - fun clearAllApplicationsFromConfig(wgQuick : String) : String { - val configList = wgQuick.split(NEWLINE_CHAR).toMutableList() - val itr = configList.iterator() - while (itr.hasNext()) { - val next = itr.next() - if(next.contains(INCLUDED_APPLICATIONS) || next.contains(EXCLUDED_APPLICATIONS)) { - itr.remove() - } - } - return configList.joinToString(NEWLINE_CHAR) - } - - - fun setExcludedApplicationsOnQuick(packages : List, wgQuick: String) : String { - if(packages.isEmpty()) { - return wgQuick - } - val clearedWgQuick = clearAllApplicationsFromConfig(wgQuick) - val excludeConfig = buildExcludedApplicationsString(packages) - return addApplicationsToConfig(excludeConfig, clearedWgQuick) - } - - fun setIncludedApplicationsOnQuick(packages : List, wgQuick: String) : String { - if(packages.isEmpty()) { - return wgQuick - } - val clearedWgQuick = clearAllApplicationsFromConfig(wgQuick) - val includeConfig = buildIncludedApplicationsString(packages) - return addApplicationsToConfig(includeConfig, clearedWgQuick) - } - - private fun buildExcludedApplicationsString(packages : List) : String { - return EXCLUDED_APPLICATIONS + packages.joinToString(APP_CONFIG_SEPARATOR) - } - - private fun buildIncludedApplicationsString(packages : List) : String { - return INCLUDED_APPLICATIONS + packages.joinToString(APP_CONFIG_SEPARATOR) - } - fun from(string : String) : TunnelConfig { - return Json.decodeFromString(string) - } - fun configFromQuick(wgQuick: String): Config { - val inputStream: InputStream = wgQuick.byteInputStream() - val reader = inputStream.bufferedReader(Charsets.UTF_8) - return Config.parse(reader) - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt deleted file mode 100644 index edb82cc213..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt +++ /dev/null @@ -1,201 +0,0 @@ -package net.nymtech.nymconnect.ui - -import android.Manifest -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.Bundle -import android.provider.Settings -import android.view.KeyEvent -import androidx.activity.compose.rememberLauncherForActivityResult -import androidx.activity.compose.setContent -import androidx.activity.result.contract.ActivityResultContracts -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.animation.ExperimentalAnimationApi -import androidx.compose.animation.core.tween -import androidx.compose.animation.fadeIn -import androidx.compose.animation.slideInHorizontally -import androidx.compose.material3.Scaffold -import androidx.compose.material3.SnackbarHost -import androidx.compose.material3.SnackbarHostState -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.input.key.onKeyEvent -import com.google.accompanist.navigation.animation.AnimatedNavHost -import com.google.accompanist.navigation.animation.composable -import com.google.accompanist.navigation.animation.rememberAnimatedNavController -import com.google.accompanist.permissions.ExperimentalPermissionsApi -import com.google.accompanist.permissions.isGranted -import com.google.accompanist.permissions.rememberPermissionState -import com.wireguard.android.backend.GoBackend -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.ui.common.PermissionRequestFailedScreen -import net.nymtech.nymconnect.ui.common.navigation.BottomNavBar -import net.nymtech.nymconnect.ui.screens.config.ConfigScreen -import net.nymtech.nymconnect.ui.screens.detail.DetailScreen -import net.nymtech.nymconnect.ui.screens.main.MainScreen -import net.nymtech.nymconnect.ui.screens.settings.SettingsScreen -import net.nymtech.nymconnect.ui.screens.support.SupportScreen -import net.nymtech.nymconnect.ui.theme.TransparentSystemBars -import net.nymtech.nymconnect.ui.theme.WireguardAutoTunnelTheme -import dagger.hilt.android.AndroidEntryPoint -import timber.log.Timber -import java.lang.IllegalStateException - -@AndroidEntryPoint -class MainActivity : AppCompatActivity() { - - @OptIn(ExperimentalAnimationApi::class, - ExperimentalPermissionsApi::class - ) - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - val navController = rememberAnimatedNavController() - val focusRequester = remember { FocusRequester() } - - WireguardAutoTunnelTheme { - TransparentSystemBars() - - val snackbarHostState = remember { SnackbarHostState() } - - val notificationPermissionState = - rememberPermissionState(Manifest.permission.POST_NOTIFICATIONS) - - fun requestNotificationPermission() { - if (!notificationPermissionState.status.isGranted && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - notificationPermissionState.launchPermissionRequest() - } - } - - var vpnIntent by remember { mutableStateOf(GoBackend.VpnService.prepare(this)) } - val vpnActivityResultState = rememberLauncherForActivityResult( - ActivityResultContracts.StartActivityForResult(), - onResult = { - val accepted = (it.resultCode == RESULT_OK) - if (accepted) { - vpnIntent = null - } - }) - LaunchedEffect(vpnIntent) { - if (vpnIntent != null) { - vpnActivityResultState.launch(vpnIntent) - } else requestNotificationPermission() - } - - Scaffold(snackbarHost = { SnackbarHost(snackbarHostState)}, - modifier = Modifier.onKeyEvent { - if (it.nativeKeyEvent.action == KeyEvent.ACTION_UP) { - when (it.nativeKeyEvent.keyCode) { - KeyEvent.KEYCODE_DPAD_UP -> { - try { - focusRequester.requestFocus() - } catch(e : IllegalStateException) { - Timber.e("No D-Pad focus request modifier added to element on screen") - } - false - } else -> { - false; - } - } - } else { - false - } - }, - bottomBar = if (vpnIntent == null && notificationPermissionState.status.isGranted) { - { BottomNavBar(navController, Routes.navItems) } - } else { - {} - }, - ) - { padding -> - if (vpnIntent != null) { - PermissionRequestFailedScreen( - padding = padding, - onRequestAgain = { vpnActivityResultState.launch(vpnIntent) }, - message = getString(R.string.vpn_permission_required), - getString(R.string.retry) - ) - return@Scaffold - } - if (!notificationPermissionState.status.isGranted) { - PermissionRequestFailedScreen( - padding = padding, - onRequestAgain = { - val intentSettings = - Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - intentSettings.data = - Uri.fromParts("package", this.packageName, null) - startActivity(intentSettings); - }, - message = getString(R.string.notification_permission_required), - getString(R.string.open_settings) - ) - return@Scaffold - } - AnimatedNavHost(navController, startDestination = Routes.Main.name) { - composable(Routes.Main.name, enterTransition = { - when (initialState.destination.route) { - Routes.Settings.name, Routes.Support.name -> - slideInHorizontally( - initialOffsetX = { -1000 }, - animationSpec = tween(500) - ) - - else -> { - fadeIn(animationSpec = tween(1000)) - } - } - }) { - MainScreen(padding = padding, snackbarHostState = snackbarHostState, navController = navController) - } - composable(Routes.Settings.name, enterTransition = { - when (initialState.destination.route) { - Routes.Main.name -> - slideInHorizontally( - initialOffsetX = { 1000 }, - animationSpec = tween(500) - ) - - Routes.Support.name -> { - slideInHorizontally( - initialOffsetX = { -1000 }, - animationSpec = tween(500) - ) - } - - else -> { - fadeIn(animationSpec = tween(1000)) - } - } - }) { SettingsScreen(padding = padding, snackbarHostState = snackbarHostState, navController = navController, focusRequester = focusRequester) } - composable(Routes.Support.name, enterTransition = { - when (initialState.destination.route) { - Routes.Settings.name, Routes.Main.name -> - slideInHorizontally( - initialOffsetX = { 1000 }, - animationSpec = tween(500) - ) - - else -> { - fadeIn(animationSpec = tween(1000)) - } - } - }) { SupportScreen(padding = padding, focusRequester) } - composable("${Routes.Config.name}/{id}", enterTransition = { - fadeIn(animationSpec = tween(1000)) - }) { ConfigScreen(padding = padding, navController = navController, id = it.arguments?.getString("id"), focusRequester = focusRequester)} - composable("${Routes.Detail.name}/{id}", enterTransition = { - fadeIn(animationSpec = tween(1000)) - }) { DetailScreen(padding = padding, id = it.arguments?.getString("id")) } - } - } - } - } - } -} diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt deleted file mode 100644 index 589fa5fbbf..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt +++ /dev/null @@ -1,36 +0,0 @@ -package net.nymtech.nymconnect.ui - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.rounded.Home -import androidx.compose.material.icons.rounded.QuestionMark -import androidx.compose.material.icons.rounded.Settings -import net.nymtech.nymconnect.ui.common.navigation.BottomNavItem - -enum class Routes { - Main, - Settings, - Support, - Config, - Detail; - - - companion object { - val navItems = listOf( - BottomNavItem( - name = "Tunnels", - route = Main.name, - icon = Icons.Rounded.Home, - ), - BottomNavItem( - name = "Settings", - route = Settings.name, - icon = Icons.Rounded.Settings, - ), - BottomNavItem( - name = "Support", - route = Support.name, - icon = Icons.Rounded.QuestionMark, - ) - ) - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt deleted file mode 100644 index 66aa0b8790..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt +++ /dev/null @@ -1,9 +0,0 @@ -package net.nymtech.nymconnect.ui - -data class ViewState( - val showSnackbarMessage : Boolean = false, - val snackbarMessage : String = "", - val snackbarActionText : String = "", - val onSnackbarActionClick : () -> Unit = {}, - val isLoading : Boolean = false -) diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt deleted file mode 100644 index 2ddd1f27b2..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt +++ /dev/null @@ -1,31 +0,0 @@ -package net.nymtech.nymconnect.ui.common - -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.size -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector - -@Composable -fun ClickableIconButton(onIconClick : () -> Unit, text : String, icon : ImageVector, enabled : Boolean) { - Button(onClick = {}, - enabled = enabled - ) { - Text(text) - Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) - Icon( - imageVector = icon, - contentDescription = "Delete", - modifier = Modifier.size(ButtonDefaults.IconSize).clickable { - if(enabled) { - onIconClick() - } - } - ) - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt deleted file mode 100644 index a0f81b5745..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt +++ /dev/null @@ -1,35 +0,0 @@ -package net.nymtech.nymconnect.ui.common - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Button -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import kotlinx.coroutines.launch - -@Composable -fun PermissionRequestFailedScreen(padding : PaddingValues, onRequestAgain : () -> Unit, message : String, buttonText : String ) { - val scope = rememberCoroutineScope() - Column(horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, - modifier = Modifier - .fillMaxSize() - .padding(padding)) { - Text(message, textAlign = TextAlign.Center, modifier = Modifier.padding(15.dp)) - Button(onClick = { - scope.launch { - onRequestAgain() - } - }) { - Text(buttonText) - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt deleted file mode 100644 index 33fb6d0bf6..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt +++ /dev/null @@ -1,55 +0,0 @@ -package net.nymtech.nymconnect.ui.common - -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.combinedClickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.unit.dp - -@OptIn(ExperimentalFoundationApi::class) -@Composable -fun RowListItem(leadingIcon : ImageVector? = null, leadingIconColor : Color = Color.Gray, text : String, onHold : () -> Unit, onClick: () -> Unit, rowButton : @Composable() () -> Unit ) { - Box( - modifier = Modifier - .combinedClickable( - onClick = { - onClick() - }, - onLongClick = { - onHold() - } - ) - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(14.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Row(verticalAlignment = Alignment.CenterVertically,) { - if(leadingIcon != null) { - Icon( - leadingIcon, "status", - tint = leadingIconColor, - modifier = Modifier.padding(end = 10.dp).size(15.dp) - ) - } - Text(text) - } - - rowButton() - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/SearchBar.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/SearchBar.kt deleted file mode 100644 index cec26f5b09..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/SearchBar.kt +++ /dev/null @@ -1,80 +0,0 @@ -package net.nymtech.nymconnect.ui.common - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.rounded.Clear -import androidx.compose.material.icons.rounded.Search -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TextField -import androidx.compose.material3.TextFieldDefaults -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.RectangleShape -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.input.KeyboardType -import net.nymtech.nymconnect.R - -@Composable -fun SearchBar( - onQuery : (queryString : String) -> Unit -) { - // Immediately update and keep track of query from text field changes. - var query: String by rememberSaveable { mutableStateOf("") } - var showClearIcon by rememberSaveable { mutableStateOf(false) } - - if (query.isEmpty()) { - showClearIcon = false - } else if (query.isNotEmpty()) { - showClearIcon = true - } - - TextField( - value = query, - onValueChange = { onQueryChanged -> - // If user makes changes to text, immediately updated it. - query = onQueryChanged - onQuery(onQueryChanged) - }, - leadingIcon = { - Icon( - imageVector = Icons.Rounded.Search, - tint = MaterialTheme.colorScheme.onBackground, - contentDescription = stringResource(id = R.string.search_icon) - ) - }, - trailingIcon = { - if (showClearIcon) { - IconButton(onClick = { query = "" }) { - Icon( - imageVector = Icons.Rounded.Clear, - tint = MaterialTheme.colorScheme.onBackground, - contentDescription = stringResource(id = R.string.clear_icon) - ) - } - } - }, - maxLines = 1, - colors = TextFieldDefaults.colors( - focusedContainerColor = Color.Transparent, - unfocusedContainerColor = Color.Transparent, - disabledContainerColor = Color.Transparent, - ), - placeholder = { Text(text = stringResource(R.string.hint_search_packages)) }, - textStyle = MaterialTheme.typography.bodySmall, - singleLine = true, - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text), - modifier = Modifier - .fillMaxWidth() - .background(color = MaterialTheme.colorScheme.background, shape = RectangleShape) - ) -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt deleted file mode 100644 index 957228eece..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt +++ /dev/null @@ -1,42 +0,0 @@ -package net.nymtech.nymconnect.ui.common.navigation - -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.NavigationBar -import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.text.font.FontWeight -import androidx.navigation.NavController -import androidx.navigation.compose.currentBackStackEntryAsState - -@Composable -fun BottomNavBar(navController : NavController, bottomNavItems : List) { - - val backStackEntry = navController.currentBackStackEntryAsState() - - NavigationBar( - containerColor = MaterialTheme.colorScheme.background, - ) { - bottomNavItems.forEach { item -> - val selected = item.route == backStackEntry.value?.destination?.route - - NavigationBarItem( - selected = selected, - onClick = { navController.navigate(item.route) }, - label = { - Text( - text = item.name, - fontWeight = FontWeight.SemiBold, - ) - }, - icon = { - Icon( - imageVector = item.icon, - contentDescription = "${item.name} Icon", - ) - } - ) - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt deleted file mode 100644 index a4a585ce5e..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt +++ /dev/null @@ -1,9 +0,0 @@ -package net.nymtech.nymconnect.ui.common.navigation - -import androidx.compose.ui.graphics.vector.ImageVector - -data class BottomNavItem( - val name: String, - val route: String, - val icon: ImageVector, -) diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigScreen.kt deleted file mode 100644 index 1ecfaf6570..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigScreen.kt +++ /dev/null @@ -1,241 +0,0 @@ -package net.nymtech.nymconnect.ui.screens.config - -import android.widget.Toast -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.rounded.Android -import androidx.compose.material3.Button -import androidx.compose.material3.Checkbox -import androidx.compose.material3.Icon -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.Switch -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Alignment -import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.platform.LocalSoftwareKeyboardController -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.input.ImeAction -import androidx.compose.ui.text.input.KeyboardCapitalization -import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.navigation.NavController -import com.google.accompanist.drawablepainter.DrawablePainter -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.ui.Routes -import net.nymtech.nymconnect.ui.common.SearchBar -import kotlinx.coroutines.launch - -@OptIn(ExperimentalComposeUiApi::class) -@Composable -fun ConfigScreen( - viewModel: ConfigViewModel = hiltViewModel(), - padding: PaddingValues, - focusRequester: FocusRequester, - navController: NavController, - id : String? -) { - - val context = LocalContext.current - val focusManager = LocalFocusManager.current - - val keyboardController = LocalSoftwareKeyboardController.current - val scope = rememberCoroutineScope() - val tunnel by viewModel.tunnel.collectAsStateWithLifecycle(null) - val tunnelName = viewModel.tunnelName.collectAsStateWithLifecycle() - val packages by viewModel.packages.collectAsStateWithLifecycle() - val checkedPackages by viewModel.checkedPackages.collectAsStateWithLifecycle() - val include by viewModel.include.collectAsStateWithLifecycle() - val allApplications by viewModel.allApplications.collectAsStateWithLifecycle() - - LaunchedEffect(Unit) { - viewModel.getTunnelById(id) - viewModel.emitQueriedPackages("") - viewModel.emitCurrentPackageConfigurations(id) - } - - if(tunnel != null) { - LazyColumn( - horizontalAlignment = Alignment.Start, - verticalArrangement = Arrangement.Top, - modifier = Modifier - .fillMaxSize() - .padding(padding) - ) { - item { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp, vertical = 7.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - OutlinedTextField( - modifier = Modifier.focusRequester(focusRequester), - value = tunnelName.value, - onValueChange = { - viewModel.onTunnelNameChange(it) - }, - label = { Text(stringResource(id = R.string.tunnel_name)) }, - maxLines = 1, - keyboardOptions = KeyboardOptions( - capitalization = KeyboardCapitalization.None, - imeAction = ImeAction.Done - ), - keyboardActions = KeyboardActions( - onDone = { - focusManager.clearFocus() - keyboardController?.hide() - viewModel.onTunnelNameChange(tunnelName.value) - } - ), - ) - } - } - item { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp, vertical = 7.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text(stringResource(id = R.string.tunnel_all)) - Switch( - checked = allApplications, - onCheckedChange = { - viewModel.onAllApplicationsChange(!allApplications) - } - ) - } - } - if (!allApplications) { - item { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp, vertical = 7.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text(stringResource(id = R.string.include)) - Checkbox( - checked = include, - onCheckedChange = { - viewModel.onIncludeChange(!include) - } - ) - } - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text(stringResource(id = R.string.exclude)) - Checkbox( - checked = !include, - onCheckedChange = { - viewModel.onIncludeChange(!include) - } - ) - } - } - } - item { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp, vertical = 7.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween) { - SearchBar(viewModel::emitQueriedPackages); - } - } - items(packages) { pack -> - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Row( - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(5.dp) - ) { - val drawable = - pack.applicationInfo?.loadIcon(context.packageManager) - if (drawable != null) { - Image( - painter = DrawablePainter(drawable), - stringResource(id = R.string.icon), - modifier = Modifier.size(50.dp, 50.dp) - ) - } else { - Icon( - Icons.Rounded.Android, - stringResource(id = R.string.edit), - modifier = Modifier.size(50.dp, 50.dp) - ) - } - Text( - pack.applicationInfo.loadLabel(context.packageManager) - .toString(), modifier = Modifier.padding(5.dp) - ) - } - Checkbox( - checked = (checkedPackages.contains(pack.packageName)), - onCheckedChange = { - if (it) viewModel.onAddCheckedPackage(pack.packageName) else viewModel.onRemoveCheckedPackage( - pack.packageName - ) - } - ) - } - } - } - item { - Row( - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.fillMaxWidth() - ) { - Button(onClick = { - scope.launch { - viewModel.onSaveAllChanges() - Toast.makeText( - context, - context.resources.getString(R.string.config_changes_saved), - Toast.LENGTH_LONG - ).show() - navController.navigate(Routes.Main.name) - } - }, Modifier.padding(25.dp)) { - Text(stringResource(id = R.string.save_changes)) - } - } - } - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigViewModel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigViewModel.kt deleted file mode 100644 index 325e5a49bd..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigViewModel.kt +++ /dev/null @@ -1,152 +0,0 @@ -package net.nymtech.nymconnect.ui.screens.config - -import android.Manifest -import android.app.Application -import android.content.pm.PackageInfo -import android.content.pm.PackageManager -import android.os.Build -import androidx.compose.runtime.mutableStateListOf -import androidx.compose.runtime.toMutableStateList -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import net.nymtech.nymconnect.repository.Repository -import net.nymtech.nymconnect.service.tunnel.model.Settings -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch -import timber.log.Timber -import javax.inject.Inject - -@HiltViewModel -class ConfigViewModel @Inject constructor(private val application : Application, - private val tunnelRepo : Repository, - private val settingsRepo : Repository) : ViewModel() { - - private val _tunnel = MutableStateFlow(null) - private val _tunnelName = MutableStateFlow("") - val tunnelName get() = _tunnelName.asStateFlow() - val tunnel get() = _tunnel.asStateFlow() - private val _packages = MutableStateFlow(emptyList()) - val packages get() = _packages.asStateFlow() - private val packageManager = application.packageManager - - private val _checkedPackages = MutableStateFlow(mutableStateListOf()) - val checkedPackages get() = _checkedPackages.asStateFlow() - private val _include = MutableStateFlow(true) - val include get() = _include.asStateFlow() - - private val _allApplications = MutableStateFlow(true) - val allApplications get() = _allApplications.asStateFlow() - - suspend fun getTunnelById(id : String?) : TunnelConfig? { - return try { - if(id != null) { - val config = tunnelRepo.getById(id.toLong()) - if (config != null) { - _tunnel.emit(config) - _tunnelName.emit(config.name) - - } - return config - } - return null - } catch (e : Exception) { - Timber.e(e.message) - null - } - } - - fun onTunnelNameChange(name : String) { - _tunnelName.value = name - } - - fun onIncludeChange(include : Boolean) { - _include.value = include - } - fun onAddCheckedPackage(packageName : String) { - _checkedPackages.value.add(packageName) - } - - fun onAllApplicationsChange(allApplications : Boolean) { - _allApplications.value = allApplications - } - - fun onRemoveCheckedPackage(packageName : String) { - _checkedPackages.value.remove(packageName) - } - - suspend fun emitCurrentPackageConfigurations(id : String?) { - val tunnelConfig = getTunnelById(id) - if(tunnelConfig != null) { - val config = TunnelConfig.configFromQuick(tunnelConfig.wgQuick) - val excludedApps = config.`interface`.excludedApplications - val includedApps = config.`interface`.includedApplications - if(excludedApps.isNullOrEmpty() && includedApps.isNullOrEmpty()) { - _allApplications.emit(true) - return - } - if(excludedApps.isEmpty()) { - _include.emit(true) - _checkedPackages.emit(includedApps.toMutableStateList()) - } else { - _include.emit(false) - _checkedPackages.emit(excludedApps.toMutableStateList()) - } - _allApplications.emit(false) - } - } - - fun emitQueriedPackages(query : String) { - viewModelScope.launch { - _packages.emit(getAllInternetCapablePackages().filter { - it.packageName.contains(query) - }) - } - } - - private fun getAllInternetCapablePackages() : List { - return getPackagesHoldingPermissions(arrayOf(Manifest.permission.INTERNET)) - } - - private fun getPackagesHoldingPermissions(permissions: Array): List { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - packageManager.getPackagesHoldingPermissions(permissions, PackageManager.PackageInfoFlags.of(0L)) - } else { - @Suppress("DEPRECATION") - packageManager.getPackagesHoldingPermissions(permissions, 0) - } - } - - suspend fun onSaveAllChanges() { - var wgQuick = _tunnel.value?.wgQuick - if(wgQuick != null) { - wgQuick = if(_include.value) { - TunnelConfig.setIncludedApplicationsOnQuick(_checkedPackages.value, wgQuick) - } else { - TunnelConfig.setExcludedApplicationsOnQuick(_checkedPackages.value, wgQuick) - } - if(_allApplications.value) { - wgQuick = TunnelConfig.clearAllApplicationsFromConfig(wgQuick) - } - _tunnel.value?.copy( - name = _tunnelName.value, - wgQuick = wgQuick - )?.let { - tunnelRepo.save(it) - val settings = settingsRepo.getAll() - if(settings != null) { - val setting = settings[0] - if(setting.defaultTunnel != null) { - if(it.id == TunnelConfig.from(setting.defaultTunnel!!).id) { - settingsRepo.save(setting.copy( - defaultTunnel = it.toString() - )) - } - } - } - } - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailScreen.kt deleted file mode 100644 index bdf77a5e56..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailScreen.kt +++ /dev/null @@ -1,139 +0,0 @@ -package net.nymtech.nymconnect.ui.screens.detail - -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.ClipboardManager -import androidx.compose.ui.platform.LocalClipboardManager -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.util.NumberUtils -import java.time.Duration -import java.time.Instant - -@Composable -fun DetailScreen( - viewModel: DetailViewModel = hiltViewModel(), - padding: PaddingValues, - id : String? -) { - - val clipboardManager: ClipboardManager = LocalClipboardManager.current - val tunnelStats by viewModel.tunnelStats.collectAsStateWithLifecycle(null) - val tunnel by viewModel.tunnel.collectAsStateWithLifecycle(null) - val tunnelName by viewModel.tunnelName.collectAsStateWithLifecycle() - val lastHandshake by viewModel.lastHandshake.collectAsStateWithLifecycle(emptyMap()) - - - LaunchedEffect(Unit) { - viewModel.getTunnelById(id) - } - - if(tunnel != null) { - val interfaceKey = tunnel?.`interface`?.keyPair?.publicKey?.toBase64().toString() - val addresses = tunnel?.`interface`?.addresses!!.joinToString() - val dnsServers = tunnel?.`interface`?.dnsServers!!.joinToString() - val optionalMtu = tunnel?.`interface`?.mtu - val mtu = if(optionalMtu?.isPresent == true) optionalMtu.get().toString() else "None" - Column( - horizontalAlignment = Alignment.Start, - verticalArrangement = Arrangement.Top, - modifier = Modifier - .fillMaxSize() - .verticalScroll(rememberScrollState()) - .padding(padding) - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp, vertical = 7.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Column { - Text(stringResource(R.string.config_interface), fontWeight = FontWeight.Bold, fontSize = 20.sp) - Text(stringResource(R.string.name), fontStyle = FontStyle.Italic) - Text(text = tunnelName, modifier = Modifier.clickable { - clipboardManager.setText(AnnotatedString(tunnelName)) - }) - Text(stringResource(R.string.public_key), fontStyle = FontStyle.Italic) - Text(text = interfaceKey, modifier = Modifier.clickable { - clipboardManager.setText(AnnotatedString(interfaceKey)) - }) - Text(stringResource(R.string.addresses), fontStyle = FontStyle.Italic) - Text(text = addresses, modifier = Modifier.clickable { - clipboardManager.setText(AnnotatedString(addresses)) - }) - Text(stringResource(R.string.dns_servers), fontStyle = FontStyle.Italic) - Text(text = dnsServers, modifier = Modifier.clickable { - clipboardManager.setText(AnnotatedString(dnsServers)) - }) - Text(stringResource(R.string.mtu), fontStyle = FontStyle.Italic) - Text(text = mtu, modifier = Modifier.clickable { - clipboardManager.setText(AnnotatedString(mtu)) - }) - Box(modifier = Modifier.padding(10.dp)) - tunnel?.peers?.forEach{ - val peerKey = it.publicKey.toBase64().toString() - val allowedIps = it.allowedIps.joinToString() - val endpoint = if(it.endpoint.isPresent) it.endpoint.get().toString() else "None" - Text(stringResource(R.string.peer), fontWeight = FontWeight.Bold, fontSize = 20.sp) - Text(stringResource(R.string.public_key), fontStyle = FontStyle.Italic) - Text(text = peerKey, modifier = Modifier.clickable { - clipboardManager.setText(AnnotatedString(peerKey)) - }) - Text(stringResource(id = R.string.allowed_ips), fontStyle = FontStyle.Italic) - Text(text = allowedIps, modifier = Modifier.clickable { - clipboardManager.setText(AnnotatedString(allowedIps)) - }) - Text(stringResource(R.string.endpoint), fontStyle = FontStyle.Italic) - Text(text = endpoint, modifier = Modifier.clickable { - clipboardManager.setText(AnnotatedString(endpoint)) - }) - if (tunnelStats != null) { - val totalRx = tunnelStats?.totalRx() ?: 0 - val totalTx = tunnelStats?.totalTx() ?: 0 - if((totalRx + totalTx != 0L)) { - val rxKB = NumberUtils.bytesToKB(tunnelStats!!.totalRx()) - val txKB = NumberUtils.bytesToKB(tunnelStats!!.totalTx()) - Text(stringResource(R.string.transfer), fontStyle = FontStyle.Italic) - Text("rx: ${NumberUtils.formatDecimalTwoPlaces(rxKB)} KB tx: ${NumberUtils.formatDecimalTwoPlaces(txKB)} KB") - Text(stringResource(R.string.last_handshake), fontStyle = FontStyle.Italic) - val handshakeEpoch = lastHandshake[it.publicKey] - if(handshakeEpoch != null) { - if(handshakeEpoch == 0L) { - Text("Never") - } else { - val time = Instant.ofEpochMilli(handshakeEpoch) - Text("${Duration.between(time, Instant.now()).seconds} seconds ago") - } - } - } - } - } - } - } - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailViewModel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailViewModel.kt deleted file mode 100644 index cf83878a0b..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailViewModel.kt +++ /dev/null @@ -1,45 +0,0 @@ -package net.nymtech.nymconnect.ui.screens.detail - -import androidx.lifecycle.ViewModel -import com.wireguard.config.Config -import net.nymtech.nymconnect.repository.Repository -import net.nymtech.nymconnect.service.tunnel.VpnService -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import timber.log.Timber -import javax.inject.Inject - -@HiltViewModel -class DetailViewModel @Inject constructor(private val tunnelRepo : Repository, private val vpnService : VpnService - -) : ViewModel() { - - private val _tunnel = MutableStateFlow(null) - val tunnel get() = _tunnel.asStateFlow() - - private val _tunnelName = MutableStateFlow("") - val tunnelName = _tunnelName.asStateFlow() - val tunnelStats get() = vpnService.statistics - val lastHandshake get() = vpnService.lastHandshake - - private var config : TunnelConfig? = null - - suspend fun getTunnelById(id : String?) : TunnelConfig? { - return try { - if(id != null) { - config = tunnelRepo.getById(id.toLong()) - if (config != null) { - _tunnel.emit(TunnelConfig.configFromQuick(config!!.wgQuick)) - _tunnelName.emit(config!!.name) - } - return config - } - return null - } catch (e : Exception) { - Timber.e(e.message) - null - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt deleted file mode 100644 index e2abdd07b7..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt +++ /dev/null @@ -1,336 +0,0 @@ -package net.nymtech.nymconnect.ui.screens.main - -import android.annotation.SuppressLint -import androidx.activity.compose.rememberLauncherForActivityResult -import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.slideInVertically -import androidx.compose.animation.slideOutVertically -import androidx.compose.foundation.clickable -import androidx.compose.foundation.focusable -import androidx.compose.foundation.gestures.detectTapGestures -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.FileOpen -import androidx.compose.material.icons.rounded.Add -import androidx.compose.material.icons.rounded.Circle -import androidx.compose.material.icons.rounded.Delete -import androidx.compose.material.icons.rounded.Edit -import androidx.compose.material.icons.rounded.Info -import androidx.compose.material3.Divider -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.FabPosition -import androidx.compose.material3.FloatingActionButton -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.Scaffold -import androidx.compose.material3.SnackbarDuration -import androidx.compose.material3.SnackbarHostState -import androidx.compose.material3.SnackbarResult -import androidx.compose.material3.Switch -import androidx.compose.material3.Text -import androidx.compose.material3.rememberModalBottomSheetState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.hapticfeedback.HapticFeedbackType -import androidx.compose.ui.input.nestedscroll.NestedScrollConnection -import androidx.compose.ui.input.nestedscroll.NestedScrollSource -import androidx.compose.ui.input.nestedscroll.nestedScroll -import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.navigation.NavController -import com.wireguard.android.backend.Tunnel -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.WireGuardAutoTunnel -import net.nymtech.nymconnect.service.tunnel.HandshakeStatus -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import net.nymtech.nymconnect.ui.Routes -import net.nymtech.nymconnect.ui.common.RowListItem -import net.nymtech.nymconnect.ui.theme.brickRed -import net.nymtech.nymconnect.ui.theme.mint -import kotlinx.coroutines.launch - -@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun MainScreen( - viewModel: MainViewModel = hiltViewModel(), padding: PaddingValues, - snackbarHostState: SnackbarHostState, navController: NavController -) { - - val haptic = LocalHapticFeedback.current - val context = LocalContext.current - val isVisible = rememberSaveable { mutableStateOf(true) } - val scope = rememberCoroutineScope() - - val sheetState = rememberModalBottomSheetState() - var showBottomSheet by remember { mutableStateOf(false) } - val tunnels by viewModel.tunnels.collectAsStateWithLifecycle(mutableListOf()) - val handshakeStatus by viewModel.handshakeStatus.collectAsStateWithLifecycle(HandshakeStatus.NOT_STARTED) - val viewState = viewModel.viewState.collectAsStateWithLifecycle() - var selectedTunnel by remember { mutableStateOf(null) } - val state by viewModel.state.collectAsStateWithLifecycle(Tunnel.State.DOWN) - val tunnelName by viewModel.tunnelName.collectAsStateWithLifecycle("") - - // Nested scroll for control FAB - val nestedScrollConnection = remember { - object : NestedScrollConnection { - override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { - // Hide FAB - if (available.y < -1) { - isVisible.value = false - } - // Show FAB - if (available.y > 1) { - isVisible.value = true - } - return Offset.Zero - } - } - } - - LaunchedEffect(viewState.value) { - if (viewState.value.showSnackbarMessage) { - val result = snackbarHostState.showSnackbar( - message = viewState.value.snackbarMessage, - actionLabel = viewState.value.snackbarActionText, - duration = SnackbarDuration.Long, - ) - when (result) { - SnackbarResult.ActionPerformed -> viewState.value.onSnackbarActionClick - SnackbarResult.Dismissed -> viewState.value.onSnackbarActionClick - } - } - } - - val pickFileLauncher = rememberLauncherForActivityResult( - ActivityResultContracts.GetContent() - ) { file -> - if (file != null) { - viewModel.onTunnelFileSelected(file) - } - } - - Scaffold( - modifier = Modifier.pointerInput(Unit) { - detectTapGestures(onTap = { - selectedTunnel = null - }) - }, - floatingActionButtonPosition = FabPosition.End, - floatingActionButton = { - AnimatedVisibility( - visible = isVisible.value, - enter = slideInVertically(initialOffsetY = { it * 2 }), - exit = slideOutVertically(targetOffsetY = { it * 2 }), - ) { - FloatingActionButton( - modifier = Modifier.padding(bottom = 90.dp), - onClick = { - showBottomSheet = true - }, - containerColor = MaterialTheme.colorScheme.secondary, - shape = RoundedCornerShape(16.dp), - ) { - Icon( - imageVector = Icons.Rounded.Add, - contentDescription = stringResource(id = R.string.add_tunnel), - tint = Color.DarkGray, - ) - } - } - } - ) { - if (tunnels.isEmpty()) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, - modifier = Modifier - .fillMaxSize() - .padding(padding) - ) { - Text(text = stringResource(R.string.no_tunnels), fontStyle = FontStyle.Italic) - } - } - if (showBottomSheet) { - ModalBottomSheet( - onDismissRequest = { - showBottomSheet = false - }, - sheetState = sheetState - ) { - // Sheet content - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { - showBottomSheet = false - pickFileLauncher.launch("*/*") - } - .padding(10.dp) - ) { - Icon( - Icons.Filled.FileOpen, - contentDescription = stringResource(id = R.string.open_file), - modifier = Modifier.padding(10.dp) - ) - Text( - stringResource(id = R.string.add_from_file), - modifier = Modifier.padding(10.dp) - ) - } - Divider() - } - } - Column( - horizontalAlignment = Alignment.Start, - verticalArrangement = Arrangement.Top, - modifier = Modifier - .fillMaxSize() - .padding(padding) - ) { - - LazyColumn( - modifier = Modifier.fillMaxSize() - .nestedScroll(nestedScrollConnection), - ) { - itemsIndexed(tunnels.toList()) { index, tunnel -> - val focusRequester = FocusRequester(); - RowListItem(leadingIcon = Icons.Rounded.Circle, - leadingIconColor = if (tunnelName == tunnel.name) when (handshakeStatus) { - HandshakeStatus.HEALTHY -> mint - HandshakeStatus.UNHEALTHY -> brickRed - HandshakeStatus.NOT_STARTED -> Color.Gray - HandshakeStatus.NEVER_CONNECTED -> brickRed - } else Color.Gray, - text = tunnel.name, - onHold = { - if (state == Tunnel.State.UP && tunnel.name == tunnelName) { - scope.launch { - viewModel.showSnackBarMessage(context.resources.getString(R.string.turn_off_tunnel)) - } - return@RowListItem - } - haptic.performHapticFeedback(HapticFeedbackType.LongPress) - selectedTunnel = tunnel; - }, - onClick = { - if (!WireGuardAutoTunnel.isRunningOnAndroidTv(context)) { - navController.navigate("${Routes.Detail.name}/${tunnel.id}") - } else { - focusRequester.requestFocus() - } - }, - rowButton = { - if (tunnel.id == selectedTunnel?.id) { - Row { - IconButton(onClick = { - navController.navigate("${Routes.Config.name}/${selectedTunnel?.id}") - }) { - Icon(Icons.Rounded.Edit, stringResource(id = R.string.edit)) - } - IconButton( - modifier = Modifier.focusable(), - onClick = { viewModel.onDelete(tunnel) }) { - Icon( - Icons.Rounded.Delete, - stringResource(id = R.string.delete) - ) - } - } - } else { - if (WireGuardAutoTunnel.isRunningOnAndroidTv(context)) { - Row { - IconButton( - modifier = Modifier.focusRequester(focusRequester), - onClick = { - navController.navigate("${Routes.Detail.name}/${tunnel.id}") - }) { - Icon(Icons.Rounded.Info, "Info") - } - IconButton(onClick = { - if (state == Tunnel.State.UP && tunnel.name == tunnelName) - scope.launch { - viewModel.showSnackBarMessage( - context.resources.getString( - R.string.turn_off_tunnel - ) - ) - } else { - navController.navigate("${Routes.Config.name}/${tunnel.id}") - } - }) { - Icon( - Icons.Rounded.Edit, - stringResource(id = R.string.edit) - ) - } - IconButton(onClick = { - if (state == Tunnel.State.UP && tunnel.name == tunnelName) - scope.launch { - viewModel.showSnackBarMessage( - context.resources.getString( - R.string.turn_off_tunnel - ) - ) - } else { - viewModel.onDelete(tunnel) - } - }) { - Icon( - Icons.Rounded.Delete, - stringResource(id = R.string.delete) - ) - } - Switch( - checked = (state == Tunnel.State.UP && tunnel.name == tunnelName), - onCheckedChange = { checked -> - if (checked) viewModel.onTunnelStart(tunnel) else viewModel.onTunnelStop() - } - ) - } - } else { - Switch( - checked = (state == Tunnel.State.UP && tunnel.name == tunnelName), - onCheckedChange = { checked -> - if (checked) viewModel.onTunnelStart(tunnel) else viewModel.onTunnelStop() - } - ) - } - } - }) - } - } - } - } -} diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt deleted file mode 100644 index a88b5adcb9..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt +++ /dev/null @@ -1,179 +0,0 @@ -package net.nymtech.nymconnect.ui.screens.main - -import android.annotation.SuppressLint -import android.app.Application -import android.content.Context -import android.net.Uri -import android.provider.OpenableColumns -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.wireguard.config.BadConfigException -import com.wireguard.config.Config -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.repository.Repository -import net.nymtech.nymconnect.service.foreground.ServiceState -import net.nymtech.nymconnect.service.foreground.ServiceManager -import net.nymtech.nymconnect.service.foreground.WireGuardConnectivityWatcherService -import net.nymtech.nymconnect.service.shortcut.ShortcutsManager -import net.nymtech.nymconnect.service.tunnel.VpnService -import net.nymtech.nymconnect.service.tunnel.model.Settings -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import net.nymtech.nymconnect.ui.ViewState -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch -import timber.log.Timber -import javax.inject.Inject - - -@HiltViewModel -class MainViewModel @Inject constructor(private val application : Application, - private val tunnelRepo : Repository, - private val settingsRepo : Repository, - private val vpnService: VpnService, -) : ViewModel() { - - private val _viewState = MutableStateFlow(ViewState()) - val viewState get() = _viewState.asStateFlow() - val tunnels get() = tunnelRepo.itemFlow - val state get() = vpnService.state - - val handshakeStatus get() = vpnService.handshakeStatus - val tunnelName get() = vpnService.tunnelName - private val _settings = MutableStateFlow(Settings()) - val settings get() = _settings.asStateFlow() - - private val defaultConfigName = { - "tunnel${(Math.random() * 100000).toInt()}" - } - - - init { - viewModelScope.launch { - settingsRepo.itemFlow.collect { - val settings = it.first() - validateWatcherServiceState(settings) - _settings.emit(settings) - } - } - } - - private fun validateWatcherServiceState(settings: Settings) { - val watcherState = ServiceManager.getServiceState(application.applicationContext, WireGuardConnectivityWatcherService::class.java) - if(settings.isAutoTunnelEnabled && watcherState == ServiceState.STOPPED && settings.defaultTunnel != null) { - ServiceManager.startWatcherService(application.applicationContext, settings.defaultTunnel!!) - } - } - - - fun onDelete(tunnel : TunnelConfig) { - viewModelScope.launch { - if(tunnelRepo.count() == 1L) { - ServiceManager.stopWatcherService(application.applicationContext) - val settings = settingsRepo.getAll() - if(!settings.isNullOrEmpty()) { - val setting = settings[0] - setting.defaultTunnel = null - setting.isAutoTunnelEnabled = false - setting.isAlwaysOnVpnEnabled = false - settingsRepo.save(setting) - } - } - tunnelRepo.delete(tunnel) - ShortcutsManager.removeTunnelShortcuts(application.applicationContext, tunnel) - } - } - - fun onTunnelStart(tunnelConfig : TunnelConfig) = viewModelScope.launch { - ServiceManager.startVpnService(application.applicationContext, tunnelConfig.toString()) - } - - fun onTunnelStop() { - ServiceManager.stopVpnService(application.applicationContext) - } - - fun onTunnelFileSelected(uri : Uri) { - try { - val fileName = getFileName(application.applicationContext, uri) - val extension = getFileExtensionFromFileName(fileName) - if(extension != ".conf") { - viewModelScope.launch { - showSnackBarMessage(application.resources.getString(R.string.file_extension_message)) - } - return - } - val stream = application.applicationContext.contentResolver.openInputStream(uri) - stream ?: return - val bufferReader = stream.bufferedReader(charset = Charsets.UTF_8) - val config = Config.parse(bufferReader) - val tunnelName = getNameFromFileName(fileName) - saveTunnel(TunnelConfig(name = tunnelName, wgQuick = config.toWgQuickString())) - stream.close() - } catch(_: BadConfigException) { - viewModelScope.launch { - showSnackBarMessage(application.applicationContext.getString(R.string.bad_config)) - } - } - } - - private fun saveTunnel(tunnelConfig : TunnelConfig) { - viewModelScope.launch { - tunnelRepo.save(tunnelConfig) - ShortcutsManager.createTunnelShortcuts(application.applicationContext, tunnelConfig) - } - } - - @SuppressLint("Range") - private fun getFileName(context: Context, uri: Uri): String { - if (uri.scheme == "content") { - val cursor = try { - context.contentResolver.query(uri, null, null, null, null) - } catch (e : Exception) { - Timber.d("Exception getting config name") - null - } - cursor ?: return defaultConfigName() - cursor.use { - if(cursor.moveToFirst()) { - return cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)) - } - } - } - return defaultConfigName() - } - - suspend fun showSnackBarMessage(message : String) { - _viewState.emit(_viewState.value.copy( - showSnackbarMessage = true, - snackbarMessage = message, - snackbarActionText = "Okay", - onSnackbarActionClick = { - viewModelScope.launch { - dismissSnackBar() - } - } - )) - delay(3000) - dismissSnackBar() - } - - private suspend fun dismissSnackBar() { - _viewState.emit(_viewState.value.copy( - showSnackbarMessage = false - )) - } - - private fun getNameFromFileName(fileName : String) : String { - return fileName.substring(0 , fileName.lastIndexOf('.') ) - } - - private fun getFileExtensionFromFileName(fileName : String) : String { - return try { - fileName.substring(fileName.lastIndexOf('.')) - } catch (e : Exception) { - "" - } - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt deleted file mode 100644 index 4616a8fd9a..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt +++ /dev/null @@ -1,415 +0,0 @@ -package net.nymtech.nymconnect.ui.screens.settings - -import android.Manifest -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.provider.Settings -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ExperimentalLayoutApi -import androidx.compose.foundation.layout.FlowRow -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.foundation.verticalScroll -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close -import androidx.compose.material.icons.outlined.Add -import androidx.compose.material.icons.rounded.LocationOff -import androidx.compose.material3.Button -import androidx.compose.material3.DropdownMenuItem -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ExposedDropdownMenuBox -import androidx.compose.material3.ExposedDropdownMenuDefaults -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.SnackbarDuration -import androidx.compose.material3.SnackbarHostState -import androidx.compose.material3.SnackbarResult -import androidx.compose.material3.Switch -import androidx.compose.material3.Text -import androidx.compose.material3.TextField -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.input.ImeAction -import androidx.compose.ui.text.input.KeyboardCapitalization -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.navigation.NavController -import com.google.accompanist.permissions.ExperimentalPermissionsApi -import com.google.accompanist.permissions.isGranted -import com.google.accompanist.permissions.rememberPermissionState -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.WireGuardAutoTunnel -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import net.nymtech.nymconnect.ui.Routes -import net.nymtech.nymconnect.ui.common.ClickableIconButton -import kotlinx.coroutines.launch - -@OptIn(ExperimentalMaterial3Api::class, ExperimentalPermissionsApi::class, - ExperimentalLayoutApi::class -) -@Composable -fun SettingsScreen( - viewModel: SettingsViewModel = hiltViewModel(), - padding: PaddingValues, - navController: NavController, - focusRequester: FocusRequester, - snackbarHostState: SnackbarHostState = remember { SnackbarHostState() } -) { - - val scope = rememberCoroutineScope() - val context = LocalContext.current - val focusManager = LocalFocusManager.current - val interactionSource = remember { MutableInteractionSource() } - - var expanded by remember { mutableStateOf(false) } - val viewState by viewModel.viewState.collectAsStateWithLifecycle() - val settings by viewModel.settings.collectAsStateWithLifecycle() - val trustedSSIDs by viewModel.trustedSSIDs.collectAsStateWithLifecycle() - val tunnels by viewModel.tunnels.collectAsStateWithLifecycle(mutableListOf()) - val backgroundLocationState = - rememberPermissionState(Manifest.permission.ACCESS_BACKGROUND_LOCATION) - val fineLocationState = rememberPermissionState(Manifest.permission.ACCESS_FINE_LOCATION) - var currentText by remember { mutableStateOf("") } - val scrollState = rememberScrollState() - var isLocationServicesEnabled by remember { mutableStateOf(viewModel.checkLocationServicesEnabled())} - - LaunchedEffect(viewState) { - if (viewState.showSnackbarMessage) { - val result = snackbarHostState.showSnackbar( - message = viewState.snackbarMessage, - actionLabel = viewState.snackbarActionText, - duration = SnackbarDuration.Long, - ) - when (result) { - SnackbarResult.ActionPerformed -> viewState.onSnackbarActionClick - SnackbarResult.Dismissed -> viewState.onSnackbarActionClick - } - } - } - - fun saveTrustedSSID() { - if (currentText.isNotEmpty()) { - scope.launch { - viewModel.onSaveTrustedSSID(currentText) - currentText = "" - } - } - } - - fun openSettings() { - scope.launch { - val intentSettings = - Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - intentSettings.data = - Uri.fromParts("package", context.packageName, null) - context.startActivity(intentSettings) - } - } - - if(!backgroundLocationState.status.isGranted && Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { - Column(horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Top, - modifier = Modifier - .fillMaxSize() - .verticalScroll(scrollState) - .padding(padding)) { - Icon(Icons.Rounded.LocationOff, contentDescription = stringResource(id = R.string.map), modifier = Modifier - .padding(30.dp) - .size(128.dp)) - Text(stringResource(R.string.prominent_background_location_title), textAlign = TextAlign.Center, modifier = Modifier.padding(30.dp), fontSize = 20.sp) - Text(stringResource(R.string.prominent_background_location_message), textAlign = TextAlign.Center, modifier = Modifier.padding(30.dp), fontSize = 15.sp) - Row( - modifier = if(WireGuardAutoTunnel.isRunningOnAndroidTv(context)) Modifier - .fillMaxWidth() - .padding(10.dp) else Modifier - .fillMaxWidth() - .padding(30.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceEvenly - ) { - Button(onClick = { - navController.navigate(Routes.Main.name) - }) { - Text(stringResource(id = R.string.no_thanks)) - } - Button(modifier = Modifier.focusRequester(focusRequester), onClick = { - openSettings() - }) { - Text(stringResource(id = R.string.turn_on)) - } - } - } - return - } - - if(!fineLocationState.status.isGranted) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, - modifier = Modifier - .fillMaxSize() - .padding(padding) - ) { - Text( - stringResource(id = R.string.precise_location_message), - textAlign = TextAlign.Center, - modifier = Modifier.padding(15.dp), - fontStyle = FontStyle.Italic - ) - Button(modifier = Modifier.focusRequester(focusRequester),onClick = { - fineLocationState.launchPermissionRequest() - }) { - Text(stringResource(id = R.string.request)) - } - - } - return - } - - if (tunnels.isEmpty()) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, - modifier = Modifier - .fillMaxSize() - .padding(padding) - ) { - Text( - stringResource(R.string.one_tunnel_required), - textAlign = TextAlign.Center, - modifier = Modifier.padding(15.dp), - fontStyle = FontStyle.Italic - ) - } - return - } - if(!isLocationServicesEnabled && Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, - modifier = Modifier - .fillMaxSize() - .padding(padding) - ) { - Text( - stringResource(id = R.string.location_services_not_detected), - textAlign = TextAlign.Center, - modifier = Modifier.padding(15.dp), - fontStyle = FontStyle.Italic - ) - Button(modifier = Modifier.focusRequester(focusRequester), onClick = { - val locationServicesEnabled = viewModel.checkLocationServicesEnabled() - isLocationServicesEnabled = locationServicesEnabled - if(!locationServicesEnabled) { - scope.launch { - viewModel.showSnackBarMessage(context.getString(R.string.detecting_location_services_disabled)) - } - } - }) { - Text(stringResource(id = R.string.check_again)) - } - } - return - } - val screenPadding = if(WireGuardAutoTunnel.isRunningOnAndroidTv(context)) 5.dp else 15.dp - Column( - horizontalAlignment = Alignment.Start, - verticalArrangement = Arrangement.Top, - modifier = if(WireGuardAutoTunnel.isRunningOnAndroidTv(context)) Modifier - .fillMaxHeight(.85f) - .fillMaxWidth() - .verticalScroll(scrollState) - .clickable(indication = null, interactionSource = interactionSource) { - focusManager.clearFocus() - } - .padding(padding) else Modifier - .fillMaxSize() - .verticalScroll(scrollState) - .clickable(indication = null, interactionSource = interactionSource) { - focusManager.clearFocus() - } - .padding(padding) - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(screenPadding), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text(stringResource(R.string.enable_auto_tunnel)) - Switch( - modifier = Modifier.focusRequester(focusRequester), - enabled = !settings.isAlwaysOnVpnEnabled, - checked = settings.isAutoTunnelEnabled, - onCheckedChange = { - scope.launch { - viewModel.toggleAutoTunnel() - } - } - ) - } - Text( - stringResource(id = R.string.select_tunnel), - textAlign = TextAlign.Center, - modifier = Modifier.padding(screenPadding, bottom = 5.dp, top = 5.dp) - ) - ExposedDropdownMenuBox( - expanded = expanded, - onExpandedChange = { - if(!(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled)) { - expanded = !expanded }}, - modifier = Modifier.padding(start = 15.dp, top = 5.dp, bottom = 10.dp).clickable { - expanded = !expanded - }, - ) { - TextField( - enabled = !(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled), - value = settings.defaultTunnel?.let { - TunnelConfig.from(it).name } - ?: "", - readOnly = true, - modifier = Modifier.menuAnchor(), - label = { Text(stringResource(R.string.tunnels)) }, - onValueChange = { }, - trailingIcon = { - ExposedDropdownMenuDefaults.TrailingIcon( - expanded = expanded - ) - } - ) - ExposedDropdownMenu( - expanded = expanded, - onDismissRequest = { - expanded = false - } - ) { - tunnels.forEach() { tunnel -> - DropdownMenuItem( - onClick = { - scope.launch { - viewModel.onDefaultTunnelSelected(tunnel) - } - expanded = false - }, - text = { Text(text = tunnel.name) } - ) - } - } - } - Text( - stringResource(R.string.trusted_ssid), - textAlign = TextAlign.Center, - modifier = Modifier.padding(screenPadding, bottom = 5.dp, top = 5.dp) - ) - FlowRow( - modifier = Modifier.padding(screenPadding), - horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalArrangement = Arrangement.SpaceEvenly - ) { - trustedSSIDs.forEach { ssid -> - ClickableIconButton(onIconClick = { - scope.launch { - viewModel.onDeleteTrustedSSID(ssid) - } - }, text = ssid, icon = Icons.Filled.Close, enabled = !(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled)) - } - } - OutlinedTextField( - enabled = !(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled), - value = currentText, - onValueChange = { currentText = it }, - label = { Text(stringResource(R.string.add_trusted_ssid)) }, - modifier = Modifier.padding(start = screenPadding, top = 5.dp), - maxLines = 1, - keyboardOptions = KeyboardOptions( - capitalization = KeyboardCapitalization.None, - imeAction = ImeAction.Done - ), - keyboardActions = KeyboardActions( - onDone = { - saveTrustedSSID() - } - ), - trailingIcon = { - IconButton(onClick = { saveTrustedSSID() }) { - Icon( - imageVector = Icons.Outlined.Add, - contentDescription = if (currentText == "") stringResource(id = R.string.trusted_ssid_empty_description) else stringResource( - id = R.string.trusted_ssid_value_description - ), - tint = if(currentText == "") Color.Transparent else Color.Green - ) - } - }, - ) - Row( - modifier = Modifier - .fillMaxWidth() - .padding(screenPadding), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text(stringResource(R.string.tunnel_mobile_data)) - Switch( - enabled = !(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled), - checked = settings.isTunnelOnMobileDataEnabled, - onCheckedChange = { - scope.launch { - viewModel.onToggleTunnelOnMobileData() - } - } - ) - } - Row( - modifier = Modifier - .fillMaxWidth() - .padding(screenPadding), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text(stringResource(R.string.always_on_vpn_support)) - Switch( - enabled = !settings.isAutoTunnelEnabled, - checked = settings.isAlwaysOnVpnEnabled, - onCheckedChange = { - scope.launch { - viewModel.onToggleAlwaysOnVPN() - } - } - ) - } - } -} - - diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt deleted file mode 100644 index 7143c1b4b6..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt +++ /dev/null @@ -1,124 +0,0 @@ -package net.nymtech.nymconnect.ui.screens.settings - -import android.app.Application -import android.content.Context -import android.location.LocationManager -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import net.nymtech.nymconnect.R -import net.nymtech.nymconnect.repository.Repository -import net.nymtech.nymconnect.service.foreground.ServiceManager -import net.nymtech.nymconnect.service.tunnel.model.Settings -import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig -import net.nymtech.nymconnect.ui.ViewState -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch -import javax.inject.Inject - - -@HiltViewModel -class SettingsViewModel @Inject constructor(private val application : Application, - private val tunnelRepo : Repository, private val settingsRepo : Repository -) : ViewModel() { - - private val _trustedSSIDs = MutableStateFlow(emptyList()) - val trustedSSIDs = _trustedSSIDs.asStateFlow() - private val _settings = MutableStateFlow(Settings()) - val settings get() = _settings.asStateFlow() - val tunnels get() = tunnelRepo.itemFlow - private val _viewState = MutableStateFlow(ViewState()) - val viewState get() = _viewState.asStateFlow() - - init { - checkLocationServicesEnabled() - viewModelScope.launch { - settingsRepo.itemFlow.collect { - val settings = it.first() - _settings.emit(settings) - _trustedSSIDs.emit(settings.trustedNetworkSSIDs.toList()) - } - } - } - - suspend fun onSaveTrustedSSID(ssid: String) { - val trimmed = ssid.trim() - if (!_settings.value.trustedNetworkSSIDs.contains(trimmed)) { - _settings.value.trustedNetworkSSIDs.add(trimmed) - settingsRepo.save(_settings.value) - } else { - showSnackBarMessage("SSID already exists.") - } - } - - suspend fun onDefaultTunnelSelected(tunnelConfig: TunnelConfig) { - settingsRepo.save(_settings.value.copy( - defaultTunnel = tunnelConfig.toString() - )) - } - - suspend fun onToggleTunnelOnMobileData() { - settingsRepo.save(_settings.value.copy( - isTunnelOnMobileDataEnabled = !_settings.value.isTunnelOnMobileDataEnabled - )) - } - - suspend fun onDeleteTrustedSSID(ssid: String) { - _settings.value.trustedNetworkSSIDs.remove(ssid) - settingsRepo.save(_settings.value) - } - - suspend fun toggleAutoTunnel() { - if(_settings.value.defaultTunnel.isNullOrEmpty() && !_settings.value.isAutoTunnelEnabled) { - showSnackBarMessage(application.getString(R.string.select_tunnel_message)) - return - } - if(_settings.value.isAutoTunnelEnabled) { - ServiceManager.stopWatcherService(application) - } else { - if(_settings.value.defaultTunnel != null) { - val defaultTunnel = _settings.value.defaultTunnel - ServiceManager.startWatcherService(application, defaultTunnel!!) - } - } - settingsRepo.save(_settings.value.copy( - isAutoTunnelEnabled = !_settings.value.isAutoTunnelEnabled - )) - } - - suspend fun showSnackBarMessage(message : String) { - _viewState.emit(_viewState.value.copy( - showSnackbarMessage = true, - snackbarMessage = message, - snackbarActionText = "Okay", - onSnackbarActionClick = { - viewModelScope.launch { - dismissSnackBar() - } - } - )) - } - - private suspend fun dismissSnackBar() { - _viewState.emit(_viewState.value.copy( - showSnackbarMessage = false - )) - } - - suspend fun onToggleAlwaysOnVPN() { - if(_settings.value.defaultTunnel != null) { - _settings.emit( - _settings.value.copy(isAlwaysOnVpnEnabled = !_settings.value.isAlwaysOnVpnEnabled) - ) - settingsRepo.save(_settings.value) - } else { - showSnackBarMessage(application.getString(R.string.select_tunnel_message)) - } - } - fun checkLocationServicesEnabled() : Boolean { - val locationManager = - application.getSystemService(Context.LOCATION_SERVICE) as LocationManager - return locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt deleted file mode 100644 index 31fc9dbf6a..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt +++ /dev/null @@ -1,83 +0,0 @@ -package net.nymtech.nymconnect.ui.screens.support - -import android.content.Intent -import android.content.pm.PackageManager -import android.net.Uri -import androidx.compose.foundation.clickable -import androidx.compose.foundation.focusable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextDecoration -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import net.nymtech.nymconnect.R - -@Composable -fun SupportScreen(padding : PaddingValues, focusRequester: FocusRequester) { - - val context = LocalContext.current - - fun openWebPage(url: String) { - val webpage: Uri = Uri.parse(url) - val intent = Intent(Intent.ACTION_VIEW, webpage) - context.startActivity(intent) - } - - Column(horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Top, - modifier = Modifier - .fillMaxSize() - .verticalScroll(rememberScrollState()) - .focusable() - .padding(padding)) { - Text(stringResource(R.string.support_text), textAlign = TextAlign.Center, modifier = Modifier.padding(30.dp), fontSize = 15.sp) - Row( - modifier = Modifier - .fillMaxWidth() - .padding(14.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceEvenly - ) { - IconButton(onClick = { - openWebPage(context.resources.getString(R.string.discord_url)) - }) { - Icon(imageVector = ImageVector.vectorResource(R.drawable.discord), "Discord") - } - IconButton(modifier = Modifier.focusRequester(focusRequester),onClick = { - openWebPage(context.resources.getString(R.string.github_url)) - }) { - Icon(imageVector = ImageVector.vectorResource(R.drawable.github), "Github") - } - } - Spacer(modifier = Modifier.weight(1f)) - Text(stringResource(id = R.string.privacy_policy), style = TextStyle(textDecoration = TextDecoration.Underline), - modifier = Modifier.clickable { - openWebPage(context.resources.getString(R.string.privacy_policy_url)) - }) - Text("App version: ${net.nymtech.nymconnect.BuildConfig.VERSION_NAME}", Modifier.padding(25.dp)) - } - } \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt deleted file mode 100644 index 3561a75512..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt +++ /dev/null @@ -1,17 +0,0 @@ -package net.nymtech.nymconnect.ui.theme - -import androidx.compose.ui.graphics.Color - -val Purple80 = Color(0xFFD0BCFF) -val PurpleGrey80 = Color(0xFFCCC2DC) -val Pink80 = Color(0xFF492532) -val virdigris = Color(0xFF5BC0BE) - -val Purple40 = Color(0xFF6650a4) -val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFFFFFFFF) - -//status colors -val brickRed = Color(0xFFCE4257) -val pinkRed = Color(0xFFEF476F) -val mint = Color(0xFF52B788) diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt deleted file mode 100644 index 647ad9f2ad..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt +++ /dev/null @@ -1,80 +0,0 @@ -package net.nymtech.nymconnect.ui.theme - -import android.app.Activity -import android.os.Build -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.darkColorScheme -import androidx.compose.material3.dynamicDarkColorScheme -import androidx.compose.material3.dynamicLightColorScheme -import androidx.compose.material3.lightColorScheme -import androidx.compose.runtime.Composable -import androidx.compose.runtime.SideEffect -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.toArgb -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalView -import androidx.core.view.WindowCompat - -private val DarkColorScheme = darkColorScheme( - //primary = Purple80, - primary = virdigris, - secondary = virdigris, - // secondary = PurpleGrey80, - tertiary = virdigris - //tertiary = Pink80 -) - -private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40 - - /* Other default colors to override - background = Color(0xFFFFFBFE), - surface = Color(0xFFFFFBFE), - onPrimary = Color.White, - onSecondary = Color.White, - onTertiary = Color.White, - onBackground = Color(0xFF1C1B1F), - onSurface = Color(0xFF1C1B1F), - */ -) - -@Composable -fun WireguardAutoTunnelTheme( - //force dark theme - darkTheme : Boolean = true, - //darkTheme: Boolean = isSystemInDarkTheme(), - // Dynamic color is available on Android 12+ - //turning off dynamic color for now - dynamicColor: Boolean = false, - content: @Composable () -> Unit -) { - - val colorScheme = when { - dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { - val context = LocalContext.current - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) - } - - darkTheme -> DarkColorScheme - else -> LightColorScheme - } - val view = LocalView.current - if (!view.isInEditMode) { - SideEffect { - val window = (view.context as Activity).window - WindowCompat.setDecorFitsSystemWindows(window, false) - window.statusBarColor = Color.Transparent.toArgb() - window.navigationBarColor = Color.Transparent.toArgb() - WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars = !darkTheme - WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightNavigationBars = !darkTheme - } - } - - MaterialTheme( - colorScheme = colorScheme, - typography = Typography, - content = content - ) -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt deleted file mode 100644 index 6a1c35331c..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt +++ /dev/null @@ -1,22 +0,0 @@ -package net.nymtech.nymconnect.ui.theme - -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.ui.graphics.Color -import com.google.accompanist.systemuicontroller.rememberSystemUiController - -@Composable -fun TransparentSystemBars() { - val systemUiController = rememberSystemUiController() - val useDarkIcons = !isSystemInDarkTheme() - - DisposableEffect(systemUiController, useDarkIcons) { - systemUiController.setSystemBarsColor( - color = Color.Transparent, - darkIcons = useDarkIcons - ) - - onDispose {} - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt deleted file mode 100644 index 6b89a8e327..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt +++ /dev/null @@ -1,34 +0,0 @@ -package net.nymtech.nymconnect.ui.theme - -import androidx.compose.material3.Typography -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.sp - -// Set of Material typography styles to start with -val Typography = Typography( - bodyLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 16.sp, - lineHeight = 24.sp, - letterSpacing = 0.5.sp - ) - /* Other default text styles to override - titleLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 22.sp, - lineHeight = 28.sp, - letterSpacing = 0.sp - ), - labelSmall = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Medium, - fontSize = 11.sp, - lineHeight = 16.sp, - letterSpacing = 0.5.sp - ) - */ -) \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/NumberUtils.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/NumberUtils.kt deleted file mode 100644 index aa240e6eb2..0000000000 --- a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/NumberUtils.kt +++ /dev/null @@ -1,25 +0,0 @@ -package net.nymtech.nymconnect.util - -import java.math.BigDecimal -import java.text.DecimalFormat -import java.time.Duration -import java.time.Instant - -object NumberUtils { - - private const val BYTES_IN_KB = 1024L - - fun bytesToKB(bytes : Long) : BigDecimal { - return bytes.toBigDecimal().divide(BYTES_IN_KB.toBigDecimal()) - } - - fun formatDecimalTwoPlaces(bigDecimal: BigDecimal) : String { - val df = DecimalFormat("#.##") - return df.format(bigDecimal) - } - - fun getSecondsBetweenTimestampAndNow(epoch : Long) : Long { - val time = Instant.ofEpochMilli(epoch) - return Duration.between(time, Instant.now()).seconds - } -} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/drawable/discord.xml b/nym-vpn/android/app/src/main/res/drawable/discord.xml deleted file mode 100644 index df43339353..0000000000 --- a/nym-vpn/android/app/src/main/res/drawable/discord.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/nym-vpn/android/app/src/main/res/drawable/github.xml b/nym-vpn/android/app/src/main/res/drawable/github.xml deleted file mode 100644 index 32f8254ebe..0000000000 --- a/nym-vpn/android/app/src/main/res/drawable/github.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/nym-vpn/android/app/src/main/res/drawable/ic_launcher_background.xml b/nym-vpn/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9cbf..0000000000 --- a/nym-vpn/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/nym-vpn/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/nym-vpn/android/app/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1146..0000000000 --- a/nym-vpn/android/app/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/drawable/shield.xml b/nym-vpn/android/app/src/main/res/drawable/shield.xml deleted file mode 100644 index e49a1f265d..0000000000 --- a/nym-vpn/android/app/src/main/res/drawable/shield.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/nym-vpn/android/app/src/main/res/drawable/vpn_off.xml b/nym-vpn/android/app/src/main/res/drawable/vpn_off.xml deleted file mode 100644 index d33949b74b..0000000000 --- a/nym-vpn/android/app/src/main/res/drawable/vpn_off.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/nym-vpn/android/app/src/main/res/drawable/vpn_on.xml b/nym-vpn/android/app/src/main/res/drawable/vpn_on.xml deleted file mode 100644 index 1339fb3b8b..0000000000 --- a/nym-vpn/android/app/src/main/res/drawable/vpn_on.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml deleted file mode 100644 index cf3108b364..0000000000 --- a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 036d09bc5f..0000000000 --- a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 036d09bc5f..0000000000 --- a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index 52206777aa3245f61ae885e0825057c0550c2f0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2004 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 diff --git a/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp deleted file mode 100644 index 106e0e13cc5996f9e412a6277c365a55550b330d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1926 zcmV;12YL8XNk&F~2LJ$9MM6+kP&iC+2LJ#sYrq;1HPN;9|Mca|eZ;nt+O}=mw(T6- z=FBnvzwa-;fn1OFckexG?S0zhH|S3HX`|8=FJii^wPUu^#kmICcDk%oPAYY?(wViZ zL6vIyu(QqDMrYeem7H$6X_MBr*`_pZVpgssg>2il)3!=}vVUWCm?K-Z&OTC@p}ow^ z%*;$r%pkdqBuSFII;#X9Ay+8~ZQHi7c`|3)wr$(C-A#a+ ze1MX4A@*7zUGomf$xZN?0Ku1WqTgBa3c<-na3h`RWi}EF1bZfQe}&}@0;x&x3?FuH zRuK&dcIEVwY&&Bm|4R^WyO>3SO$nWR1j`8i11^-iQve8_3r@$0yq_SOA#w(icH{Ym zrj=^z6Racn0{}S+Pp_aQxF%R%(My6EnWVHZDQ77nw*Z0tKx@r~mq$|f+El2_>TBr8_=TmTU5DT$@t!9*@I9f239cRr0P|Uj*lP~HL1jq52lUn;!{)msrILQ54~sK6Y9(CT?Gyu9*oaITovtP1i&IVYxTxX8sDO6H%$?3W4z&emFRS$Ce^^WzM7^MlVuWk|8TCCQ{Oi z8F6jm>%`U=Az3|-UmU>&OA$OmOotw)BfMM@<%%p5S*>2WV+5?2Do2c9)|mZa4wdqO zOo^`#fcQp5l#3(SVW~Bcrt$2oG8>%`S7RW#JSEY!imKM&Sfl8rm(s7{4#$wkB4$>M zhg-P{AYGPU0D!nUk(J^ImRL$+4}yO+BL;}6Rdf}d!H-{R`tztN`*5nxK03Sok*fjl zj*9?F`sWJ3u6uF><18h(D~rl7N22P?!>Rt?qqd(n$7%b~k)zl!2MpZAg$1MvUIMV^ zuAEfc+)@NHb^L<*-#}`gT7TV~)}9_|y%NlzCoa`w9!~emi@RIHRA_tkN;UvRLB_}vw4`vmRb9-hK@!R#)>Eh#gUu7L=5A zbQaZnxw`)kCwx&FwEFCD`n+&q5}SmT3cxQ(nw*rZgu;rT?!ukcQUnjpC5+2?B}c>b zcJbo0|KNiuvmFeQ+C~;5SjG9}%0Se-oNE6+zz%%!;;`g_j58x2*syTZ$7f zQrTiff_vr+2Coa)ZR92?5{BUY1mYWK4@#=-%@vUhC)QeXR|rz z?=6O4va-o(|6^i#bvAi-eyzc?LtY~_RIl(0RSGa^T(sM zUyp^W7>HaH^ob2uw)qpm2~B2#k6++tiKuYPW=W%pomSMm21z4i8IkjXKEa(dk#PG^ z!lWF*UjSJt!!(x833owzi6CH5a2hH*6)+1xil&3*>kgewm@yp$FmQ~r)y!d{4+HQG z_*s|?rrpJBq~_Yor$i64SCTS|rMzSO1{uC{JL%UJA%n|1^f{4yFJo@6jJwyg=|#PzotK9*6$q*a`eBn=o!R z&~7VfYAbu*o7ih^Yvvm_yEFvuKI*1{jatJELsbvSmkW(c$cMFt83me`ViC z|D%aDD-tV3u=2_)CrAcvuW#@rVS6b%U+G!s=Mo-nf#9pqX{zk~{HyeG6rOJVe5SH{ z(MyD+-KevSo0a{7lTF!wMS_{@XilTll$ebK7s@0cPn4t$!583d7pIQOD_uxYNqbh( MZk0*0tH~@60R0}G`2YX_ diff --git a/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp deleted file mode 100644 index c388f6dae5a66dd7133c1c43af5f493e7a735579..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2242 zcmV;z2tD^wNk&Gx2mkZJ3xp?HvjcF#*l+iB`GU z{x_2H$9uQCvpXZ<2?=R}R_MQiyBld|JNP%iLwc7}1QAvIo{e$wnUoIh3Lv}`8`DBT14|`|@XYBo4*t zBX%{Y~f&bDoOkFCv|_2QVBr3|--%yKfVfCjj(4{L%BsNgh! zM-=m>hnx-^I*lZ-{|ApikZt1+@>?!d{mcB*U;r#xt}Gh9FJnHm*|rc)B}|BR(bbvt&dEKg+-jz{};aX!q7 zXx~<8{RxPd5o#!c-b1G$N%(rKmasjSOpq*PtJ&|VvhT<7It$`h8hK9F^zgnz6zT6w zPjk1bt;j2b2Md&ml}ssEIJ`5X(X6DuS#ds&;Q0SL1rJy3j}4-Jg`Byf7CMTA+KxU5 z3Sv}cbQzR-ebQz`di9Rcm7xg(01O0-3IJfk=*fP5Hhe5}7e4@O2pO*pbqH!RptX3GgOz|9K&{7Q+)ytVt!8v5;bOtb z#^68zfW)LqmWD|H@K(yqV5X4CfRRA17689QrM@$u$txVCv2AI*4GBQ?=LI1ahF>xj zp&SBZ000-N%4<*b?-T9k6h3$YVvt<*l1vmn3J@yS3V>U_622Ocz~5etTTb^>7)$dK za>{Nk0FWzqs6+780ayU-MR##=W6MIhRY2>~#v zuUxLQvtVz?r?~Iu0N+gFsUx*@SZx6BlRa7YegVI01o#Wg4Wv+uD89D{Kn=bba_#Iy z?SvKO$GkHGz-NK|HqUGUns9w zB@WpU_sz)Oc61DCj(tQeCIvwV3KRHcq6i(HACZ2KSjM(wp5n~G~w>TnFW9bb7B|sc}O5J`C|wee+{alSf8eh0?>2x;=kMdgCoJC*+>wr`i90r z079S#KpU=jZ->P4IYz+Rit~>0VGP1lUwPJIo=hpQq3S#+O=hI}W2S$m2v zKIPY!bFl!xBx;K|KbbUhTIQP1;bd6_$9d9tu|Ci6+JK2;CJR?T^F%sw!!dy(xQ+x0xlR`sgv5Bk^Ec}qq=68wHoPpjghIlm)g+R@=N5s^ zj%~wJfi61ZFD&>hFarP~xLRNd)CevvAbpwn4;0D#H))1t4a*$!7)V8Gp?QDj{DgiT znPcE^7NN9CWx~OQk^+z^HID@h2}H<^ZYZk5mu@r^p@+s22p-E@H6D^at<$#@9BRAN z7MvWYNbo{9h&36nALvTwteS5&{EiWX{yNoVQ{rb^91J*<@OJQ9%1_r#(c)duM zpFcV$NR+48mM5EFQD3?wTgnG>D33XidBGqktqQa-0EK}ClSHnwWw*8_@@tZbAmGUl z%N#ZYhG#XUrV5oL&o;O@1gYtub8ck5S|pCDNwcQytJQtd2%@|hPjBcKYyNlOn5K>11Zgg(2u9@w>uHn;ifq#+@)JfE(1i>HKQptvuc&2?3Aj}g zO-#X@rZ7oW`!O`t#2|e?(ZsFV)gI+LPQEw-lVF~+>I+Mo0=Q9AxB(!&p0yeX76+~4 zNIWhR1SG2|v)nt}63t`Us`{zbHTEsJO=jB7sjZ9SgsVRrR4zhyKz9x(M?2 z%+|9nKdjkJFdMw|xWqq~TLju*U(X2GjE2XkQ_t1Q?)CHyZn|Y-E)mz53mp04Ze1df Q3Dna|FWs`0M)6J<0KA+ky8r+H diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner.png b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner.png deleted file mode 100644 index fbd39f501dd7a23fb706d9c597bdec9b3c511e5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3578 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 BaRvYY diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png deleted file mode 100644 index 634417a64034f28adeff6c7c3c5b29d0a2fb2908..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3770 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 O>pytM>i)0$zdmieM{+&@ diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index c89a4abd0e7daace668cc1a0b61de43fff99bf6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5030 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 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index bf191eb8171c41c8f46e66be48b647099254f843..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4246 zcmV;H5NYpHNk&GF5C8yIMM6+kP&iD25C8x#kH8}kRfpQPZ5aFix1C<*h?oGDBf$@C z;NR31$J({_f4$}8M&j=7?(X9=ad&qgx8v^ae&)zNeslld@Auz3`R&LhOci|U>2NNA zQ{gZj?o5Sru9db{Wi9W%3#UtkOqbjMZX1iIB0Ub3vu_|J7CCDj>U7uzc&Y8FsB}8y zis2;Wn8ey@^rZC z6|iy%xWui-sobG*sis6Kr?+b3+PT9X+~u5V7G)Moq5yzqYTftUVam;|8D~zbYumPM z+w3W9+qTK-{|7gb`ac13;{TUj<@eaP?0ZgF{434L+&|U!pNWlFVC!CsuNXQrvB9E% z>Xe8;0SZvEcKCQg5D^iSuch2UMl59Jl<#@q`Tz-=iQ6Fn7pS0*kSF45ppJ-tiGsDK zrbR?dq(ek>M8$Q00Yu!Hw_12E7`AO2IYqg>2T~+Sj^un;S46FTo<0^w;NV!>cFY;u zwr$&5f<4t#o+K-9s$?%YDW?xh+v%Mj-vsbcY5^>O1Mr^jq=5wf364p0zBGu>%!fd! zx+zQlRa^eA8jnBTzmLr9H-u$ht*)v)RX3_WRsE~_^Z0X|IQ#0k&$a<9*O*pyrV5bx zsm2UjZI)}MVN5llsY*l@N?u|QZ-KS={T*?JNuo^`2U{>2Z6VMWv;`V7Dgd+8G zw%}q^^<^H=^1zhyJ8j+8)-R5;@7k*cQKJ$yrG%1C;TRxl2s7_G`}C9(N<2kF4Iw~I zKY1uhT;m;pq$B<0r6_St9997onj&v1GlSblf&g5v7TU=+CGVGExE&(Z{!$^%_eKBs(bAvUWA=KW&Y)%J`Z3PRpP(!VHk; zOQRb$T0(%4IuXslX)Oh>~|GUQ|8a8Ma5VBIIS(FM^WXp8eSkqt0ZO`%;s0CzSFMu zzAJj2a$a8fZ&UHxRP!)(U3A)=YHy}=dNMIW7e%^eF@a zP?xeq&-4R5HZlP<~bY3 zlBnRpBC;4USR+bit|-|kiDyTO+(pKZYIu-{h?dq}+E*lmBP4HVp4_3lzC7*7m({pX zfiQs|T)|sC9cM!{WT9H02Pq<=YA>HxAtJsfCxRafOV`7p=E2qwRc#c1>eA1YA}%iO zm%mJpbDGBe%^BAi(iqklv2}g(8QUidZNFY51p6e`F$mAWCY}i;r(dEC2 zV3W``>GXnN&I`SaA+{I~)SZtdQ@ALlmoPz=pS8MF#eq0hXJZvBc+T?u7zoyJmqQ5R z=r=eo!>Cm}4-cS?g_K4v7PhwLQUTQQx*SPCs6>V&emMklZO$Pj;W7Q@W{?1ibK!SN zmI#4ud(((BX^+(a6d%d3BhHw5x1It}&c~!TN%fSwkL=h_4)wuU5(_Zh@(ELw7&;X^G;c$T#HrQ4)vYf#6E%ric?0y0SzLq zl_BF`@}cihWn5fNisS}qO58@7jbu5g81+C`}d@|&T$WFYv`uI~!8 z7?l=RiVvm!jRYW-nQ4~=*kmFS3(g6UYPXR-p(&zkR)V!c>*~75Y%BM(Bmy=j7S=_o z;6sY>0h|I^o+C~*CqSy*iY4KV0V;Z%APa^;-EawA_?xdi{^H_(sgK%(ziEQ+VSs!6 z6eos}hHgljuSXGp!H{a%>?}~kq%CMgPq+-h-5|ZUZW7CG#gEa4A-lPq`5U4hI#xr? ziK&#bxOO4fv3*V2HmiCZPxal9TVE)k;@9>pK#S6><8lC+ zU2obzaZ`x8YO3Al#iwp5i>`)K0~0Jl!{qw~kbJ*skrJo%p%C?n)$&5^SXCAohEfBS zKM%`C03O89@2f;PR8{Z-Ivq4_34@KP@lfs=M=ia)b{=X=5=^SE=?cG?UI1xpvX_@xnK zUK2!9ls5Iv*M_-Ie(l|sMn>VXz5D>_(`zTRFInEl z@MSFPrVvAx0FF(m@O=Uu5J#ScHaKC$y*!5j5!;l~{w|Q^PaC){&_+<;67E8ZNZ=)0tu|Pd% zO@Siou&;#z=z%r_AI4ttGfjIf-aKU(!qROPw;gBAlRWv!Pu3?cRrz<~ZKR5zp7W+{ z{S)Da3yGQ}LCd1N4Dbeu4I#h~jc^r2L~W*&&I~A`iLFLVxmTj5NSL1GOl5x!f6Drv zVF}drEhFMbmd$~fy)Oz;)PatKmFq`E)@IjB%^!H3QWiT-vr{dt)RBKjd-p8~vl>9M z_<5H5`G7;^d`+S(M2;5%)JDrj%gi;G1xJ=NEdNyVNWGtKOew!(l-2^ZFLRW?8YD(8w$4fSH!k`x`NaGr3Pv|A;eA`$?Kj8icDX&$&wedz+7+rN-MXAZFx+_*F{%nYBv$>)Qwz8yl&c zG?AZ1_Oy<&ey#;?KltE@yLPOYUW-g19IBql+gB;#A!&CC_yr%jCB*{MAti|z#B{!6wfylThW_F}59hT`Amg-Ehy`nzzjq|7|H> zcnbfZScs`C3Y%g&;~*kB5g5lUOiB@E@+@M>`n>X(XJI&o` zaym!p(**I#0vq$Pxf`N^h;}s>0=WSVp0osjh^nRkH`iSGCoEbxKp;JVCkN%egL+a5 zh?AWgt0J2JWw|y1L5AseyJ9|Cn4RQreH-xmFK#>4a?ls66b?XZ`1VeyCCoC=k zlt-o~&W(cWji73wC z+AXf0bT9fgQJ<$7XLZaINB|F3fE-w)t40!gKXEU0J#L322T3o zB*xwU@_>koG;mTHkW-+p=d33a^Q<_32Bl+Q4R@^uxdl+o!#Gz$MD93$7L)eaBy^+s z1C_kKuPNDb#%!xU4+3%yj(IpGi-%?HYpn*k2SxTb1kI{BRtw#DE`esffwqJpI-JUL zL3aZ<{(=rw5plX?2UQ5VD*#mdI%~W584sq0?htUTJr{v)C%?MAJwBzLd`)^v2_>#c z9dYzk)fYX#5{gA({Q!Kl2eNAWXaZUSQ`GBD7^1j-01lu6{K|G=stMDg5?;>d0U#JS z4e&v46||xfjEN~H$n31Q;EkaHz;*yGT#V&;f2L9pCC%l+dV#gRi$p^RF9D#;U~u33 zp`&R^36joa{(7h*1{i<>Fy)-pOUvVNaEHKPJYFslWX$&L{3O=EE@}aKz@By{g?cFy zEE^J+e-@h8l(YQhZ!2=FQNjrz0W5%Xo1$s6Q{ZVKKT7#iO!%tD|Gxb?U#DrayG^mn zFNc#*bg=6H96-JaIJU#H9ll-2?K9=QXX>86&s6ShhktQl^Z%&hSgQc|XavXr1FQpZ zZ7dSFv2pJG#ZhEM4~vZe79d;#w163~E_nX6*}F?G<{~SsTkKT2Y1)hx+b2%-Q8K= zji_3|WfiwmMMQNml1~-x?(PojyAkdV6C*#~fV*{VhE0TK?t1c(6kE;QVheG1cmq2c z;SU-;O#LF9gJe{#ML4}K5$>EKa|?+)JyrV#aCfMpU~AjqKuT|NHZdERuwo}={NMZi zrMN0-+qP}ncK1+jBuSDaSwvBrE^jJc#RJ?B&Y72LzKhn3#~Gjt0B0Dyr_ zN+m%(I||bhG#S&)qoYKL$-pNq2EHgF2|YM_xF&%Zx(0L^y2OK{5?w%_fxikRug69u zYB2Bz09-)DsEWs{xhw!+=xrrRL=TOE)MU(00D!F1m0~rpr{#KN0GO?zFp5}1Ky0C1%WC8g1AoDAm4>KzK|TWj44!7xYHe*3BRXjS10NV#$vh*{Kk*sp#fV!VvSLkC zvLr?@1i-*ORnTL2N-Wcjto|N(ib*UPBgSdLGpsILCV?qNwEm8*iZ*A&J_de+*m6}- z83iD88kM?n{UiDbXQt<5U{^c%pyAC#vtkTP(g9%LyTZ;qWWSssGa-ieCc6UqGH|Rj z2rpX(m8(Du0DRa_GitpkzbPhBWJ*r@3;+NOjJ9G5GnND38NNa#`nWh*8l(v>W}+~e z825cl4D4Xw9Y`%z0#&F=7yxu;;M|L3wR6Z8Y`KoZv z7tIY`G4SygI>&-Z6+*FssA^NPv>Eupz{6i->}m!kE0TeXXwT4Qs-VvLU4E*lX!X_a z8Dly#Fq~26EQWz=41A6SgN(Ur#U>R55TJsnxdAY7I3a;*v|tWX-k%k_S{cnunJG+w zsCEZ!jF+=w4DJ^epoyrNA#pCCOuUMWRuGqw5D!FkyJ%zVvlV0Dkc?&q#ATl>#J-ae zU|_VCCWf;S>>$*`dR&AUjdDTt5sm(^s+nkGFz$IPc2@2%Lyze|#2j@{#KL(cd}fKF z<}6cI`3j2mk#aQ<`&z6zJ=E)~;Q#?c1Zrq%sD*_f8?78g9kELwCQhSVTp8wT*y-AT z^Qq`TEA~Ue0#(TH^_2|7wdOBELpNi;5E1j0MEVb#@R^CTb}LuWYy}J;;sCQzuZIQ$ zHCAy!O?9;}5oDp2gHRXU3yoGk$;dog!%1+3FhWs+7Gsm3R#1H=qqlUF396}%01b_X zxb8bzSZ(vh*|JKPRk((<=|Jo~UL-J`2}De}9EI{C-J#S%#DV-Oqi7B9 z``A?*sNTecb-JkASAzlahm~eI(k@5YxWq89%!)C1T-XH>HPayud_FK3*Vsp{$;v;j z7C?xL_AMr>@=AgrD}BmFuWbRoRO6a@Krxq)u0g)xiF^NWWiRh}iRF zk$$c!P9Cx6bj%>+6|C6e-NUSLF$Ee(Z&VJmf<2u6WaB;A1vMUG$y49UFtQLaonLF{ zR;r{o`OKnu70HPxYX^w9_u&j7H)zF1k#Wp!2fh*o&|?EK@f0&_j>OK+G{M5X#VYR*aFmg#~JAGkhk!CQpbbqI&_(xPlF&GgnTtTnsS^r>YfG zsT*|~`Zefc4YXJdg5qmv;g@?EuRKxt^qR;jFkTg-r7+wgrdVF|+&mqKrsh$gM5JzCwSTSNJ(D%4c5rb;zDcI7%MH&msm<)n{Riq$|Y;G$L=wYs|6 zIz8P{$NB@+(lG{N$x*pQauQW<#E-?g0_AO_p1X6-~7|;0ZE8)Nm-Ce z_B&azqtWpN_!Z0r`f)yAOk+bC^cu)pl?dzU9xCt$Ar3mUpR%Q^L8l9Q8INXwl#8ss zHgfMjhCY5|Jbo136^&;Sa2-VV!ZRMx^gKtLK-Jq4vk#6HXVg|Y#+&FMYN`SBk3U}t z4?C8GfGPU9bZzIi*Syz!G%E7P%~RVX7NE{N`kXEdTwdAdi_gklcXk}Y0F6J0zc zAxvWM)5q5T`FJ^3m2XcN=s?twr>PF2Me~GuBDz{Jie#iE+q|&zF-y}icJcYcYp{n~ zkB~rILAHn*^ue=eq9^0I4x)1qb553QndVp-J#46upunki@Z-yCc$c0(f+F!84^g85 zcwUX@Z+L=T5Z#fO&0Df7Vc@@8wT!VN?_XYlyZr3&m>lB~HCDwlJ<)hP!#NTbvPPw!W+VGbW>*6X!vRXW~udyaSL_!13=xPnuCwVED!ST4lO z)5Y@=L}$y>!V*yUt;&1`J$nQP0ssgJF!-5kYyW<< zw&BMsTPH|!P`ePZ$K{xT<7SA09q^1tbX!7}ZPAu3p@{}*y^n& z3Ui%pkd24BgJW)ND${h`{lJSA=oinu5Y5H&Kt$&wWb+nn{i2%cGQoi753lC#-M@f4 z-RVQao8s;Rw0*!`t0O9s(^x#C5{)LJU09qb7EM7iiaKUP$6+j7V!OV*G#;n%OnhMy z6KibE|DXNRGFY<>iauhVOC}mm1Os>c7A=$#p|eS%jFsLRUd_HQUtqB4j?nOS74k+@ zB(G$i+7|l9>f2w{xj2F(O2$KeJ z>pC0y6=6Y+Wj|y=mt%yCWjYob+wkWTCLv(pbC<^UetwCVk>&*H3{19eBdZB@a>8yx z&b4an#M=i5EU_&#ye(r1n2k!8An)p}o5R2!c~{Ovl16Gge;hjzsL(yO)HWd->29^28zF_i1U;uHMSErUYZ) zrM%i*xkJB~E&;Pr#kyp5zCbJIFm|(B?8?)J#sC*C3H@BUjKw9=W6NU18OPEqpsT1? zle4=I9vZ1{UlO_+^W7z_SeC*JwRXdMlU>vW$?4)S^}n2$@)$hH3vkU-U2l62woDgO#??VMzHD6}gyW)7T4K%<$w znq@c3n2QiiT_ml}vG`YPwhgDfb^YAVyn0Nm;r+Rkcdt};F8wsOAH7_^`n`B?8?g=;?887EG?_YC;xFD+2lN^=0)3N-FnQpH1r!Eua-Ft9#Aevf^ z3R+k{m!C2MPD#f5n5e++;A&5FqEgzOxAjw;gk|8fkN_3JavnHLRB@xY&X(x9rHta( zKnB;FD&OA2L{-)YR}%;6je6GV7NqQ%9Z=EwlB%lc+ppe6M{O5>^H6&`t?G| z!)reGQ`T(bYU}pU@%#fdwmG(NF^0w?x@3-l7XuOVDkA+fJ1-I2^7FNuj~=^s|Jv@a zFCoKnY_yDmRhBH`zn(WKA)4-RNr;%GTRI|({MXv{KtUSH`IVHbfdj~ul$4Z^kPsdH zutFAjNdOml?K2DbAOMK-DTL%Bjyj%R9n6F>8LlM)`5sBq4YrTdvFc6AmCIvAW&A_pj=eRoz`>2;U2;S#)^sx zburk<%UH_0576xS#wAEUKoim5fN`HMrc?K*6Kdbm=zPZ}GO$jL!StstW0f|9R;jHa z=}3vj6QJ)x3fKjPRx(kBQ-`s?(ki<-1k_xKYso~DiDSgAP1%L1F5KAk!ZIE^j1}G) zS_7WH1T>tB>->o}DUN|&j%`#0Q_Pd~$YE?p-@h(9LWPa`7Xg>ebu&b*90{9dzwLvI zlf_8B5{4R9Ndbky5e_u;E11FaZN|LY^X2s?0Qa^v|9`v!gCcO<5mB%UVXEj_$3FU1 z>RG-<0zJ$}iq*heUVYk~J>^qAW%ahk9J6vyeJ=)%(Nq>kf!!g%yIYSQ0A0PZu9hg& zg|IKP5ze0R6&@EN4k(Ir=Z}a*M_Eg@|M^swDUG4%ST>_jLf!iRBHj0!Q; za%68IK{uVX5V1yBQf6*A2f!t5!=IO|c#7^MilOZsTgjN|T)y&g<(*W60181r2-Q!t zdYX=5s6fi90RVRA!9!M!wkSGA5Cb2s#9pYBbkD$JFfNfETTadcM}$L=^=VWz2T?!m z*h~MnxXZSGe}(#rFkFPK|MQXb(X?=%n9j?y84eRI=PvgQnlEka_l}5b9rPxG7`n!> zn@S}?-`q|9N-NL4!`RmUdEExrk5h?~Kqv$M6;4ju;p~%}tn;gP>dosVUvj5kKPK6} z&o5)!`s1ZAxGL5}B^8Mo#cw}a(@$syp1FtkZTs;8?)Rltin(vchR)sQ3PWXaF#jS= z2s!C{vLjcrwl>PPe1FyL=^g5Hb+xrSSi$vA__{UQ`0fnxLhKv;^FGwoC%slLKVny_no>^cAduqt#gAh&v_6#Q5CgVITHkGZ=-Kay4oP zC15L#O;rU0gv`*>Vjx~HQFPM6|0}U%QNKS(a+qgZe|$Rp=_8#`sEgwmYp;&DQ*!dp z7aUjZ5Mca2CbBD6a^WIE8L3tS@nT57|7n=#LP5GJTH3L#40IO(8AY9ZnsgKqHPh?9 z(Q{X6XdRC|;w9;orf_WSea9Mm zY)Xvdf#D);eB&E$8SAe;=z~7!gNkpD3>%Mr=SRPbBlq4T)3Kv#*RF$|xn3sit;bV6 z)mqklkDrwcG418;xR<~S}tDH!-+=(*{6V@z~HM0aF{D|T$JN{lcxCMB3D z*cH*#CSd6025ExZpEEo`BV8z=lc*XkiReI7uP=Ge;F2lg*x>t%HBfbchH(bi67%Oo&kwwa3`Q1p$d0YPI0jz1$)Yp%YfyVt76lRG;(Wz|>Tx!D8Luh;aK{3uf*$kAB*11f z(Q?n=9{Wpll^OtWl|)T+am4~Ka3J1pISQEQ9-|VCrq|RE(M|Bg#=_bZk%W%zR-%Mt z@U&Z8GST7aT@F!zDjtAXm8jv^@Ni0!wYkHQ61A|P*W47*^n6d}*z(i(N;kLyqQ&d| zan=ro8de1~zd$U@z%FEa=tM-b^?`NzcmOxWi1}t( z0nrf~iajsKBiNb}?59mMAwBGR3^6du?-_8WnoU%pyad!}i=sOjVPN(iRub6p6ppMW z)MA9(*$F&B7!&-%ic_zj8 z(`_A3;yetl7ck6pA>#3o!2v}f;^6berHZa?>v$I1D$=FK>IdjyIWWy~8x$%zY(SJ17BoSsEX#) zVBm#ICXeIE9Q$A;y)>;d!h){L@ofIwg5<1$x&y$Zij%O8r!(eTq->Nn3c#4@@s8(n zDurDsqZ^g0fPp`o^*f%>O)XnW8O7V@;dn^1WfJ)G#g#7mzi`eur|o!5{R-3Zl>{;H zwPG#x{f;N~IT?5?gn>uHdz0Pqu5A{k@xc03L6f)U zV(9JXbUd_*pR5c#;h6Lc9gpou-k;GwSF5us7_ceFgB#C4|5yO%uJRUkJiLlb$(1gK cq0O3aN@yq2|B?QW^naxPBmE!g|M|ui04#muc>n+a diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100644 index 0a5390f963768a0a39cfa58f6d30e1d0d199509e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7718 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 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index b8e72301e0f7b7f4efaf60a6eb7fee52662a62c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5854 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 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp deleted file mode 100644 index dae95ed873f77c0e88a56b5880539a0d0741908e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8314 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 E01HmZuK)l5 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp deleted file mode 100644 index e16ef0b03fa9704ca00bb07a75ff2866d3cbd07b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10402 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 M72vGu^g0t40MXOiGynhq diff --git a/nym-vpn/android/app/src/main/res/values/colors.xml b/nym-vpn/android/app/src/main/res/values/colors.xml deleted file mode 100644 index d035176a0b..0000000000 --- a/nym-vpn/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF1c1b20 - #FF000000 - #FFFFFFFF - \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/values/ic_banner_background.xml b/nym-vpn/android/app/src/main/res/values/ic_banner_background.xml deleted file mode 100644 index 5274b8a4f3..0000000000 --- a/nym-vpn/android/app/src/main/res/values/ic_banner_background.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #121212 - \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml b/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml deleted file mode 100644 index 9c1cd0cc32..0000000000 --- a/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #1C1B20 - \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/values/strings.xml b/nym-vpn/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 2c1d791d4d..0000000000 --- a/nym-vpn/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,90 +0,0 @@ - - NymConnect - tunnelConfig - VPN Channel - VPN Notification Channel - Watcher Channel - Watcher Notification Channel - FOREGROUND_FILE - https://github.com/nymtech/nym - https://github.com/nymtech/nym - File is not a .conf file - Turn off tunnel before editing - No tunnels added yet! - Tunnel name already exists - https://discord.com/invite/nym - Watcher Service - Monitoring network state changes - VPN Connected - Connected to tunnel - - VPN permission is required for the app to work properly. If this permission is not launching, please disable \"Always-on VPN\" in your phone settings for the official WireGuard mobile app and try again. - Notifications permission is required for the app to work properly. - Open Settings - Add Trusted SSID - Trusted SSID - Tunnels - Select Tunnel - Enable auto tunneling - Tunnel on mobile data - \"Allow all the time\" location permission is required for retrieving Wi-Fi SSID in the background. Permission is needed for this feature. - Location permission is required for this feature to work properly. - At least one tunnel required to use this feature - "Retry" - View Privacy Policy - Okay - This feature requires background location permission to enable Wi-Fi SSID monitoring even while the application is closed. For more details, please see the Privacy Policy linked on the Support screen. - Background Location Disclosure - TODO - Enter SSID - Submit SSID - [Interface] - Add tunnel from files - File Open - Tunnel Edit - Tunnel Name - Edit - Delete - Add Tunnel - Exclude - Include - Tunnel all applications - Configuration changes saved. - Save changes - Icon - No thanks - Turn on - Map - Bad config. Please try again. - Interface - Public key - Waiting for the Barcode UI module to be downloaded. - Barcode module downloading. Try again. - Addresses - DNS servers - MTU - Peer - Allowed IPs - Endpoint - Transfer - Last handshake - Name - Restart Tunnel - VPN Connection Failed - Failed connection to - - Attempting to connect to server after 30 seconds of no response. - Attempting to reconnect to server after more than one minute of no response. - Enable Always-On VPN support - Please select a tunnel first - Unable to detect Location Services which are required for this feature. Please enable Location Services. - Check again - Detecting Location Services disabled - This feature requires precise location to access Wi-Fi SSID name. Please enable precise location here or in the app settings. - Request - Toggle VPN - No tunnels available - Search packages - Clear Icon - Search Icon - Attempting connection.. - VPN Starting - \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/values/themes.xml b/nym-vpn/android/app/src/main/res/values/themes.xml deleted file mode 100644 index 9414a536e4..0000000000 --- a/nym-vpn/android/app/src/main/res/values/themes.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/xml/backup_rules.xml b/nym-vpn/android/app/src/main/res/xml/backup_rules.xml deleted file mode 100644 index fa0f996d2c..0000000000 --- a/nym-vpn/android/app/src/main/res/xml/backup_rules.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/xml/data_extraction_rules.xml b/nym-vpn/android/app/src/main/res/xml/data_extraction_rules.xml deleted file mode 100644 index 9ee9997b0b..0000000000 --- a/nym-vpn/android/app/src/main/res/xml/data_extraction_rules.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/nym-vpn/android/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt b/nym-vpn/android/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt deleted file mode 100644 index c3453e018c..0000000000 --- a/nym-vpn/android/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package net.nymtech.nymconnect - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/nym-vpn/android/build.gradle.kts b/nym-vpn/android/build.gradle.kts deleted file mode 100644 index 09b1978ecb..0000000000 --- a/nym-vpn/android/build.gradle.kts +++ /dev/null @@ -1,19 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - val objectBoxVersion by extra("3.5.1") - val hiltVersion by extra("2.47") - val accompanistVersion by extra("0.31.2-alpha") - - dependencies { - classpath("io.objectbox:objectbox-gradle-plugin:$objectBoxVersion") - classpath("com.google.gms:google-services:4.3.15") - } -} - -plugins { - id("com.android.application") version "8.2.0-beta01" apply false - id("org.jetbrains.kotlin.android") version "1.8.22" apply false - id("com.google.dagger.hilt.android") version "2.44" apply false - kotlin("plugin.serialization") version "1.8.22" apply false -} diff --git a/nym-vpn/android/gradle.properties b/nym-vpn/android/gradle.properties deleted file mode 100644 index 1023be831f..0000000000 --- a/nym-vpn/android/gradle.properties +++ /dev/null @@ -1,25 +0,0 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Kotlin code style for this project: "official" or "obsolete": -kotlin.code.style=official -# Enables namespacing of each library's R class so that its R class includes only the -# resources declared in the library itself and none from the library's dependencies, -# thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true -#enable buildconfig values -android.defaults.buildfeatures.buildconfig=true \ No newline at end of file diff --git a/nym-vpn/android/gradle/wrapper/gradle-wrapper.jar b/nym-vpn/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59203 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

    K7UpUK$>l@ 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 E2O(~oYXATM diff --git a/nym-vpn/android/gradle/wrapper/gradle-wrapper.properties b/nym-vpn/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 96f2e7a959..0000000000 --- a/nym-vpn/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Mon Apr 24 22:46:45 EDT 2023 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/nym-vpn/android/gradlew b/nym-vpn/android/gradlew deleted file mode 100755 index 4f906e0c81..0000000000 --- a/nym-vpn/android/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/nym-vpn/android/gradlew.bat b/nym-vpn/android/gradlew.bat deleted file mode 100644 index 107acd32c4..0000000000 --- a/nym-vpn/android/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/nym-vpn/android/settings.gradle.kts b/nym-vpn/android/settings.gradle.kts deleted file mode 100644 index aaebe93cd6..0000000000 --- a/nym-vpn/android/settings.gradle.kts +++ /dev/null @@ -1,18 +0,0 @@ -pluginManagement { - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} -dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) - repositories { - google() - mavenCentral() - } -} - -rootProject.name = "NymConnect" -include(":app") - \ No newline at end of file From 3c482eff6e1a7d481b2be90e22ef2c651181e5a6 Mon Sep 17 00:00:00 2001 From: Mark Sinclair Date: Wed, 6 Sep 2023 18:07:22 +0100 Subject: [PATCH 20/47] Docs: add prod deploy settings --- .github/workflows/cd-docs.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cd-docs.yml b/.github/workflows/cd-docs.yml index 917a115064..e775e0c601 100644 --- a/.github/workflows/cd-docs.yml +++ b/.github/workflows/cd-docs.yml @@ -87,9 +87,14 @@ jobs: run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} working-directory: dist/docs - - name: Build Project Artifacts + - name: Build Project Artifacts (preview) + if: github.ref != 'refs/heads/master' run: vercel build --token=${{ secrets.VERCEL_TOKEN }} working-directory: dist/docs + - name: Build Project Artifacts (production) + if: github.ref == 'refs/heads/master' + run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} + working-directory: dist/docs - name: Deploy Project Artifacts to Vercel (preview) if: github.ref != 'refs/heads/master' From b9a9a407e9b14ebd1260ae1b80d80ed974beffa8 Mon Sep 17 00:00:00 2001 From: pierre Date: Wed, 6 Sep 2023 18:36:01 +0200 Subject: [PATCH 21/47] init --- nym-vpn/android/.gitignore | 71 +++ nym-vpn/android/.gitkeep | 0 nym-vpn/android/LICENSE | 21 + nym-vpn/android/README.md | 42 ++ nym-vpn/android/app/.gitignore | 2 + nym-vpn/android/app/build.gradle.kts | 159 +++++++ .../android/app/objectbox-models/default.json | 99 +++++ .../app/objectbox-models/default.json.bak | 94 ++++ nym-vpn/android/app/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.kt | 24 + .../android/app/src/main/AndroidManifest.xml | 115 +++++ .../app/src/main/ic_launcher-playstore.png | Bin 0 -> 39338 bytes .../wireguardautotunnel/Constants.kt | 6 + .../WireGuardAutoTunnel.kt | 27 ++ .../wireguardautotunnel/module/BoxModule.kt | 40 ++ .../module/RepositoryModule.kt | 25 ++ .../module/ServiceModule.kt | 29 ++ .../module/TunnelModule.kt | 31 ++ .../receiver/BootReceiver.kt | 39 ++ .../receiver/NotificationActionReceiver.kt | 39 ++ .../repository/Repository.kt | 16 + .../repository/SettingsBox.kt | 63 +++ .../repository/TunnelBox.kt | 57 +++ .../service/foreground/Action.kt | 6 + .../service/foreground/ForegroundService.kt | 64 +++ .../service/foreground/ServiceManager.kt | 90 ++++ .../service/foreground/ServiceState.kt | 6 + .../WireGuardConnectivityWatcherService.kt | 210 +++++++++ .../foreground/WireGuardTunnelService.kt | 154 +++++++ .../service/network/BaseNetworkService.kt | 117 +++++ .../service/network/MobileDataService.kt | 10 + .../service/network/NetworkService.kt | 10 + .../service/network/NetworkStatus.kt | 10 + .../service/network/WifiService.kt | 10 + .../notification/NotificationService.kt | 21 + .../notification/WireGuardNotification.kt | 77 ++++ .../service/shortcut/ShortcutsActivity.kt | 28 ++ .../service/shortcut/ShortcutsManager.kt | 73 +++ .../service/tile/TunnelControlTile.kt | 142 ++++++ .../service/tunnel/HandshakeStatus.kt | 14 + .../service/tunnel/VpnService.kt | 18 + .../service/tunnel/WireGuardTunnel.kt | 131 ++++++ .../service/tunnel/model/Settings.kt | 15 + .../service/tunnel/model/TunnelConfig.kt | 89 ++++ .../wireguardautotunnel/ui/MainActivity.kt | 201 +++++++++ .../wireguardautotunnel/ui/Routes.kt | 36 ++ .../wireguardautotunnel/ui/ViewState.kt | 9 + .../ui/common/ClickableIconButton.kt | 31 ++ .../common/PermissionRequestFailedScreen.kt | 35 ++ .../ui/common/RowListItem.kt | 55 +++ .../ui/common/SearchBar.kt | 80 ++++ .../ui/common/navigation/BottomNavBar.kt | 42 ++ .../ui/common/navigation/BottomNavItem.kt | 9 + .../ui/screens/config/ConfigScreen.kt | 241 ++++++++++ .../ui/screens/config/ConfigViewModel.kt | 152 +++++++ .../ui/screens/detail/DetailScreen.kt | 139 ++++++ .../ui/screens/detail/DetailViewModel.kt | 45 ++ .../ui/screens/main/MainScreen.kt | 336 ++++++++++++++ .../ui/screens/main/MainViewModel.kt | 179 ++++++++ .../ui/screens/settings/SettingsScreen.kt | 415 ++++++++++++++++++ .../ui/screens/settings/SettingsViewModel.kt | 124 ++++++ .../ui/screens/support/SupportScreen.kt | 83 ++++ .../wireguardautotunnel/ui/theme/Color.kt | 17 + .../wireguardautotunnel/ui/theme/Theme.kt | 80 ++++ .../ui/theme/TransparentSystemBars.kt | 22 + .../wireguardautotunnel/ui/theme/Type.kt | 34 ++ .../wireguardautotunnel/util/NumberUtils.kt | 25 ++ .../app/src/main/res/drawable/discord.xml | 10 + .../app/src/main/res/drawable/github.xml | 12 + .../res/drawable/ic_launcher_background.xml | 170 +++++++ .../res/drawable/ic_launcher_foreground.xml | 30 ++ .../app/src/main/res/drawable/shield.xml | 5 + .../app/src/main/res/drawable/vpn_off.xml | 5 + .../app/src/main/res/drawable/vpn_on.xml | 5 + .../main/res/mipmap-anydpi-v26/ic_banner.xml | 5 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 2004 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 2936 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 3568 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1268 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 1926 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 2242 bytes .../src/main/res/mipmap-xhdpi/ic_banner.png | Bin 0 -> 3578 bytes .../res/mipmap-xhdpi/ic_banner_foreground.png | Bin 0 -> 3770 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 2728 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 3956 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 5030 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 4246 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 6154 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 5854 bytes .../ic_launcher_foreground.webp | Bin 0 -> 8314 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 10402 bytes .../app/src/main/res/values/colors.xml | 11 + .../main/res/values/ic_banner_background.xml | 4 + .../res/values/ic_launcher_background.xml | 4 + .../app/src/main/res/values/strings.xml | 90 ++++ .../app/src/main/res/values/themes.xml | 6 + .../app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../wireguardautotunnel/ExampleUnitTest.kt | 17 + nym-vpn/android/build.gradle.kts | 19 + nym-vpn/android/gradle.properties | 25 ++ .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + nym-vpn/android/gradlew | 185 ++++++++ nym-vpn/android/gradlew.bat | 89 ++++ nym-vpn/android/settings.gradle.kts | 18 + 109 files changed, 5463 insertions(+) create mode 100644 nym-vpn/android/.gitignore delete mode 100644 nym-vpn/android/.gitkeep create mode 100644 nym-vpn/android/LICENSE create mode 100644 nym-vpn/android/README.md create mode 100644 nym-vpn/android/app/.gitignore create mode 100644 nym-vpn/android/app/build.gradle.kts create mode 100644 nym-vpn/android/app/objectbox-models/default.json create mode 100644 nym-vpn/android/app/objectbox-models/default.json.bak create mode 100644 nym-vpn/android/app/proguard-rules.pro create mode 100644 nym-vpn/android/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt create mode 100644 nym-vpn/android/app/src/main/AndroidManifest.xml create mode 100644 nym-vpn/android/app/src/main/ic_launcher-playstore.png create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/BootReceiver.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/NotificationActionReceiver.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceManager.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsActivity.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsManager.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile/TunnelControlTile.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/HandshakeStatus.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/SearchBar.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigScreen.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigViewModel.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailScreen.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailViewModel.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/NumberUtils.kt create mode 100644 nym-vpn/android/app/src/main/res/drawable/discord.xml create mode 100644 nym-vpn/android/app/src/main/res/drawable/github.xml create mode 100644 nym-vpn/android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 nym-vpn/android/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 nym-vpn/android/app/src/main/res/drawable/shield.xml create mode 100644 nym-vpn/android/app/src/main/res/drawable/vpn_off.xml create mode 100644 nym-vpn/android/app/src/main/res/drawable/vpn_on.xml create mode 100644 nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml create mode 100644 nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner.png create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/values/colors.xml create mode 100644 nym-vpn/android/app/src/main/res/values/ic_banner_background.xml create mode 100644 nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 nym-vpn/android/app/src/main/res/values/strings.xml create mode 100644 nym-vpn/android/app/src/main/res/values/themes.xml create mode 100644 nym-vpn/android/app/src/main/res/xml/backup_rules.xml create mode 100644 nym-vpn/android/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 nym-vpn/android/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt create mode 100644 nym-vpn/android/build.gradle.kts create mode 100644 nym-vpn/android/gradle.properties create mode 100644 nym-vpn/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 nym-vpn/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 nym-vpn/android/gradlew create mode 100644 nym-vpn/android/gradlew.bat create mode 100644 nym-vpn/android/settings.gradle.kts diff --git a/nym-vpn/android/.gitignore b/nym-vpn/android/.gitignore new file mode 100644 index 0000000000..31caa0cedf --- /dev/null +++ b/nym-vpn/android/.gitignore @@ -0,0 +1,71 @@ +# Built application files +*.apk +*.aar +*.ap_ +*.aab +# Files for the ART/Dalvik VM +*.dex +# Java class files +*.class +# Generated files +bin/ +gen/ +out/ +release/ +build/ +# Gradle files +.gradle/ +# Local configuration file (sdk path, etc) +local.properties +# Proguard folder generated by Eclipse +proguard/ +# Log Files +*.log +# Android Studio Navigation editor temp files +.navigation/ +# Android Studio captures folder +captures/ +# IntelliJ +*.iml +.idea/ +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/gradle.xml +# .idea/assetWizardSettings.xml +# .idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +*.jks +*.keystore +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ +# Freeline +freeline.py +freeline/ +freeline_project_description.json +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md +# Version control +vcs.xml +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ +# MacOS +.DS_Store +# App Specific cases +app/release/output.json +.idea/codeStyles/ diff --git a/nym-vpn/android/.gitkeep b/nym-vpn/android/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/nym-vpn/android/LICENSE b/nym-vpn/android/LICENSE new file mode 100644 index 0000000000..51f3844dba --- /dev/null +++ b/nym-vpn/android/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 NymConnect + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/nym-vpn/android/README.md b/nym-vpn/android/README.md new file mode 100644 index 0000000000..e4a334e993 --- /dev/null +++ b/nym-vpn/android/README.md @@ -0,0 +1,42 @@ +## NymConnect for Android + +### Prerequisites + +_TODO_ + +### Getting started + +[Install](https://developer.android.com/studio/install) Android Studio and open +the project.\ +Setup an android emulator using AVD.\ +[Run](https://developer.android.com/studio/run/emulator) the project. + +**⚠ NOTE**: be sure +to [set](https://developer.android.com/studio/run#changing-variant) +the build variant to `x86_64Debug` when running on emulator + +### Features + +* Add tunnels via .conf file +* Auto connect to VPN based on Wi-Fi SSID +* Split tunneling by application with search +* Always-on VPN for Android support +* Quick tile support for vpn toggling +* Dynamic shortcuts support for automation integration +* Configurable Trusted Network list +* Optional auto connect on mobile data +* Automatic service restart after reboot +* Service will stay running in background after app has been closed + +### Building + +_TODO_ + +### Credits + +This project is based on the "WG Tunnel" project made by Zane Schepke +https://github.com/zaneschepke/wgtunnel + +### License + +MIT diff --git a/nym-vpn/android/app/.gitignore b/nym-vpn/android/app/.gitignore new file mode 100644 index 0000000000..956c004dc0 --- /dev/null +++ b/nym-vpn/android/app/.gitignore @@ -0,0 +1,2 @@ +/build +/release \ No newline at end of file diff --git a/nym-vpn/android/app/build.gradle.kts b/nym-vpn/android/app/build.gradle.kts new file mode 100644 index 0000000000..bc158e58e9 --- /dev/null +++ b/nym-vpn/android/app/build.gradle.kts @@ -0,0 +1,159 @@ +val rExtra = rootProject.extra + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + kotlin("kapt") + id("com.google.dagger.hilt.android") + id("org.jetbrains.kotlin.plugin.serialization") + id("io.objectbox") +} + +android { + namespace = "net.nymtech.nymconnect" + compileSdk = 34 + + val versionMajor = 1 + val versionMinor = 0 + val versionPatch = 0 + val versionBuild = 0 + + defaultConfig { + applicationId = "net.nymtech.nymconnect" + minSdk = 28 + targetSdk = 34 + versionCode = versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild + versionName = "${versionMajor}.${versionMinor}.${versionPatch}" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + release { + isDebuggable = false + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = "17" + } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.4.8" + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } + + /* flavorDimensions += "abi" + productFlavors { + create("universal") { + dimension = "abi" + ndk { + abiFilters += listOf("arm64-v8a", "armeabi-v7a", "x86_64", "x86") + } + } + create("arch64") { + dimension = "abi" + ndk { + abiFilters += listOf("arm64-v8a", "x86_64") + } + } + create("arm64") { + dimension = "abi" + ndk { + abiFilters += "arm64-v8a" + } + } + create("arm") { + dimension = "abi" + ndk { + abiFilters += "armeabi-v7a" + } + } + create("x86_64") { + dimension = "abi" + ndk { + abiFilters += "x86_64" + } + } + create("x86") { + dimension = "abi" + ndk { + abiFilters += "x86" + } + } + } */ +} + +dependencies { + implementation("androidx.core:core-ktx:1.10.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") + implementation("androidx.activity:activity-compose:1.7.2") + implementation(platform("androidx.compose:compose-bom:2023.03.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material3:material3:1.1.1") + implementation("androidx.appcompat:appcompat:1.6.1") + + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) + androidTestImplementation("androidx.compose.ui:ui-test-junit4") + debugImplementation("androidx.compose.ui:ui-tooling") + debugImplementation("androidx.compose.ui:ui-test-manifest") + + //wireguard tunnel + implementation("com.wireguard.android:tunnel:1.0.20230706") + + //logging + implementation("com.jakewharton.timber:timber:5.0.1") + + // compose navigation + implementation("androidx.navigation:navigation-compose:2.7.1") + implementation("androidx.hilt:hilt-navigation-compose:1.0.0") + + // hilt + implementation("com.google.dagger:hilt-android:${rExtra.get("hiltVersion")}") + kapt("com.google.dagger:hilt-android-compiler:${rExtra.get("hiltVersion")}") + + //accompanist + implementation("com.google.accompanist:accompanist-systemuicontroller:${rExtra.get("accompanistVersion")}") + implementation("com.google.accompanist:accompanist-permissions:${rExtra.get("accompanistVersion")}") + implementation("com.google.accompanist:accompanist-flowlayout:${rExtra.get("accompanistVersion")}") + implementation("com.google.accompanist:accompanist-navigation-animation:${rExtra.get("accompanistVersion")}") + implementation("com.google.accompanist:accompanist-drawablepainter:${rExtra.get("accompanistVersion")}") + + //db + implementation("io.objectbox:objectbox-kotlin:${rExtra.get("objectBoxVersion")}") + + //lifecycle + implementation("androidx.lifecycle:lifecycle-runtime-compose:2.6.1") + + //icons + implementation("androidx.compose.material:material-icons-extended:1.5.0") + + + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") +} + +kapt { + correctErrorTypes = true +} \ No newline at end of file diff --git a/nym-vpn/android/app/objectbox-models/default.json b/nym-vpn/android/app/objectbox-models/default.json new file mode 100644 index 0000000000..dd7a8ab78e --- /dev/null +++ b/nym-vpn/android/app/objectbox-models/default.json @@ -0,0 +1,99 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "1:2692736974585027589", + "lastPropertyId": "15:5057486545428188436", + "name": "TunnelConfig", + "properties": [ + { + "id": "1:1985347930017457084", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "12:2409068226744965585", + "name": "name", + "indexId": "1:4811206443952699137", + "type": 9, + "flags": 34848 + }, + { + "id": "13:8987443291286312275", + "name": "wgQuick", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "2:8887605597748372702", + "lastPropertyId": "9:4468844863383145378", + "name": "Settings", + "properties": [ + { + "id": "1:7485739868216068651", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:5814013113141456749", + "name": "isAutoTunnelEnabled", + "type": 1 + }, + { + "id": "4:5645665441196906014", + "name": "trustedNetworkSSIDs", + "type": 30 + }, + { + "id": "5:4989886999117763881", + "name": "isTunnelOnMobileDataEnabled", + "type": 1 + }, + { + "id": "6:3370284381040192129", + "name": "defaultTunnel", + "type": 9 + }, + { + "id": "9:4468844863383145378", + "name": "isAlwaysOnVpnEnabled", + "type": 1 + } + ], + "relations": [] + } + ], + "lastEntityId": "2:8887605597748372702", + "lastIndexId": "1:4811206443952699137", + "lastRelationId": "0:0", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [ + 1763475292291320186, + 6483820955437198310, + 8323071516033820771, + 5904440563612311217, + 1408037976996390989, + 7737847485212546994, + 8215616901775229364, + 8021610768066328637, + 6174306582797008721, + 2175939938544485767, + 7555225587864607050, + 969146862000617878, + 5057486545428188436, + 2814640993034665120, + 4981008812459251156 + ], + "retiredRelationUids": [], + "version": 1 +} \ No newline at end of file diff --git a/nym-vpn/android/app/objectbox-models/default.json.bak b/nym-vpn/android/app/objectbox-models/default.json.bak new file mode 100644 index 0000000000..d4084866ef --- /dev/null +++ b/nym-vpn/android/app/objectbox-models/default.json.bak @@ -0,0 +1,94 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "1:2692736974585027589", + "lastPropertyId": "15:5057486545428188436", + "name": "TunnelConfig", + "properties": [ + { + "id": "1:1985347930017457084", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "12:2409068226744965585", + "name": "name", + "indexId": "1:4811206443952699137", + "type": 9, + "flags": 34848 + }, + { + "id": "13:8987443291286312275", + "name": "wgQuick", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "2:8887605597748372702", + "lastPropertyId": "8:4981008812459251156", + "name": "Settings", + "properties": [ + { + "id": "1:7485739868216068651", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:5814013113141456749", + "name": "isAutoTunnelEnabled", + "type": 1 + }, + { + "id": "4:5645665441196906014", + "name": "trustedNetworkSSIDs", + "type": 30 + }, + { + "id": "5:4989886999117763881", + "name": "isTunnelOnMobileDataEnabled", + "type": 1 + }, + { + "id": "6:3370284381040192129", + "name": "defaultTunnel", + "type": 9 + } + ], + "relations": [] + } + ], + "lastEntityId": "2:8887605597748372702", + "lastIndexId": "1:4811206443952699137", + "lastRelationId": "0:0", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [ + 1763475292291320186, + 6483820955437198310, + 8323071516033820771, + 5904440563612311217, + 1408037976996390989, + 7737847485212546994, + 8215616901775229364, + 8021610768066328637, + 6174306582797008721, + 2175939938544485767, + 7555225587864607050, + 969146862000617878, + 5057486545428188436, + 2814640993034665120, + 4981008812459251156 + ], + "retiredRelationUids": [], + "version": 1 +} \ No newline at end of file diff --git a/nym-vpn/android/app/proguard-rules.pro b/nym-vpn/android/app/proguard-rules.pro new file mode 100644 index 0000000000..481bb43481 --- /dev/null +++ b/nym-vpn/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/nym-vpn/android/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt b/nym-vpn/android/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt new file mode 100644 index 0000000000..c006861187 --- /dev/null +++ b/nym-vpn/android/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package net.nymtech.nymconnect + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("net.nymtech.nymconnect", appContext.packageName) + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/AndroidManifest.xml b/nym-vpn/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..2ff4f063bb --- /dev/null +++ b/nym-vpn/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/ic_launcher-playstore.png b/nym-vpn/android/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..e5d8e99564658add3373147cb1504f3eb1e9776f GIT binary patch literal 39338 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 UitnrlZu;iLF&ndYM?E6{2jO2F=>Px# literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt new file mode 100644 index 0000000000..c34ccaa493 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt @@ -0,0 +1,6 @@ +package net.nymtech.nymconnect + +object Constants { + const val VPN_CONNECTIVITY_CHECK_INTERVAL = 3000L; + const val VPN_STATISTIC_CHECK_INTERVAL = 10000L; +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt new file mode 100644 index 0000000000..f0d53e5162 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt @@ -0,0 +1,27 @@ +package net.nymtech.nymconnect + +import android.app.Application +import android.content.Context +import android.content.pm.PackageManager +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.tunnel.model.Settings +import dagger.hilt.android.HiltAndroidApp +import javax.inject.Inject + +@HiltAndroidApp +class WireGuardAutoTunnel : Application() { + + @Inject + lateinit var settingsRepo : Repository + + override fun onCreate() { + super.onCreate() + settingsRepo.init() + } + + companion object { + fun isRunningOnAndroidTv(context : Context) : Boolean { + return context.packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt new file mode 100644 index 0000000000..032232369b --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt @@ -0,0 +1,40 @@ +package net.nymtech.nymconnect.module + +import android.content.Context +import net.nymtech.nymconnect.service.tunnel.model.MyObjectBox +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import io.objectbox.Box +import io.objectbox.BoxStore +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class BoxModule { + + @Provides + @Singleton + fun provideBoxStore(@ApplicationContext context : Context) : BoxStore { + return MyObjectBox.builder() + .androidContext(context.applicationContext) + .build() + } + + @Provides + @Singleton + fun provideBoxForSettings(store : BoxStore) : Box { + return store.boxFor(Settings::class.java) + } + + @Provides + @Singleton + fun provideBoxForTunnels(store : BoxStore) : Box { + return store.boxFor(TunnelConfig::class.java) + } + +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt new file mode 100644 index 0000000000..e402249cba --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt @@ -0,0 +1,25 @@ +package net.nymtech.nymconnect.module + +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.repository.SettingsBox +import net.nymtech.nymconnect.repository.TunnelBox +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +abstract class RepositoryModule { + + @Binds + @Singleton + abstract fun provideSettingsRepository(settingsBox: SettingsBox) : Repository + + @Binds + @Singleton + abstract fun provideTunnelRepository(tunnelBox: TunnelBox) : Repository +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt new file mode 100644 index 0000000000..fa043ec549 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt @@ -0,0 +1,29 @@ +package net.nymtech.nymconnect.module + +import net.nymtech.nymconnect.service.network.MobileDataService +import net.nymtech.nymconnect.service.network.NetworkService +import net.nymtech.nymconnect.service.network.WifiService +import net.nymtech.nymconnect.service.notification.NotificationService +import net.nymtech.nymconnect.service.notification.WireGuardNotification +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ServiceComponent +import dagger.hilt.android.scopes.ServiceScoped + +@Module +@InstallIn(ServiceComponent::class) +abstract class ServiceModule { + + @Binds + @ServiceScoped + abstract fun provideNotificationService(wireGuardNotification: WireGuardNotification) : NotificationService + + @Binds + @ServiceScoped + abstract fun provideWifiService(wifiService: WifiService) : NetworkService + + @Binds + @ServiceScoped + abstract fun provideMobileDataService(mobileDataService : MobileDataService) : NetworkService +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt new file mode 100644 index 0000000000..b5962a39d9 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt @@ -0,0 +1,31 @@ +package net.nymtech.nymconnect.module + +import android.content.Context +import com.wireguard.android.backend.Backend +import com.wireguard.android.backend.GoBackend +import net.nymtech.nymconnect.service.tunnel.VpnService +import net.nymtech.nymconnect.service.tunnel.WireGuardTunnel +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class TunnelModule { + + @Provides + @Singleton + fun provideBackend(@ApplicationContext context : Context) : Backend { + return GoBackend(context) + } + + @Provides + @Singleton + fun provideVpnService(backend: Backend) : VpnService { + return WireGuardTunnel(backend) + } + +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/BootReceiver.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/BootReceiver.kt new file mode 100644 index 0000000000..8fcf823c4f --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/BootReceiver.kt @@ -0,0 +1,39 @@ +package net.nymtech.nymconnect.receiver + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.foreground.ServiceManager +import net.nymtech.nymconnect.service.tunnel.model.Settings +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@AndroidEntryPoint +class BootReceiver : BroadcastReceiver() { + + @Inject + lateinit var settingsRepo : Repository + + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == Intent.ACTION_BOOT_COMPLETED) { + CoroutineScope(Dispatchers.IO).launch { + try { + val settings = settingsRepo.getAll() + if (!settings.isNullOrEmpty()) { + val setting = settings.first() + if (setting.isAutoTunnelEnabled && setting.defaultTunnel != null) { + ServiceManager.startWatcherService(context, setting.defaultTunnel!!) + } + } + } finally { + cancel() + } + } + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/NotificationActionReceiver.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/NotificationActionReceiver.kt new file mode 100644 index 0000000000..97033a8f63 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/NotificationActionReceiver.kt @@ -0,0 +1,39 @@ +package net.nymtech.nymconnect.receiver + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.foreground.ServiceManager +import net.nymtech.nymconnect.service.tunnel.model.Settings +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import javax.inject.Inject + +@AndroidEntryPoint +class NotificationActionReceiver : BroadcastReceiver() { + + @Inject + lateinit var settingsRepo : Repository + override fun onReceive(context: Context, intent: Intent?) { + CoroutineScope(Dispatchers.IO).launch { + try { + val settings = settingsRepo.getAll() + if (!settings.isNullOrEmpty()) { + val setting = settings.first() + if (setting.defaultTunnel != null) { + ServiceManager.stopVpnService(context) + delay(1000) + ServiceManager.startVpnService(context, setting.defaultTunnel.toString()) + } + } + } finally { + cancel() + } + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt new file mode 100644 index 0000000000..187957132c --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt @@ -0,0 +1,16 @@ +package net.nymtech.nymconnect.repository + +import kotlinx.coroutines.flow.Flow + +interface Repository { + suspend fun save(t : T) + suspend fun saveAll(t : List) + suspend fun getById(id : Long) : T? + suspend fun getAll() : List? + suspend fun delete(t : T) : Boolean? + suspend fun count() : Long? + + val itemFlow : Flow> + + fun init() +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt new file mode 100644 index 0000000000..f56247463c --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt @@ -0,0 +1,63 @@ +package net.nymtech.nymconnect.repository + +import net.nymtech.nymconnect.service.tunnel.model.Settings +import io.objectbox.Box +import io.objectbox.BoxStore +import io.objectbox.kotlin.awaitCallInTx +import io.objectbox.kotlin.toFlow +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.launch +import javax.inject.Inject + + +class SettingsBox @Inject constructor(private val box : Box, private val boxStore : BoxStore) : Repository { + + @OptIn(ExperimentalCoroutinesApi::class) + override val itemFlow = box.query().build().subscribe().toFlow() + + override fun init() { + CoroutineScope(Dispatchers.IO).launch { + if(getAll().isNullOrEmpty()) { + save(Settings()) + } + } + } + + override suspend fun save(t : Settings) { + boxStore.awaitCallInTx { + box.put(t) + } + } + + override suspend fun saveAll(t : List) { + boxStore.awaitCallInTx { + box.put(t) + } + } + + override suspend fun getById(id: Long): Settings? { + return boxStore.awaitCallInTx { + box[id] + } + } + + override suspend fun getAll(): List? { + return boxStore.awaitCallInTx { + box.all + } + } + + override suspend fun delete(t : Settings): Boolean? { + return boxStore.awaitCallInTx { + box.remove(t) + } + } + + override suspend fun count() : Long? { + return boxStore.awaitCallInTx { + box.count() + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt new file mode 100644 index 0000000000..c57621d53c --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt @@ -0,0 +1,57 @@ +package net.nymtech.nymconnect.repository + +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import io.objectbox.Box +import io.objectbox.BoxStore +import io.objectbox.kotlin.awaitCallInTx +import io.objectbox.kotlin.toFlow +import kotlinx.coroutines.ExperimentalCoroutinesApi +import timber.log.Timber +import javax.inject.Inject + +class TunnelBox @Inject constructor(private val box : Box,private val boxStore : BoxStore) : Repository { + + @OptIn(ExperimentalCoroutinesApi::class) + override val itemFlow = box.query().build().subscribe().toFlow() + override fun init() { + + } + + override suspend fun save(t : TunnelConfig) { + Timber.d("Saving tunnel config") + boxStore.awaitCallInTx { + box.put(t) + } + + } + + override suspend fun saveAll(t : List) { + boxStore.awaitCallInTx { + box.put(t) + } + } + + override suspend fun getById(id: Long): TunnelConfig? { + return boxStore.awaitCallInTx { + box[id] + } + } + + override suspend fun getAll(): List? { + return boxStore.awaitCallInTx { + box.all + } + } + + override suspend fun delete(t : TunnelConfig): Boolean? { + return boxStore.awaitCallInTx { + box.remove(t) + } + } + + override suspend fun count() : Long? { + return boxStore.awaitCallInTx { + box.count() + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt new file mode 100644 index 0000000000..ba4f930b12 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt @@ -0,0 +1,6 @@ +package net.nymtech.nymconnect.service.foreground + +enum class Action { + START, + STOP +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt new file mode 100644 index 0000000000..9aaf0b93d8 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt @@ -0,0 +1,64 @@ +package net.nymtech.nymconnect.service.foreground + +import android.app.Service +import android.content.Intent +import android.os.Bundle +import android.os.IBinder +import timber.log.Timber + + +open class ForegroundService : Service() { + + private var isServiceStarted = false + + override fun onBind(intent: Intent): IBinder? { + // We don't provide binding, so return null + return null + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + Timber.d("onStartCommand executed with startId: $startId") + if (intent != null) { + val action = intent.action + Timber.d("using an intent with action $action") + when (action) { + Action.START.name -> startService(intent.extras) + Action.STOP.name -> stopService(intent.extras) + "android.net.VpnService" -> { + Timber.d("Always-on VPN starting service") + startService(intent.extras) + } + else -> Timber.d("This should never happen. No action in the received intent") + } + } else { + Timber.d( + "with a null intent. It has been probably restarted by the system." + ) + } + // by returning this we make sure the service is restarted if the system kills the service + return START_STICKY + } + + + override fun onDestroy() { + super.onDestroy() + Timber.d("The service has been destroyed") + } + + protected open fun startService(extras : Bundle?) { + if (isServiceStarted) return + Timber.d("Starting ${this.javaClass.simpleName}") + isServiceStarted = true + } + + protected open fun stopService(extras : Bundle?) { + Timber.d("Stopping ${this.javaClass.simpleName}") + try { + stopForeground(STOP_FOREGROUND_REMOVE) + stopSelf() + } catch (e: Exception) { + Timber.d("Service stopped without being started: ${e.message}") + } + isServiceStarted = false + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceManager.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceManager.kt new file mode 100644 index 0000000000..c00a796453 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceManager.kt @@ -0,0 +1,90 @@ +package net.nymtech.nymconnect.service.foreground + +import android.app.ActivityManager +import android.app.Application +import android.app.Service +import android.content.Context +import android.content.Context.ACTIVITY_SERVICE +import android.content.Intent +import net.nymtech.nymconnect.R +import timber.log.Timber + +object ServiceManager { + @Suppress("DEPRECATION") + private // Deprecated for third party Services. + fun Context.isServiceRunning(service: Class) = + (getSystemService(ACTIVITY_SERVICE) as ActivityManager) + .getRunningServices(Integer.MAX_VALUE) + .any { it.service.className == service.name } + + fun getServiceState(context: Context, cls : Class): ServiceState { + val isServiceRunning = context.isServiceRunning(cls) + return if(isServiceRunning) ServiceState.STARTED else ServiceState.STOPPED + } + + private fun actionOnService(action: Action, context: Context, cls : Class, extras : Map? = null) { + if (getServiceState(context, cls) == ServiceState.STOPPED && action == Action.STOP) return + if (getServiceState(context, cls) == ServiceState.STARTED && action == Action.START) return + val intent = Intent(context, cls).also { + it.action = action.name + extras?.forEach {(k, v) -> + it.putExtra(k, v) + } + } + intent.component?.javaClass + try { + when(action) { + Action.START -> { + try { + context.startForegroundService(intent) + } catch (e : Exception) { + Timber.e("Unable to start service foreground ${e.message}") + context.startService(intent) + } + } + Action.STOP -> context.startService(intent) + } + } catch (e : Exception) { + Timber.tag("ServiceManager").e(e) + } + } + + fun startVpnService(context : Context, tunnelConfig : String) { + actionOnService( + Action.START, + context, + WireGuardTunnelService::class.java, + mapOf(context.getString(R.string.tunnel_extras_key) to tunnelConfig)) + } + fun stopVpnService(context : Context) { + actionOnService( + Action.STOP, + context, + WireGuardTunnelService::class.java + ) + } + + fun startWatcherService(context : Context, tunnelConfig : String) { + actionOnService( + Action.START, context, + WireGuardConnectivityWatcherService::class.java, mapOf(context. + getString(R.string.tunnel_extras_key) to + tunnelConfig)) + } + + fun stopWatcherService(context : Context) { + actionOnService( + Action.STOP, context, + WireGuardConnectivityWatcherService::class.java) + } + + fun toggleWatcherService(context: Context, tunnelConfig : String) { + when(getServiceState( + context, + WireGuardConnectivityWatcherService::class.java, + )) { + ServiceState.STARTED -> stopWatcherService(context) + ServiceState.STOPPED -> startWatcherService(context, tunnelConfig) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt new file mode 100644 index 0000000000..9c26fa0795 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt @@ -0,0 +1,6 @@ +package net.nymtech.nymconnect.service.foreground + +enum class ServiceState { + STARTED, + STOPPED, +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt new file mode 100644 index 0000000000..fcfa811ea2 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt @@ -0,0 +1,210 @@ +package net.nymtech.nymconnect.service.foreground + +import android.app.AlarmManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.os.PowerManager +import android.os.SystemClock +import com.wireguard.android.backend.Tunnel +import net.nymtech.nymconnect.Constants +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.network.MobileDataService +import net.nymtech.nymconnect.service.network.NetworkService +import net.nymtech.nymconnect.service.network.NetworkStatus +import net.nymtech.nymconnect.service.network.WifiService +import net.nymtech.nymconnect.service.notification.NotificationService +import net.nymtech.nymconnect.service.tunnel.VpnService +import net.nymtech.nymconnect.service.tunnel.model.Settings +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@AndroidEntryPoint +class WireGuardConnectivityWatcherService : ForegroundService() { + + private val foregroundId = 122; + + @Inject + lateinit var wifiService : NetworkService + + @Inject + lateinit var mobileDataService : NetworkService + + @Inject + lateinit var settingsRepo: Repository + + @Inject + lateinit var notificationService : NotificationService + + @Inject + lateinit var vpnService : VpnService + + private var isWifiConnected = false; + private var isMobileDataConnected = false; + private var currentNetworkSSID = ""; + + private lateinit var watcherJob : Job; + private lateinit var setting : Settings + private lateinit var tunnelConfig: String + + private var wakeLock: PowerManager.WakeLock? = null + private val tag = this.javaClass.name; + + + override fun startService(extras: Bundle?) { + super.startService(extras) + val tunnelId = extras?.getString(getString(R.string.tunnel_extras_key)) + if (tunnelId != null) { + this.tunnelConfig = tunnelId + } + // we need this lock so our service gets not affected by Doze Mode + initWakeLock() + cancelWatcherJob() + launchWatcherNotification() + if(this::tunnelConfig.isInitialized) { + startWatcherJob() + } else { + stopService(extras) + } + } + + override fun stopService(extras: Bundle?) { + super.stopService(extras) + wakeLock?.let { + if (it.isHeld) { + it.release() + } + } + cancelWatcherJob() + stopSelf() + } + + private fun launchWatcherNotification() { + val notification = notificationService.createNotification( + channelId = getString(R.string.watcher_channel_id), + channelName = getString(R.string.watcher_channel_name), + description = getString(R.string.watcher_notification_text)) + super.startForeground(foregroundId, notification) + } + + //try to start task again if killed + override fun onTaskRemoved(rootIntent: Intent) { + Timber.d("Task Removed called") + val restartServiceIntent = Intent(rootIntent) + val restartServicePendingIntent: PendingIntent = PendingIntent.getService(this, 1, restartServiceIntent, + PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE); + applicationContext.getSystemService(Context.ALARM_SERVICE); + val alarmService: AlarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager; + alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent); + } + + private fun initWakeLock() { + wakeLock = + (getSystemService(Context.POWER_SERVICE) as PowerManager).run { + newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "$tag::lock").apply { + acquire() + } + } + } + + private fun cancelWatcherJob() { + if(this::watcherJob.isInitialized) { + watcherJob.cancel() + } + } + + private fun startWatcherJob() { + watcherJob = CoroutineScope(Dispatchers.IO).launch { + val settings = settingsRepo.getAll(); + if(!settings.isNullOrEmpty()) { + setting = settings[0] + } + launch { + watchForWifiConnectivityChanges() + } + if(setting.isTunnelOnMobileDataEnabled) { + launch { + watchForMobileDataConnectivityChanges() + } + } + launch { + manageVpn() + } + } + } + + private suspend fun watchForMobileDataConnectivityChanges() { + mobileDataService.networkStatus.collect { + when(it) { + is NetworkStatus.Available -> { + Timber.d("Gained Mobile data connection") + isMobileDataConnected = true + } + is NetworkStatus.CapabilitiesChanged -> { + isMobileDataConnected = true + Timber.d("Mobile data capabilities changed") + } + is NetworkStatus.Unavailable -> { + isMobileDataConnected = false + Timber.d("Lost mobile data connection") + } + + else -> {} + } + } + } + + private suspend fun watchForWifiConnectivityChanges() { + wifiService.networkStatus.collect { + when (it) { + is NetworkStatus.Available -> { + Timber.d("Gained Wi-Fi connection") + isWifiConnected = true + } + is NetworkStatus.CapabilitiesChanged -> { + Timber.d("Wifi capabilities changed") + isWifiConnected = true + currentNetworkSSID = wifiService.getNetworkName(it.networkCapabilities) ?: ""; + } + is NetworkStatus.Unavailable -> { + isWifiConnected = false + Timber.d("Lost Wi-Fi connection") + } + + else -> {} + } + } + } + + private suspend fun manageVpn() { + while(watcherJob.isActive) { + if(setting.isTunnelOnMobileDataEnabled && + !isWifiConnected && + isMobileDataConnected + && vpnService.getState() == Tunnel.State.DOWN) { + ServiceManager.startVpnService(this, tunnelConfig) + } else if(!setting.isTunnelOnMobileDataEnabled && + !isWifiConnected && + vpnService.getState() == Tunnel.State.UP) { + ServiceManager.stopVpnService(this) + } else if(isWifiConnected && + !setting.trustedNetworkSSIDs.contains(currentNetworkSSID) && + (vpnService.getState() != Tunnel.State.UP)) { + ServiceManager.startVpnService(this, tunnelConfig) + } else if((isWifiConnected && + setting.trustedNetworkSSIDs.contains(currentNetworkSSID)) && + (vpnService.getState() == Tunnel.State.UP)) { + ServiceManager.stopVpnService(this) + } + delay(Constants.VPN_CONNECTIVITY_CHECK_INTERVAL) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt new file mode 100644 index 0000000000..776928e649 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt @@ -0,0 +1,154 @@ +package net.nymtech.nymconnect.service.foreground + +import android.app.PendingIntent +import android.content.Intent +import android.os.Bundle +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.receiver.NotificationActionReceiver +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.notification.NotificationService +import net.nymtech.nymconnect.service.tunnel.HandshakeStatus +import net.nymtech.nymconnect.service.tunnel.VpnService +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@AndroidEntryPoint +class WireGuardTunnelService : ForegroundService() { + + private val foregroundId = 123; + + @Inject + lateinit var vpnService : VpnService + + @Inject + lateinit var settingsRepo: Repository + + @Inject + lateinit var notificationService : NotificationService + + private lateinit var job : Job + + private var tunnelName : String = "" + + override fun startService(extras : Bundle?) { + super.startService(extras) + val tunnelConfigString = extras?.getString(getString(R.string.tunnel_extras_key)) + cancelJob() + job = CoroutineScope(Dispatchers.IO).launch { + if(tunnelConfigString != null) { + try { + val tunnelConfig = TunnelConfig.from(tunnelConfigString) + tunnelName = tunnelConfig.name + vpnService.startTunnel(tunnelConfig) + launchVpnStartingNotification() + } catch (e : Exception) { + Timber.e("Problem starting tunnel: ${e.message}") + stopService(extras) + } + } else { + Timber.d("Tunnel config null, starting default tunnel") + val settings = settingsRepo.getAll(); + if(!settings.isNullOrEmpty()) { + val setting = settings[0] + if(setting.defaultTunnel != null && setting.isAlwaysOnVpnEnabled) { + val tunnelConfig = TunnelConfig.from(setting.defaultTunnel!!) + tunnelName = tunnelConfig.name + vpnService.startTunnel(tunnelConfig) + launchVpnStartingNotification() + } + } + } + } + CoroutineScope(job).launch { + var didShowConnected = false + var didShowFailedHandshakeNotification = false + vpnService.handshakeStatus.collect { + when(it) { + HandshakeStatus.NOT_STARTED -> { + } + HandshakeStatus.NEVER_CONNECTED -> { + if(!didShowFailedHandshakeNotification) { + launchVpnConnectionFailedNotification(getString(R.string.initial_connection_failure_message)) + didShowFailedHandshakeNotification = true + didShowConnected = false + } + } + HandshakeStatus.HEALTHY -> { + if(!didShowConnected) { + launchVpnConnectedNotification() + didShowConnected = true + } + } + HandshakeStatus.UNHEALTHY -> { + if(!didShowFailedHandshakeNotification) { + launchVpnConnectionFailedNotification(getString(R.string.lost_connection_failure_message)) + didShowFailedHandshakeNotification = true + didShowConnected = false + } + } + } + } + } + } + + override fun stopService(extras : Bundle?) { + super.stopService(extras) + CoroutineScope(Dispatchers.IO).launch() { + vpnService.stopTunnel() + } + cancelJob() + stopSelf() + } + + private fun launchVpnConnectedNotification() { + val notification = notificationService.createNotification( + channelId = getString(R.string.vpn_channel_id), + channelName = getString(R.string.vpn_channel_name), + title = getString(R.string.tunnel_start_title), + onGoing = false, + showTimestamp = true, + description = "${getString(R.string.tunnel_start_text)} $tunnelName" + ) + super.startForeground(foregroundId, notification) + } + + private fun launchVpnStartingNotification() { + val notification = notificationService.createNotification( + channelId = getString(R.string.vpn_channel_id), + channelName = getString(R.string.vpn_channel_name), + title = getString(R.string.vpn_starting), + onGoing = false, + showTimestamp = true, + description = getString(R.string.attempt_connection) + ) + super.startForeground(foregroundId, notification) + } + + private fun launchVpnConnectionFailedNotification(message : String) { + val notification = notificationService.createNotification( + channelId = getString(R.string.vpn_channel_id), + channelName = getString(R.string.vpn_channel_name), + action = PendingIntent.getBroadcast(this,0,Intent(this, NotificationActionReceiver::class.java),PendingIntent.FLAG_IMMUTABLE), + actionText = getString(R.string.restart), + title = getString(R.string.vpn_connection_failed), + onGoing = false, + showTimestamp = true, + description = message + ) + super.startForeground(foregroundId, notification) + } + + + private fun cancelJob() { + if(this::job.isInitialized) { + job.cancel() + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt new file mode 100644 index 0000000000..9574d659ef --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt @@ -0,0 +1,117 @@ +package net.nymtech.nymconnect.service.network + +import android.content.Context +import android.net.ConnectivityManager +import android.net.Network +import android.net.NetworkCapabilities +import android.net.NetworkRequest +import android.net.wifi.SupplicantState +import android.net.wifi.WifiInfo +import android.net.wifi.WifiManager +import android.os.Build +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.map + + +abstract class BaseNetworkService>(val context: Context, networkCapability : Int) : NetworkService { + private val connectivityManager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + + private val wifiManager = + context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager + + override val networkStatus = callbackFlow { + val networkStatusCallback = when (Build.VERSION.SDK_INT) { + in Build.VERSION_CODES.S..Int.MAX_VALUE -> { + object : ConnectivityManager.NetworkCallback( + FLAG_INCLUDE_LOCATION_INFO + ) { + override fun onAvailable(network: Network) { + trySend(NetworkStatus.Available(network)) + } + + override fun onLost(network: Network) { + trySend(NetworkStatus.Unavailable(network)) + } + + override fun onCapabilitiesChanged( + network: Network, + networkCapabilities: NetworkCapabilities + ) { + trySend(NetworkStatus.CapabilitiesChanged(network, networkCapabilities)) + } + } + } + + else -> { + object : ConnectivityManager.NetworkCallback() { + + override fun onAvailable(network: Network) { + trySend(NetworkStatus.Available(network)) + } + + override fun onLost(network: Network) { + trySend(NetworkStatus.Unavailable(network)) + } + + override fun onCapabilitiesChanged( + network: Network, + networkCapabilities: NetworkCapabilities + ) { + trySend(NetworkStatus.CapabilitiesChanged(network, networkCapabilities)) + } + } + } + } + val request = NetworkRequest.Builder() + .addTransportType(networkCapability) + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) + .build() + connectivityManager.registerNetworkCallback(request, networkStatusCallback) + + awaitClose { + connectivityManager.unregisterNetworkCallback(networkStatusCallback) + } + } + + + override fun getNetworkName(networkCapabilities: NetworkCapabilities): String? { + var ssid: String? = getWifiNameFromCapabilities(networkCapabilities) + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { + val info = wifiManager.connectionInfo + if (info.supplicantState === SupplicantState.COMPLETED) { + ssid = info.ssid + } + } + return ssid?.trim('"') + } + + + companion object { + private fun getWifiNameFromCapabilities(networkCapabilities: NetworkCapabilities): String? { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + val info: WifiInfo + if (networkCapabilities.transportInfo is WifiInfo) { + info = networkCapabilities.transportInfo as WifiInfo + return info.ssid + } + } + return null + } + } +} + +inline fun Flow.map( + crossinline onUnavailable: suspend (network : Network) -> Result, + crossinline onAvailable: suspend (network : Network) -> Result, + crossinline onCapabilitiesChanged: suspend (network : Network, networkCapabilities : NetworkCapabilities) -> Result, +): Flow = map { status -> + when (status) { + is NetworkStatus.Unavailable -> onUnavailable(status.network) + is NetworkStatus.Available -> onAvailable(status.network) + is NetworkStatus.CapabilitiesChanged -> onCapabilitiesChanged(status.network, status.networkCapabilities) + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt new file mode 100644 index 0000000000..a067af06cf --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt @@ -0,0 +1,10 @@ +package net.nymtech.nymconnect.service.network + +import android.content.Context +import android.net.NetworkCapabilities +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class MobileDataService @Inject constructor(@ApplicationContext context: Context) : + BaseNetworkService(context, NetworkCapabilities.TRANSPORT_CELLULAR) { +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt new file mode 100644 index 0000000000..6c274dab03 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt @@ -0,0 +1,10 @@ +package net.nymtech.nymconnect.service.network + +import android.net.NetworkCapabilities +import kotlinx.coroutines.flow.Flow + +interface NetworkService { + fun getNetworkName(networkCapabilities: NetworkCapabilities) : String? + val networkStatus : Flow + +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt new file mode 100644 index 0000000000..5446ce52a6 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt @@ -0,0 +1,10 @@ +package net.nymtech.nymconnect.service.network + +import android.net.Network +import android.net.NetworkCapabilities + +sealed class NetworkStatus { + class Available(val network : Network) : NetworkStatus() + class Unavailable(val network : Network) : NetworkStatus() + class CapabilitiesChanged(val network : Network, val networkCapabilities : NetworkCapabilities) : NetworkStatus() +} diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt new file mode 100644 index 0000000000..a01ebba746 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt @@ -0,0 +1,10 @@ +package net.nymtech.nymconnect.service.network + +import android.content.Context +import android.net.NetworkCapabilities +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class WifiService @Inject constructor(@ApplicationContext context: Context) : + BaseNetworkService(context, NetworkCapabilities.TRANSPORT_WIFI) { +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt new file mode 100644 index 0000000000..4071e64202 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt @@ -0,0 +1,21 @@ +package net.nymtech.nymconnect.service.notification + +import android.app.Notification +import android.app.NotificationManager +import android.app.PendingIntent + +interface NotificationService { + fun createNotification( + channelId: String, + channelName: String, + title: String = "", + action: PendingIntent? = null, + actionText: String? = null, + description: String, + showTimestamp : Boolean = false, + importance: Int = NotificationManager.IMPORTANCE_HIGH, + vibration: Boolean = true, + onGoing: Boolean = true, + lights: Boolean = true + ): Notification +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt new file mode 100644 index 0000000000..4e4cdb3e1b --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt @@ -0,0 +1,77 @@ +package net.nymtech.nymconnect.service.notification + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.graphics.Color +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.ui.MainActivity +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class WireGuardNotification @Inject constructor(@ApplicationContext private val context: Context) : NotificationService { + + private val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager; + + override fun createNotification( + channelId: String, + channelName: String, + title: String, + action: PendingIntent?, + actionText: String?, + description: String, + showTimestamp: Boolean, + importance: Int, + vibration: Boolean, + onGoing: Boolean, + lights: Boolean + ): Notification { + val channel = NotificationChannel( + channelId, + channelName, + importance + ).let { + it.description = title + it.enableLights(lights) + it.lightColor = Color.RED + it.enableVibration(vibration) + it.vibrationPattern = longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400) + it + } + notificationManager.createNotificationChannel(channel) + val pendingIntent: PendingIntent = + Intent(context, MainActivity::class.java).let { notificationIntent -> + PendingIntent.getActivity( + context, + 0, + notificationIntent, + PendingIntent.FLAG_IMMUTABLE + ) + } + + val builder: Notification.Builder = + Notification.Builder( + context, + channelId + ) + return builder.let { + if(action != null && actionText != null) { + //TODO find a not deprecated way to do this + it.addAction( + Notification.Action.Builder(0, actionText, action) + .build()) + it.setAutoCancel(true) + } + it.setContentTitle(title) + .setContentText(description) + .setContentIntent(pendingIntent) + .setOngoing(onGoing) + .setShowWhen(showTimestamp) + .setSmallIcon(R.mipmap.ic_launcher_foreground) + .build() + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsActivity.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsActivity.kt new file mode 100644 index 0000000000..c88825e71e --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsActivity.kt @@ -0,0 +1,28 @@ +package net.nymtech.nymconnect.service.shortcut + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.service.foreground.Action +import net.nymtech.nymconnect.service.foreground.ServiceManager +import net.nymtech.nymconnect.service.foreground.WireGuardTunnelService +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class ShortcutsActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if(intent.getStringExtra(ShortcutsManager.CLASS_NAME_EXTRA_KEY) + .equals(WireGuardTunnelService::class.java.name)) { + intent.getStringExtra(getString(R.string.tunnel_extras_key))?.let { + ServiceManager.toggleWatcherService(this, it) + } + when(intent.action){ + Action.STOP.name -> ServiceManager.stopVpnService(this) + Action.START.name -> intent.getStringExtra(getString(R.string.tunnel_extras_key)) + ?.let { ServiceManager.startVpnService(this, it) } + } + } + finish() + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsManager.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsManager.kt new file mode 100644 index 0000000000..13df427ebd --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsManager.kt @@ -0,0 +1,73 @@ +package net.nymtech.nymconnect.service.shortcut + +import android.content.Context +import android.content.Intent +import androidx.core.content.pm.ShortcutInfoCompat +import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.graphics.drawable.IconCompat +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.service.foreground.Action +import net.nymtech.nymconnect.service.foreground.WireGuardTunnelService +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig + +object ShortcutsManager { + + private const val SHORT_LABEL_MAX_SIZE = 10; + private const val LONG_LABEL_MAX_SIZE = 25; + private const val APPEND_ON = " On"; + private const val APPEND_OFF = " Off" + const val CLASS_NAME_EXTRA_KEY = "className" + + private fun createAndPushShortcut(context : Context, intent : Intent, id : String, shortLabel : String, + longLabel : String, drawable : Int ) { + val shortcut = ShortcutInfoCompat.Builder(context, id) + .setShortLabel(shortLabel) + .setLongLabel(longLabel) + .setIcon(IconCompat.createWithResource(context, drawable)) + .setIntent(intent) + .build() + ShortcutManagerCompat.pushDynamicShortcut(context, shortcut) + } + + fun createTunnelShortcuts(context : Context, tunnelConfig : TunnelConfig) { + createAndPushShortcut(context, + createTunnelOnIntent(context, mapOf(context.getString(R.string.tunnel_extras_key) to tunnelConfig.toString())), + tunnelConfig.id.toString() + APPEND_ON, + tunnelConfig.name.take((SHORT_LABEL_MAX_SIZE - APPEND_ON.length)) + APPEND_ON, + tunnelConfig.name.take((LONG_LABEL_MAX_SIZE - APPEND_ON.length)) + APPEND_ON, + R.drawable.vpn_on + ) + createAndPushShortcut(context, + createTunnelOffIntent(context, mapOf(context.getString(R.string.tunnel_extras_key) to tunnelConfig.toString())), + tunnelConfig.id.toString() + APPEND_OFF, + tunnelConfig.name.take((SHORT_LABEL_MAX_SIZE - APPEND_OFF.length)) + APPEND_OFF, + tunnelConfig.name.take((LONG_LABEL_MAX_SIZE - APPEND_OFF.length)) + APPEND_OFF, + R.drawable.vpn_off + ) + } + + fun removeTunnelShortcuts(context : Context, tunnelConfig : TunnelConfig) { + ShortcutManagerCompat.removeDynamicShortcuts(context, listOf(tunnelConfig.id.toString() + APPEND_ON, + tunnelConfig.id.toString() + APPEND_OFF )) + } + + private fun createTunnelOnIntent(context: Context, extras : Map) : Intent { + return Intent(context, ShortcutsActivity::class.java).also { + it.action = Action.START.name + it.putExtra(CLASS_NAME_EXTRA_KEY, WireGuardTunnelService::class.java.name) + extras.forEach {(k, v) -> + it.putExtra(k, v) + } + } + } + + private fun createTunnelOffIntent(context : Context, extras : Map) : Intent { + return Intent(context, ShortcutsActivity::class.java).also { + it.action = Action.STOP.name + it.putExtra(CLASS_NAME_EXTRA_KEY, WireGuardTunnelService::class.java.name) + extras.forEach {(k, v) -> + it.putExtra(k, v) + } + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile/TunnelControlTile.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile/TunnelControlTile.kt new file mode 100644 index 0000000000..38c774c963 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile/TunnelControlTile.kt @@ -0,0 +1,142 @@ +package net.nymtech.nymconnect.service.tile + +import android.os.Build +import android.service.quicksettings.Tile +import android.service.quicksettings.TileService +import com.wireguard.android.backend.Tunnel +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.foreground.ServiceManager +import net.nymtech.nymconnect.service.tunnel.VpnService +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@AndroidEntryPoint +class TunnelControlTile : TileService() { + + @Inject + lateinit var settingsRepo : Repository + + @Inject + lateinit var configRepo : Repository + + @Inject + lateinit var vpnService : VpnService + + private val scope = CoroutineScope(Dispatchers.Main); + + private lateinit var job : Job + + override fun onStartListening() { + job = scope.launch { + updateTileState() + } + super.onStartListening() + } + + override fun onTileAdded() { + super.onTileAdded() + qsTile.contentDescription = this.resources.getString(R.string.toggle_vpn) + scope.launch { + updateTileState(); + } + } + + override fun onTileRemoved() { + super.onTileRemoved() + cancelJob() + } + + override fun onClick() { + super.onClick() + unlockAndRun { + scope.launch { + try { + val tunnel = determineTileTunnel(); + if(tunnel != null) { + attemptWatcherServiceToggle(tunnel.toString()) + if(vpnService.getState() == Tunnel.State.UP) { + ServiceManager.stopVpnService(this@TunnelControlTile) + } else { + ServiceManager.startVpnService(this@TunnelControlTile, tunnel.toString()) + } + } + } catch (e : Exception) { + Timber.e(e.message) + } finally { + cancel() + } + } + } + } + + private suspend fun determineTileTunnel() : TunnelConfig? { + var tunnelConfig : TunnelConfig? = null; + val settings = settingsRepo.getAll() + if (!settings.isNullOrEmpty()) { + val setting = settings.first() + tunnelConfig = if (setting.defaultTunnel != null) { + TunnelConfig.from(setting.defaultTunnel!!); + } else { + val config = configRepo.getAll()?.first(); + config; + } + } + return tunnelConfig; + } + + + private fun attemptWatcherServiceToggle(tunnelConfig : String) { + scope.launch { + val settings = settingsRepo.getAll() + if (!settings.isNullOrEmpty()) { + val setting = settings.first() + if(setting.isAutoTunnelEnabled) { + ServiceManager.toggleWatcherService(this@TunnelControlTile, tunnelConfig) + } + } + } + } + + private suspend fun updateTileState() { + vpnService.state.collect { + when(it) { + Tunnel.State.UP -> { + qsTile.state = Tile.STATE_ACTIVE + } + Tunnel.State.DOWN -> { + qsTile.state = Tile.STATE_INACTIVE; + } + else -> { + qsTile.state = Tile.STATE_UNAVAILABLE + } + } + val config = determineTileTunnel(); + setTileDescription(config?.name ?: this.resources.getString(R.string.no_tunnel_available)) + qsTile.updateTile() + } + } + + private fun setTileDescription(description : String) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + qsTile.subtitle = description + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + qsTile.stateDescription = description; + } + } + + private fun cancelJob() { + if(this::job.isInitialized) { + job.cancel(); + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/HandshakeStatus.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/HandshakeStatus.kt new file mode 100644 index 0000000000..1d2fa54ea7 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/HandshakeStatus.kt @@ -0,0 +1,14 @@ +package net.nymtech.nymconnect.service.tunnel + +enum class HandshakeStatus { + HEALTHY, + UNHEALTHY, + NEVER_CONNECTED, + NOT_STARTED; + + companion object { + private const val WG_TYPICAL_HANDSHAKE_INTERVAL_WHEN_HEALTHY_SEC = 120 + const val UNHEALTHY_TIME_LIMIT_SEC = WG_TYPICAL_HANDSHAKE_INTERVAL_WHEN_HEALTHY_SEC + 60 + const val NEVER_CONNECTED_TO_UNHEALTHY_TIME_LIMIT_SEC = 30 + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt new file mode 100644 index 0000000000..15c8c1b676 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt @@ -0,0 +1,18 @@ +package net.nymtech.nymconnect.service.tunnel + +import com.wireguard.android.backend.Statistics +import com.wireguard.android.backend.Tunnel +import com.wireguard.crypto.Key +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import kotlinx.coroutines.flow.SharedFlow + +interface VpnService : Tunnel { + suspend fun startTunnel(tunnelConfig : TunnelConfig) : Tunnel.State + suspend fun stopTunnel() + val state : SharedFlow + val tunnelName : SharedFlow + val statistics : SharedFlow + val lastHandshake : SharedFlow> + val handshakeStatus : SharedFlow + fun getState() : Tunnel.State +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt new file mode 100644 index 0000000000..ae9a3c233d --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt @@ -0,0 +1,131 @@ +package net.nymtech.nymconnect.service.tunnel + +import com.wireguard.android.backend.Backend +import com.wireguard.android.backend.BackendException +import com.wireguard.android.backend.Statistics +import com.wireguard.android.backend.Tunnel +import com.wireguard.crypto.Key +import net.nymtech.nymconnect.Constants +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import net.nymtech.nymconnect.util.NumberUtils +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + + +class WireGuardTunnel @Inject constructor(private val backend : Backend, +) : VpnService { + + private val _tunnelName = MutableStateFlow("") + override val tunnelName get() = _tunnelName.asStateFlow() + + private val _state = MutableSharedFlow( + onBufferOverflow = BufferOverflow.DROP_OLDEST, + replay = 1) + + private val _handshakeStatus = MutableSharedFlow(replay = 1, + onBufferOverflow = BufferOverflow.DROP_OLDEST) + override val state get() = _state.asSharedFlow() + + private val _statistics = MutableSharedFlow(replay = 1) + override val statistics get() = _statistics.asSharedFlow() + + private val _lastHandshake = MutableSharedFlow>(replay = 1) + override val lastHandshake get() = _lastHandshake.asSharedFlow() + + override val handshakeStatus: SharedFlow + get() = _handshakeStatus.asSharedFlow() + + private lateinit var statsJob : Job + + + override suspend fun startTunnel(tunnelConfig: TunnelConfig) : Tunnel.State{ + return try { + if(getState() == Tunnel.State.UP && _tunnelName.value != tunnelConfig.name) { + stopTunnel() + } + _tunnelName.emit(tunnelConfig.name) + val config = TunnelConfig.configFromQuick(tunnelConfig.wgQuick) + val state = backend.setState( + this, Tunnel.State.UP, config) + _state.emit(state) + state; + } catch (e : Exception) { + Timber.e("Failed to start tunnel with error: ${e.message}") + Tunnel.State.DOWN + } + } + + override fun getName(): String { + return _tunnelName.value + } + + override suspend fun stopTunnel() { + try { + if(getState() == Tunnel.State.UP) { + val state = backend.setState(this, Tunnel.State.DOWN, null) + _state.emit(state) + } + } catch (e : BackendException) { + Timber.e("Failed to stop tunnel with error: ${e.message}") + } + } + + override fun getState(): Tunnel.State { + return backend.getState(this) + } + + override fun onStateChange(state : Tunnel.State) { + val tunnel = this; + _state.tryEmit(state) + if(state == Tunnel.State.UP) { + statsJob = CoroutineScope(Dispatchers.IO).launch { + val handshakeMap = HashMap() + var neverHadHandshakeCounter = 0 + while (true) { + val statistics = backend.getStatistics(tunnel) + _statistics.emit(statistics) + statistics.peers().forEach { + val handshakeEpoch = statistics.peer(it)?.latestHandshakeEpochMillis ?: 0L + handshakeMap[it] = handshakeEpoch + if(handshakeEpoch == 0L) { + if(neverHadHandshakeCounter >= HandshakeStatus.NEVER_CONNECTED_TO_UNHEALTHY_TIME_LIMIT_SEC) { + _handshakeStatus.emit(HandshakeStatus.NEVER_CONNECTED) + } else { + _handshakeStatus.emit(HandshakeStatus.NOT_STARTED) + } + if(neverHadHandshakeCounter <= HandshakeStatus.NEVER_CONNECTED_TO_UNHEALTHY_TIME_LIMIT_SEC) { + neverHadHandshakeCounter += 10 + } + return@forEach + } + if(NumberUtils.getSecondsBetweenTimestampAndNow(handshakeEpoch) >= HandshakeStatus.UNHEALTHY_TIME_LIMIT_SEC) { + _handshakeStatus.emit(HandshakeStatus.UNHEALTHY) + } else { + _handshakeStatus.emit(HandshakeStatus.HEALTHY) + } + } + _lastHandshake.emit(handshakeMap) + delay(Constants.VPN_STATISTIC_CHECK_INTERVAL) + } + } + } + if(state == Tunnel.State.DOWN) { + if(this::statsJob.isInitialized) { + statsJob.cancel() + } + _handshakeStatus.tryEmit(HandshakeStatus.NOT_STARTED) + _lastHandshake.tryEmit(emptyMap()) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt new file mode 100644 index 0000000000..2aff4e9f11 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt @@ -0,0 +1,15 @@ +package net.nymtech.nymconnect.service.tunnel.model + +import io.objectbox.annotation.Entity +import io.objectbox.annotation.Id + +@Entity +data class Settings( + @Id + var id : Long = 0, + var isAutoTunnelEnabled : Boolean = false, + var isTunnelOnMobileDataEnabled : Boolean = false, + var trustedNetworkSSIDs : MutableList = mutableListOf(), + var defaultTunnel : String? = null, + var isAlwaysOnVpnEnabled : Boolean = false, +) diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt new file mode 100644 index 0000000000..91f7440d0d --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt @@ -0,0 +1,89 @@ +package net.nymtech.nymconnect.service.tunnel.model + +import com.wireguard.config.Config +import io.objectbox.annotation.ConflictStrategy +import io.objectbox.annotation.Entity +import io.objectbox.annotation.Id +import io.objectbox.annotation.Unique +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import java.io.InputStream + + +@Entity +@Serializable +data class TunnelConfig( + @Id + var id : Long = 0, + @Unique(onConflict = ConflictStrategy.REPLACE) + var name : String, + var wgQuick : String +) { + + + override fun toString(): String { + return Json.encodeToString(serializer(), this) + } + + companion object { + private const val INCLUDED_APPLICATIONS = "IncludedApplications = " + private const val EXCLUDED_APPLICATIONS = "ExcludedApplications = " + private const val INTERFACE = "[Interface]" + private const val NEWLINE_CHAR = "\n" + private const val APP_CONFIG_SEPARATOR = ", " + + private fun addApplicationsToConfig(appConfig : String, wgQuick : String) : String { + val configList = wgQuick.split(NEWLINE_CHAR).toMutableList() + val interfaceIndex = configList.indexOf(INTERFACE) + configList.add(interfaceIndex + 1, appConfig) + return configList.joinToString(NEWLINE_CHAR) + } + + fun clearAllApplicationsFromConfig(wgQuick : String) : String { + val configList = wgQuick.split(NEWLINE_CHAR).toMutableList() + val itr = configList.iterator() + while (itr.hasNext()) { + val next = itr.next() + if(next.contains(INCLUDED_APPLICATIONS) || next.contains(EXCLUDED_APPLICATIONS)) { + itr.remove() + } + } + return configList.joinToString(NEWLINE_CHAR) + } + + + fun setExcludedApplicationsOnQuick(packages : List, wgQuick: String) : String { + if(packages.isEmpty()) { + return wgQuick + } + val clearedWgQuick = clearAllApplicationsFromConfig(wgQuick) + val excludeConfig = buildExcludedApplicationsString(packages) + return addApplicationsToConfig(excludeConfig, clearedWgQuick) + } + + fun setIncludedApplicationsOnQuick(packages : List, wgQuick: String) : String { + if(packages.isEmpty()) { + return wgQuick + } + val clearedWgQuick = clearAllApplicationsFromConfig(wgQuick) + val includeConfig = buildIncludedApplicationsString(packages) + return addApplicationsToConfig(includeConfig, clearedWgQuick) + } + + private fun buildExcludedApplicationsString(packages : List) : String { + return EXCLUDED_APPLICATIONS + packages.joinToString(APP_CONFIG_SEPARATOR) + } + + private fun buildIncludedApplicationsString(packages : List) : String { + return INCLUDED_APPLICATIONS + packages.joinToString(APP_CONFIG_SEPARATOR) + } + fun from(string : String) : TunnelConfig { + return Json.decodeFromString(string) + } + fun configFromQuick(wgQuick: String): Config { + val inputStream: InputStream = wgQuick.byteInputStream() + val reader = inputStream.bufferedReader(Charsets.UTF_8) + return Config.parse(reader) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt new file mode 100644 index 0000000000..edb82cc213 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt @@ -0,0 +1,201 @@ +package net.nymtech.nymconnect.ui + +import android.Manifest +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.Settings +import android.view.KeyEvent +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.compose.setContent +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.slideInHorizontally +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.input.key.onKeyEvent +import com.google.accompanist.navigation.animation.AnimatedNavHost +import com.google.accompanist.navigation.animation.composable +import com.google.accompanist.navigation.animation.rememberAnimatedNavController +import com.google.accompanist.permissions.ExperimentalPermissionsApi +import com.google.accompanist.permissions.isGranted +import com.google.accompanist.permissions.rememberPermissionState +import com.wireguard.android.backend.GoBackend +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.ui.common.PermissionRequestFailedScreen +import net.nymtech.nymconnect.ui.common.navigation.BottomNavBar +import net.nymtech.nymconnect.ui.screens.config.ConfigScreen +import net.nymtech.nymconnect.ui.screens.detail.DetailScreen +import net.nymtech.nymconnect.ui.screens.main.MainScreen +import net.nymtech.nymconnect.ui.screens.settings.SettingsScreen +import net.nymtech.nymconnect.ui.screens.support.SupportScreen +import net.nymtech.nymconnect.ui.theme.TransparentSystemBars +import net.nymtech.nymconnect.ui.theme.WireguardAutoTunnelTheme +import dagger.hilt.android.AndroidEntryPoint +import timber.log.Timber +import java.lang.IllegalStateException + +@AndroidEntryPoint +class MainActivity : AppCompatActivity() { + + @OptIn(ExperimentalAnimationApi::class, + ExperimentalPermissionsApi::class + ) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + val navController = rememberAnimatedNavController() + val focusRequester = remember { FocusRequester() } + + WireguardAutoTunnelTheme { + TransparentSystemBars() + + val snackbarHostState = remember { SnackbarHostState() } + + val notificationPermissionState = + rememberPermissionState(Manifest.permission.POST_NOTIFICATIONS) + + fun requestNotificationPermission() { + if (!notificationPermissionState.status.isGranted && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + notificationPermissionState.launchPermissionRequest() + } + } + + var vpnIntent by remember { mutableStateOf(GoBackend.VpnService.prepare(this)) } + val vpnActivityResultState = rememberLauncherForActivityResult( + ActivityResultContracts.StartActivityForResult(), + onResult = { + val accepted = (it.resultCode == RESULT_OK) + if (accepted) { + vpnIntent = null + } + }) + LaunchedEffect(vpnIntent) { + if (vpnIntent != null) { + vpnActivityResultState.launch(vpnIntent) + } else requestNotificationPermission() + } + + Scaffold(snackbarHost = { SnackbarHost(snackbarHostState)}, + modifier = Modifier.onKeyEvent { + if (it.nativeKeyEvent.action == KeyEvent.ACTION_UP) { + when (it.nativeKeyEvent.keyCode) { + KeyEvent.KEYCODE_DPAD_UP -> { + try { + focusRequester.requestFocus() + } catch(e : IllegalStateException) { + Timber.e("No D-Pad focus request modifier added to element on screen") + } + false + } else -> { + false; + } + } + } else { + false + } + }, + bottomBar = if (vpnIntent == null && notificationPermissionState.status.isGranted) { + { BottomNavBar(navController, Routes.navItems) } + } else { + {} + }, + ) + { padding -> + if (vpnIntent != null) { + PermissionRequestFailedScreen( + padding = padding, + onRequestAgain = { vpnActivityResultState.launch(vpnIntent) }, + message = getString(R.string.vpn_permission_required), + getString(R.string.retry) + ) + return@Scaffold + } + if (!notificationPermissionState.status.isGranted) { + PermissionRequestFailedScreen( + padding = padding, + onRequestAgain = { + val intentSettings = + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intentSettings.data = + Uri.fromParts("package", this.packageName, null) + startActivity(intentSettings); + }, + message = getString(R.string.notification_permission_required), + getString(R.string.open_settings) + ) + return@Scaffold + } + AnimatedNavHost(navController, startDestination = Routes.Main.name) { + composable(Routes.Main.name, enterTransition = { + when (initialState.destination.route) { + Routes.Settings.name, Routes.Support.name -> + slideInHorizontally( + initialOffsetX = { -1000 }, + animationSpec = tween(500) + ) + + else -> { + fadeIn(animationSpec = tween(1000)) + } + } + }) { + MainScreen(padding = padding, snackbarHostState = snackbarHostState, navController = navController) + } + composable(Routes.Settings.name, enterTransition = { + when (initialState.destination.route) { + Routes.Main.name -> + slideInHorizontally( + initialOffsetX = { 1000 }, + animationSpec = tween(500) + ) + + Routes.Support.name -> { + slideInHorizontally( + initialOffsetX = { -1000 }, + animationSpec = tween(500) + ) + } + + else -> { + fadeIn(animationSpec = tween(1000)) + } + } + }) { SettingsScreen(padding = padding, snackbarHostState = snackbarHostState, navController = navController, focusRequester = focusRequester) } + composable(Routes.Support.name, enterTransition = { + when (initialState.destination.route) { + Routes.Settings.name, Routes.Main.name -> + slideInHorizontally( + initialOffsetX = { 1000 }, + animationSpec = tween(500) + ) + + else -> { + fadeIn(animationSpec = tween(1000)) + } + } + }) { SupportScreen(padding = padding, focusRequester) } + composable("${Routes.Config.name}/{id}", enterTransition = { + fadeIn(animationSpec = tween(1000)) + }) { ConfigScreen(padding = padding, navController = navController, id = it.arguments?.getString("id"), focusRequester = focusRequester)} + composable("${Routes.Detail.name}/{id}", enterTransition = { + fadeIn(animationSpec = tween(1000)) + }) { DetailScreen(padding = padding, id = it.arguments?.getString("id")) } + } + } + } + } + } +} diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt new file mode 100644 index 0000000000..589fa5fbbf --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt @@ -0,0 +1,36 @@ +package net.nymtech.nymconnect.ui + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Home +import androidx.compose.material.icons.rounded.QuestionMark +import androidx.compose.material.icons.rounded.Settings +import net.nymtech.nymconnect.ui.common.navigation.BottomNavItem + +enum class Routes { + Main, + Settings, + Support, + Config, + Detail; + + + companion object { + val navItems = listOf( + BottomNavItem( + name = "Tunnels", + route = Main.name, + icon = Icons.Rounded.Home, + ), + BottomNavItem( + name = "Settings", + route = Settings.name, + icon = Icons.Rounded.Settings, + ), + BottomNavItem( + name = "Support", + route = Support.name, + icon = Icons.Rounded.QuestionMark, + ) + ) + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt new file mode 100644 index 0000000000..66aa0b8790 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt @@ -0,0 +1,9 @@ +package net.nymtech.nymconnect.ui + +data class ViewState( + val showSnackbarMessage : Boolean = false, + val snackbarMessage : String = "", + val snackbarActionText : String = "", + val onSnackbarActionClick : () -> Unit = {}, + val isLoading : Boolean = false +) diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt new file mode 100644 index 0000000000..2ddd1f27b2 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt @@ -0,0 +1,31 @@ +package net.nymtech.nymconnect.ui.common + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector + +@Composable +fun ClickableIconButton(onIconClick : () -> Unit, text : String, icon : ImageVector, enabled : Boolean) { + Button(onClick = {}, + enabled = enabled + ) { + Text(text) + Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) + Icon( + imageVector = icon, + contentDescription = "Delete", + modifier = Modifier.size(ButtonDefaults.IconSize).clickable { + if(enabled) { + onIconClick() + } + } + ) + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt new file mode 100644 index 0000000000..a0f81b5745 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt @@ -0,0 +1,35 @@ +package net.nymtech.nymconnect.ui.common + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.launch + +@Composable +fun PermissionRequestFailedScreen(padding : PaddingValues, onRequestAgain : () -> Unit, message : String, buttonText : String ) { + val scope = rememberCoroutineScope() + Column(horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding)) { + Text(message, textAlign = TextAlign.Center, modifier = Modifier.padding(15.dp)) + Button(onClick = { + scope.launch { + onRequestAgain() + } + }) { + Text(buttonText) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt new file mode 100644 index 0000000000..33fb6d0bf6 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt @@ -0,0 +1,55 @@ +package net.nymtech.nymconnect.ui.common + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.unit.dp + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun RowListItem(leadingIcon : ImageVector? = null, leadingIconColor : Color = Color.Gray, text : String, onHold : () -> Unit, onClick: () -> Unit, rowButton : @Composable() () -> Unit ) { + Box( + modifier = Modifier + .combinedClickable( + onClick = { + onClick() + }, + onLongClick = { + onHold() + } + ) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Row(verticalAlignment = Alignment.CenterVertically,) { + if(leadingIcon != null) { + Icon( + leadingIcon, "status", + tint = leadingIconColor, + modifier = Modifier.padding(end = 10.dp).size(15.dp) + ) + } + Text(text) + } + + rowButton() + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/SearchBar.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/SearchBar.kt new file mode 100644 index 0000000000..cec26f5b09 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/SearchBar.kt @@ -0,0 +1,80 @@ +package net.nymtech.nymconnect.ui.common + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Clear +import androidx.compose.material.icons.rounded.Search +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.KeyboardType +import net.nymtech.nymconnect.R + +@Composable +fun SearchBar( + onQuery : (queryString : String) -> Unit +) { + // Immediately update and keep track of query from text field changes. + var query: String by rememberSaveable { mutableStateOf("") } + var showClearIcon by rememberSaveable { mutableStateOf(false) } + + if (query.isEmpty()) { + showClearIcon = false + } else if (query.isNotEmpty()) { + showClearIcon = true + } + + TextField( + value = query, + onValueChange = { onQueryChanged -> + // If user makes changes to text, immediately updated it. + query = onQueryChanged + onQuery(onQueryChanged) + }, + leadingIcon = { + Icon( + imageVector = Icons.Rounded.Search, + tint = MaterialTheme.colorScheme.onBackground, + contentDescription = stringResource(id = R.string.search_icon) + ) + }, + trailingIcon = { + if (showClearIcon) { + IconButton(onClick = { query = "" }) { + Icon( + imageVector = Icons.Rounded.Clear, + tint = MaterialTheme.colorScheme.onBackground, + contentDescription = stringResource(id = R.string.clear_icon) + ) + } + } + }, + maxLines = 1, + colors = TextFieldDefaults.colors( + focusedContainerColor = Color.Transparent, + unfocusedContainerColor = Color.Transparent, + disabledContainerColor = Color.Transparent, + ), + placeholder = { Text(text = stringResource(R.string.hint_search_packages)) }, + textStyle = MaterialTheme.typography.bodySmall, + singleLine = true, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text), + modifier = Modifier + .fillMaxWidth() + .background(color = MaterialTheme.colorScheme.background, shape = RectangleShape) + ) +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt new file mode 100644 index 0000000000..957228eece --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt @@ -0,0 +1,42 @@ +package net.nymtech.nymconnect.ui.common.navigation + +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.text.font.FontWeight +import androidx.navigation.NavController +import androidx.navigation.compose.currentBackStackEntryAsState + +@Composable +fun BottomNavBar(navController : NavController, bottomNavItems : List) { + + val backStackEntry = navController.currentBackStackEntryAsState() + + NavigationBar( + containerColor = MaterialTheme.colorScheme.background, + ) { + bottomNavItems.forEach { item -> + val selected = item.route == backStackEntry.value?.destination?.route + + NavigationBarItem( + selected = selected, + onClick = { navController.navigate(item.route) }, + label = { + Text( + text = item.name, + fontWeight = FontWeight.SemiBold, + ) + }, + icon = { + Icon( + imageVector = item.icon, + contentDescription = "${item.name} Icon", + ) + } + ) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt new file mode 100644 index 0000000000..a4a585ce5e --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt @@ -0,0 +1,9 @@ +package net.nymtech.nymconnect.ui.common.navigation + +import androidx.compose.ui.graphics.vector.ImageVector + +data class BottomNavItem( + val name: String, + val route: String, + val icon: ImageVector, +) diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigScreen.kt new file mode 100644 index 0000000000..1ecfaf6570 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigScreen.kt @@ -0,0 +1,241 @@ +package net.nymtech.nymconnect.ui.screens.config + +import android.widget.Toast +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Android +import androidx.compose.material3.Button +import androidx.compose.material3.Checkbox +import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.navigation.NavController +import com.google.accompanist.drawablepainter.DrawablePainter +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.ui.Routes +import net.nymtech.nymconnect.ui.common.SearchBar +import kotlinx.coroutines.launch + +@OptIn(ExperimentalComposeUiApi::class) +@Composable +fun ConfigScreen( + viewModel: ConfigViewModel = hiltViewModel(), + padding: PaddingValues, + focusRequester: FocusRequester, + navController: NavController, + id : String? +) { + + val context = LocalContext.current + val focusManager = LocalFocusManager.current + + val keyboardController = LocalSoftwareKeyboardController.current + val scope = rememberCoroutineScope() + val tunnel by viewModel.tunnel.collectAsStateWithLifecycle(null) + val tunnelName = viewModel.tunnelName.collectAsStateWithLifecycle() + val packages by viewModel.packages.collectAsStateWithLifecycle() + val checkedPackages by viewModel.checkedPackages.collectAsStateWithLifecycle() + val include by viewModel.include.collectAsStateWithLifecycle() + val allApplications by viewModel.allApplications.collectAsStateWithLifecycle() + + LaunchedEffect(Unit) { + viewModel.getTunnelById(id) + viewModel.emitQueriedPackages("") + viewModel.emitCurrentPackageConfigurations(id) + } + + if(tunnel != null) { + LazyColumn( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + item { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = 7.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + OutlinedTextField( + modifier = Modifier.focusRequester(focusRequester), + value = tunnelName.value, + onValueChange = { + viewModel.onTunnelNameChange(it) + }, + label = { Text(stringResource(id = R.string.tunnel_name)) }, + maxLines = 1, + keyboardOptions = KeyboardOptions( + capitalization = KeyboardCapitalization.None, + imeAction = ImeAction.Done + ), + keyboardActions = KeyboardActions( + onDone = { + focusManager.clearFocus() + keyboardController?.hide() + viewModel.onTunnelNameChange(tunnelName.value) + } + ), + ) + } + } + item { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = 7.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(id = R.string.tunnel_all)) + Switch( + checked = allApplications, + onCheckedChange = { + viewModel.onAllApplicationsChange(!allApplications) + } + ) + } + } + if (!allApplications) { + item { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = 7.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(id = R.string.include)) + Checkbox( + checked = include, + onCheckedChange = { + viewModel.onIncludeChange(!include) + } + ) + } + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(id = R.string.exclude)) + Checkbox( + checked = !include, + onCheckedChange = { + viewModel.onIncludeChange(!include) + } + ) + } + } + } + item { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = 7.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween) { + SearchBar(viewModel::emitQueriedPackages); + } + } + items(packages) { pack -> + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Row( + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(5.dp) + ) { + val drawable = + pack.applicationInfo?.loadIcon(context.packageManager) + if (drawable != null) { + Image( + painter = DrawablePainter(drawable), + stringResource(id = R.string.icon), + modifier = Modifier.size(50.dp, 50.dp) + ) + } else { + Icon( + Icons.Rounded.Android, + stringResource(id = R.string.edit), + modifier = Modifier.size(50.dp, 50.dp) + ) + } + Text( + pack.applicationInfo.loadLabel(context.packageManager) + .toString(), modifier = Modifier.padding(5.dp) + ) + } + Checkbox( + checked = (checkedPackages.contains(pack.packageName)), + onCheckedChange = { + if (it) viewModel.onAddCheckedPackage(pack.packageName) else viewModel.onRemoveCheckedPackage( + pack.packageName + ) + } + ) + } + } + } + item { + Row( + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth() + ) { + Button(onClick = { + scope.launch { + viewModel.onSaveAllChanges() + Toast.makeText( + context, + context.resources.getString(R.string.config_changes_saved), + Toast.LENGTH_LONG + ).show() + navController.navigate(Routes.Main.name) + } + }, Modifier.padding(25.dp)) { + Text(stringResource(id = R.string.save_changes)) + } + } + } + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigViewModel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigViewModel.kt new file mode 100644 index 0000000000..325e5a49bd --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigViewModel.kt @@ -0,0 +1,152 @@ +package net.nymtech.nymconnect.ui.screens.config + +import android.Manifest +import android.app.Application +import android.content.pm.PackageInfo +import android.content.pm.PackageManager +import android.os.Build +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.toMutableStateList +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class ConfigViewModel @Inject constructor(private val application : Application, + private val tunnelRepo : Repository, + private val settingsRepo : Repository) : ViewModel() { + + private val _tunnel = MutableStateFlow(null) + private val _tunnelName = MutableStateFlow("") + val tunnelName get() = _tunnelName.asStateFlow() + val tunnel get() = _tunnel.asStateFlow() + private val _packages = MutableStateFlow(emptyList()) + val packages get() = _packages.asStateFlow() + private val packageManager = application.packageManager + + private val _checkedPackages = MutableStateFlow(mutableStateListOf()) + val checkedPackages get() = _checkedPackages.asStateFlow() + private val _include = MutableStateFlow(true) + val include get() = _include.asStateFlow() + + private val _allApplications = MutableStateFlow(true) + val allApplications get() = _allApplications.asStateFlow() + + suspend fun getTunnelById(id : String?) : TunnelConfig? { + return try { + if(id != null) { + val config = tunnelRepo.getById(id.toLong()) + if (config != null) { + _tunnel.emit(config) + _tunnelName.emit(config.name) + + } + return config + } + return null + } catch (e : Exception) { + Timber.e(e.message) + null + } + } + + fun onTunnelNameChange(name : String) { + _tunnelName.value = name + } + + fun onIncludeChange(include : Boolean) { + _include.value = include + } + fun onAddCheckedPackage(packageName : String) { + _checkedPackages.value.add(packageName) + } + + fun onAllApplicationsChange(allApplications : Boolean) { + _allApplications.value = allApplications + } + + fun onRemoveCheckedPackage(packageName : String) { + _checkedPackages.value.remove(packageName) + } + + suspend fun emitCurrentPackageConfigurations(id : String?) { + val tunnelConfig = getTunnelById(id) + if(tunnelConfig != null) { + val config = TunnelConfig.configFromQuick(tunnelConfig.wgQuick) + val excludedApps = config.`interface`.excludedApplications + val includedApps = config.`interface`.includedApplications + if(excludedApps.isNullOrEmpty() && includedApps.isNullOrEmpty()) { + _allApplications.emit(true) + return + } + if(excludedApps.isEmpty()) { + _include.emit(true) + _checkedPackages.emit(includedApps.toMutableStateList()) + } else { + _include.emit(false) + _checkedPackages.emit(excludedApps.toMutableStateList()) + } + _allApplications.emit(false) + } + } + + fun emitQueriedPackages(query : String) { + viewModelScope.launch { + _packages.emit(getAllInternetCapablePackages().filter { + it.packageName.contains(query) + }) + } + } + + private fun getAllInternetCapablePackages() : List { + return getPackagesHoldingPermissions(arrayOf(Manifest.permission.INTERNET)) + } + + private fun getPackagesHoldingPermissions(permissions: Array): List { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + packageManager.getPackagesHoldingPermissions(permissions, PackageManager.PackageInfoFlags.of(0L)) + } else { + @Suppress("DEPRECATION") + packageManager.getPackagesHoldingPermissions(permissions, 0) + } + } + + suspend fun onSaveAllChanges() { + var wgQuick = _tunnel.value?.wgQuick + if(wgQuick != null) { + wgQuick = if(_include.value) { + TunnelConfig.setIncludedApplicationsOnQuick(_checkedPackages.value, wgQuick) + } else { + TunnelConfig.setExcludedApplicationsOnQuick(_checkedPackages.value, wgQuick) + } + if(_allApplications.value) { + wgQuick = TunnelConfig.clearAllApplicationsFromConfig(wgQuick) + } + _tunnel.value?.copy( + name = _tunnelName.value, + wgQuick = wgQuick + )?.let { + tunnelRepo.save(it) + val settings = settingsRepo.getAll() + if(settings != null) { + val setting = settings[0] + if(setting.defaultTunnel != null) { + if(it.id == TunnelConfig.from(setting.defaultTunnel!!).id) { + settingsRepo.save(setting.copy( + defaultTunnel = it.toString() + )) + } + } + } + } + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailScreen.kt new file mode 100644 index 0000000000..bdf77a5e56 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailScreen.kt @@ -0,0 +1,139 @@ +package net.nymtech.nymconnect.ui.screens.detail + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ClipboardManager +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.util.NumberUtils +import java.time.Duration +import java.time.Instant + +@Composable +fun DetailScreen( + viewModel: DetailViewModel = hiltViewModel(), + padding: PaddingValues, + id : String? +) { + + val clipboardManager: ClipboardManager = LocalClipboardManager.current + val tunnelStats by viewModel.tunnelStats.collectAsStateWithLifecycle(null) + val tunnel by viewModel.tunnel.collectAsStateWithLifecycle(null) + val tunnelName by viewModel.tunnelName.collectAsStateWithLifecycle() + val lastHandshake by viewModel.lastHandshake.collectAsStateWithLifecycle(emptyMap()) + + + LaunchedEffect(Unit) { + viewModel.getTunnelById(id) + } + + if(tunnel != null) { + val interfaceKey = tunnel?.`interface`?.keyPair?.publicKey?.toBase64().toString() + val addresses = tunnel?.`interface`?.addresses!!.joinToString() + val dnsServers = tunnel?.`interface`?.dnsServers!!.joinToString() + val optionalMtu = tunnel?.`interface`?.mtu + val mtu = if(optionalMtu?.isPresent == true) optionalMtu.get().toString() else "None" + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .padding(padding) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = 7.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Column { + Text(stringResource(R.string.config_interface), fontWeight = FontWeight.Bold, fontSize = 20.sp) + Text(stringResource(R.string.name), fontStyle = FontStyle.Italic) + Text(text = tunnelName, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(tunnelName)) + }) + Text(stringResource(R.string.public_key), fontStyle = FontStyle.Italic) + Text(text = interfaceKey, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(interfaceKey)) + }) + Text(stringResource(R.string.addresses), fontStyle = FontStyle.Italic) + Text(text = addresses, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(addresses)) + }) + Text(stringResource(R.string.dns_servers), fontStyle = FontStyle.Italic) + Text(text = dnsServers, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(dnsServers)) + }) + Text(stringResource(R.string.mtu), fontStyle = FontStyle.Italic) + Text(text = mtu, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(mtu)) + }) + Box(modifier = Modifier.padding(10.dp)) + tunnel?.peers?.forEach{ + val peerKey = it.publicKey.toBase64().toString() + val allowedIps = it.allowedIps.joinToString() + val endpoint = if(it.endpoint.isPresent) it.endpoint.get().toString() else "None" + Text(stringResource(R.string.peer), fontWeight = FontWeight.Bold, fontSize = 20.sp) + Text(stringResource(R.string.public_key), fontStyle = FontStyle.Italic) + Text(text = peerKey, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(peerKey)) + }) + Text(stringResource(id = R.string.allowed_ips), fontStyle = FontStyle.Italic) + Text(text = allowedIps, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(allowedIps)) + }) + Text(stringResource(R.string.endpoint), fontStyle = FontStyle.Italic) + Text(text = endpoint, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(endpoint)) + }) + if (tunnelStats != null) { + val totalRx = tunnelStats?.totalRx() ?: 0 + val totalTx = tunnelStats?.totalTx() ?: 0 + if((totalRx + totalTx != 0L)) { + val rxKB = NumberUtils.bytesToKB(tunnelStats!!.totalRx()) + val txKB = NumberUtils.bytesToKB(tunnelStats!!.totalTx()) + Text(stringResource(R.string.transfer), fontStyle = FontStyle.Italic) + Text("rx: ${NumberUtils.formatDecimalTwoPlaces(rxKB)} KB tx: ${NumberUtils.formatDecimalTwoPlaces(txKB)} KB") + Text(stringResource(R.string.last_handshake), fontStyle = FontStyle.Italic) + val handshakeEpoch = lastHandshake[it.publicKey] + if(handshakeEpoch != null) { + if(handshakeEpoch == 0L) { + Text("Never") + } else { + val time = Instant.ofEpochMilli(handshakeEpoch) + Text("${Duration.between(time, Instant.now()).seconds} seconds ago") + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailViewModel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailViewModel.kt new file mode 100644 index 0000000000..cf83878a0b --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailViewModel.kt @@ -0,0 +1,45 @@ +package net.nymtech.nymconnect.ui.screens.detail + +import androidx.lifecycle.ViewModel +import com.wireguard.config.Config +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.tunnel.VpnService +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class DetailViewModel @Inject constructor(private val tunnelRepo : Repository, private val vpnService : VpnService + +) : ViewModel() { + + private val _tunnel = MutableStateFlow(null) + val tunnel get() = _tunnel.asStateFlow() + + private val _tunnelName = MutableStateFlow("") + val tunnelName = _tunnelName.asStateFlow() + val tunnelStats get() = vpnService.statistics + val lastHandshake get() = vpnService.lastHandshake + + private var config : TunnelConfig? = null + + suspend fun getTunnelById(id : String?) : TunnelConfig? { + return try { + if(id != null) { + config = tunnelRepo.getById(id.toLong()) + if (config != null) { + _tunnel.emit(TunnelConfig.configFromQuick(config!!.wgQuick)) + _tunnelName.emit(config!!.name) + } + return config + } + return null + } catch (e : Exception) { + Timber.e(e.message) + null + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt new file mode 100644 index 0000000000..e2abdd07b7 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt @@ -0,0 +1,336 @@ +package net.nymtech.nymconnect.ui.screens.main + +import android.annotation.SuppressLint +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.foundation.clickable +import androidx.compose.foundation.focusable +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.FileOpen +import androidx.compose.material.icons.rounded.Add +import androidx.compose.material.icons.rounded.Circle +import androidx.compose.material.icons.rounded.Delete +import androidx.compose.material.icons.rounded.Edit +import androidx.compose.material.icons.rounded.Info +import androidx.compose.material3.Divider +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FabPosition +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.SnackbarResult +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.navigation.NavController +import com.wireguard.android.backend.Tunnel +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.WireGuardAutoTunnel +import net.nymtech.nymconnect.service.tunnel.HandshakeStatus +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import net.nymtech.nymconnect.ui.Routes +import net.nymtech.nymconnect.ui.common.RowListItem +import net.nymtech.nymconnect.ui.theme.brickRed +import net.nymtech.nymconnect.ui.theme.mint +import kotlinx.coroutines.launch + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun MainScreen( + viewModel: MainViewModel = hiltViewModel(), padding: PaddingValues, + snackbarHostState: SnackbarHostState, navController: NavController +) { + + val haptic = LocalHapticFeedback.current + val context = LocalContext.current + val isVisible = rememberSaveable { mutableStateOf(true) } + val scope = rememberCoroutineScope() + + val sheetState = rememberModalBottomSheetState() + var showBottomSheet by remember { mutableStateOf(false) } + val tunnels by viewModel.tunnels.collectAsStateWithLifecycle(mutableListOf()) + val handshakeStatus by viewModel.handshakeStatus.collectAsStateWithLifecycle(HandshakeStatus.NOT_STARTED) + val viewState = viewModel.viewState.collectAsStateWithLifecycle() + var selectedTunnel by remember { mutableStateOf(null) } + val state by viewModel.state.collectAsStateWithLifecycle(Tunnel.State.DOWN) + val tunnelName by viewModel.tunnelName.collectAsStateWithLifecycle("") + + // Nested scroll for control FAB + val nestedScrollConnection = remember { + object : NestedScrollConnection { + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + // Hide FAB + if (available.y < -1) { + isVisible.value = false + } + // Show FAB + if (available.y > 1) { + isVisible.value = true + } + return Offset.Zero + } + } + } + + LaunchedEffect(viewState.value) { + if (viewState.value.showSnackbarMessage) { + val result = snackbarHostState.showSnackbar( + message = viewState.value.snackbarMessage, + actionLabel = viewState.value.snackbarActionText, + duration = SnackbarDuration.Long, + ) + when (result) { + SnackbarResult.ActionPerformed -> viewState.value.onSnackbarActionClick + SnackbarResult.Dismissed -> viewState.value.onSnackbarActionClick + } + } + } + + val pickFileLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.GetContent() + ) { file -> + if (file != null) { + viewModel.onTunnelFileSelected(file) + } + } + + Scaffold( + modifier = Modifier.pointerInput(Unit) { + detectTapGestures(onTap = { + selectedTunnel = null + }) + }, + floatingActionButtonPosition = FabPosition.End, + floatingActionButton = { + AnimatedVisibility( + visible = isVisible.value, + enter = slideInVertically(initialOffsetY = { it * 2 }), + exit = slideOutVertically(targetOffsetY = { it * 2 }), + ) { + FloatingActionButton( + modifier = Modifier.padding(bottom = 90.dp), + onClick = { + showBottomSheet = true + }, + containerColor = MaterialTheme.colorScheme.secondary, + shape = RoundedCornerShape(16.dp), + ) { + Icon( + imageVector = Icons.Rounded.Add, + contentDescription = stringResource(id = R.string.add_tunnel), + tint = Color.DarkGray, + ) + } + } + } + ) { + if (tunnels.isEmpty()) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + Text(text = stringResource(R.string.no_tunnels), fontStyle = FontStyle.Italic) + } + } + if (showBottomSheet) { + ModalBottomSheet( + onDismissRequest = { + showBottomSheet = false + }, + sheetState = sheetState + ) { + // Sheet content + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { + showBottomSheet = false + pickFileLauncher.launch("*/*") + } + .padding(10.dp) + ) { + Icon( + Icons.Filled.FileOpen, + contentDescription = stringResource(id = R.string.open_file), + modifier = Modifier.padding(10.dp) + ) + Text( + stringResource(id = R.string.add_from_file), + modifier = Modifier.padding(10.dp) + ) + } + Divider() + } + } + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + + LazyColumn( + modifier = Modifier.fillMaxSize() + .nestedScroll(nestedScrollConnection), + ) { + itemsIndexed(tunnels.toList()) { index, tunnel -> + val focusRequester = FocusRequester(); + RowListItem(leadingIcon = Icons.Rounded.Circle, + leadingIconColor = if (tunnelName == tunnel.name) when (handshakeStatus) { + HandshakeStatus.HEALTHY -> mint + HandshakeStatus.UNHEALTHY -> brickRed + HandshakeStatus.NOT_STARTED -> Color.Gray + HandshakeStatus.NEVER_CONNECTED -> brickRed + } else Color.Gray, + text = tunnel.name, + onHold = { + if (state == Tunnel.State.UP && tunnel.name == tunnelName) { + scope.launch { + viewModel.showSnackBarMessage(context.resources.getString(R.string.turn_off_tunnel)) + } + return@RowListItem + } + haptic.performHapticFeedback(HapticFeedbackType.LongPress) + selectedTunnel = tunnel; + }, + onClick = { + if (!WireGuardAutoTunnel.isRunningOnAndroidTv(context)) { + navController.navigate("${Routes.Detail.name}/${tunnel.id}") + } else { + focusRequester.requestFocus() + } + }, + rowButton = { + if (tunnel.id == selectedTunnel?.id) { + Row { + IconButton(onClick = { + navController.navigate("${Routes.Config.name}/${selectedTunnel?.id}") + }) { + Icon(Icons.Rounded.Edit, stringResource(id = R.string.edit)) + } + IconButton( + modifier = Modifier.focusable(), + onClick = { viewModel.onDelete(tunnel) }) { + Icon( + Icons.Rounded.Delete, + stringResource(id = R.string.delete) + ) + } + } + } else { + if (WireGuardAutoTunnel.isRunningOnAndroidTv(context)) { + Row { + IconButton( + modifier = Modifier.focusRequester(focusRequester), + onClick = { + navController.navigate("${Routes.Detail.name}/${tunnel.id}") + }) { + Icon(Icons.Rounded.Info, "Info") + } + IconButton(onClick = { + if (state == Tunnel.State.UP && tunnel.name == tunnelName) + scope.launch { + viewModel.showSnackBarMessage( + context.resources.getString( + R.string.turn_off_tunnel + ) + ) + } else { + navController.navigate("${Routes.Config.name}/${tunnel.id}") + } + }) { + Icon( + Icons.Rounded.Edit, + stringResource(id = R.string.edit) + ) + } + IconButton(onClick = { + if (state == Tunnel.State.UP && tunnel.name == tunnelName) + scope.launch { + viewModel.showSnackBarMessage( + context.resources.getString( + R.string.turn_off_tunnel + ) + ) + } else { + viewModel.onDelete(tunnel) + } + }) { + Icon( + Icons.Rounded.Delete, + stringResource(id = R.string.delete) + ) + } + Switch( + checked = (state == Tunnel.State.UP && tunnel.name == tunnelName), + onCheckedChange = { checked -> + if (checked) viewModel.onTunnelStart(tunnel) else viewModel.onTunnelStop() + } + ) + } + } else { + Switch( + checked = (state == Tunnel.State.UP && tunnel.name == tunnelName), + onCheckedChange = { checked -> + if (checked) viewModel.onTunnelStart(tunnel) else viewModel.onTunnelStop() + } + ) + } + } + }) + } + } + } + } +} diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt new file mode 100644 index 0000000000..a88b5adcb9 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt @@ -0,0 +1,179 @@ +package net.nymtech.nymconnect.ui.screens.main + +import android.annotation.SuppressLint +import android.app.Application +import android.content.Context +import android.net.Uri +import android.provider.OpenableColumns +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.wireguard.config.BadConfigException +import com.wireguard.config.Config +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.foreground.ServiceState +import net.nymtech.nymconnect.service.foreground.ServiceManager +import net.nymtech.nymconnect.service.foreground.WireGuardConnectivityWatcherService +import net.nymtech.nymconnect.service.shortcut.ShortcutsManager +import net.nymtech.nymconnect.service.tunnel.VpnService +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import net.nymtech.nymconnect.ui.ViewState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + + +@HiltViewModel +class MainViewModel @Inject constructor(private val application : Application, + private val tunnelRepo : Repository, + private val settingsRepo : Repository, + private val vpnService: VpnService, +) : ViewModel() { + + private val _viewState = MutableStateFlow(ViewState()) + val viewState get() = _viewState.asStateFlow() + val tunnels get() = tunnelRepo.itemFlow + val state get() = vpnService.state + + val handshakeStatus get() = vpnService.handshakeStatus + val tunnelName get() = vpnService.tunnelName + private val _settings = MutableStateFlow(Settings()) + val settings get() = _settings.asStateFlow() + + private val defaultConfigName = { + "tunnel${(Math.random() * 100000).toInt()}" + } + + + init { + viewModelScope.launch { + settingsRepo.itemFlow.collect { + val settings = it.first() + validateWatcherServiceState(settings) + _settings.emit(settings) + } + } + } + + private fun validateWatcherServiceState(settings: Settings) { + val watcherState = ServiceManager.getServiceState(application.applicationContext, WireGuardConnectivityWatcherService::class.java) + if(settings.isAutoTunnelEnabled && watcherState == ServiceState.STOPPED && settings.defaultTunnel != null) { + ServiceManager.startWatcherService(application.applicationContext, settings.defaultTunnel!!) + } + } + + + fun onDelete(tunnel : TunnelConfig) { + viewModelScope.launch { + if(tunnelRepo.count() == 1L) { + ServiceManager.stopWatcherService(application.applicationContext) + val settings = settingsRepo.getAll() + if(!settings.isNullOrEmpty()) { + val setting = settings[0] + setting.defaultTunnel = null + setting.isAutoTunnelEnabled = false + setting.isAlwaysOnVpnEnabled = false + settingsRepo.save(setting) + } + } + tunnelRepo.delete(tunnel) + ShortcutsManager.removeTunnelShortcuts(application.applicationContext, tunnel) + } + } + + fun onTunnelStart(tunnelConfig : TunnelConfig) = viewModelScope.launch { + ServiceManager.startVpnService(application.applicationContext, tunnelConfig.toString()) + } + + fun onTunnelStop() { + ServiceManager.stopVpnService(application.applicationContext) + } + + fun onTunnelFileSelected(uri : Uri) { + try { + val fileName = getFileName(application.applicationContext, uri) + val extension = getFileExtensionFromFileName(fileName) + if(extension != ".conf") { + viewModelScope.launch { + showSnackBarMessage(application.resources.getString(R.string.file_extension_message)) + } + return + } + val stream = application.applicationContext.contentResolver.openInputStream(uri) + stream ?: return + val bufferReader = stream.bufferedReader(charset = Charsets.UTF_8) + val config = Config.parse(bufferReader) + val tunnelName = getNameFromFileName(fileName) + saveTunnel(TunnelConfig(name = tunnelName, wgQuick = config.toWgQuickString())) + stream.close() + } catch(_: BadConfigException) { + viewModelScope.launch { + showSnackBarMessage(application.applicationContext.getString(R.string.bad_config)) + } + } + } + + private fun saveTunnel(tunnelConfig : TunnelConfig) { + viewModelScope.launch { + tunnelRepo.save(tunnelConfig) + ShortcutsManager.createTunnelShortcuts(application.applicationContext, tunnelConfig) + } + } + + @SuppressLint("Range") + private fun getFileName(context: Context, uri: Uri): String { + if (uri.scheme == "content") { + val cursor = try { + context.contentResolver.query(uri, null, null, null, null) + } catch (e : Exception) { + Timber.d("Exception getting config name") + null + } + cursor ?: return defaultConfigName() + cursor.use { + if(cursor.moveToFirst()) { + return cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)) + } + } + } + return defaultConfigName() + } + + suspend fun showSnackBarMessage(message : String) { + _viewState.emit(_viewState.value.copy( + showSnackbarMessage = true, + snackbarMessage = message, + snackbarActionText = "Okay", + onSnackbarActionClick = { + viewModelScope.launch { + dismissSnackBar() + } + } + )) + delay(3000) + dismissSnackBar() + } + + private suspend fun dismissSnackBar() { + _viewState.emit(_viewState.value.copy( + showSnackbarMessage = false + )) + } + + private fun getNameFromFileName(fileName : String) : String { + return fileName.substring(0 , fileName.lastIndexOf('.') ) + } + + private fun getFileExtensionFromFileName(fileName : String) : String { + return try { + fileName.substring(fileName.lastIndexOf('.')) + } catch (e : Exception) { + "" + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt new file mode 100644 index 0000000000..4616a8fd9a --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt @@ -0,0 +1,415 @@ +package net.nymtech.nymconnect.ui.screens.settings + +import android.Manifest +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.provider.Settings +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.outlined.Add +import androidx.compose.material.icons.rounded.LocationOff +import androidx.compose.material3.Button +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.SnackbarResult +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.navigation.NavController +import com.google.accompanist.permissions.ExperimentalPermissionsApi +import com.google.accompanist.permissions.isGranted +import com.google.accompanist.permissions.rememberPermissionState +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.WireGuardAutoTunnel +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import net.nymtech.nymconnect.ui.Routes +import net.nymtech.nymconnect.ui.common.ClickableIconButton +import kotlinx.coroutines.launch + +@OptIn(ExperimentalMaterial3Api::class, ExperimentalPermissionsApi::class, + ExperimentalLayoutApi::class +) +@Composable +fun SettingsScreen( + viewModel: SettingsViewModel = hiltViewModel(), + padding: PaddingValues, + navController: NavController, + focusRequester: FocusRequester, + snackbarHostState: SnackbarHostState = remember { SnackbarHostState() } +) { + + val scope = rememberCoroutineScope() + val context = LocalContext.current + val focusManager = LocalFocusManager.current + val interactionSource = remember { MutableInteractionSource() } + + var expanded by remember { mutableStateOf(false) } + val viewState by viewModel.viewState.collectAsStateWithLifecycle() + val settings by viewModel.settings.collectAsStateWithLifecycle() + val trustedSSIDs by viewModel.trustedSSIDs.collectAsStateWithLifecycle() + val tunnels by viewModel.tunnels.collectAsStateWithLifecycle(mutableListOf()) + val backgroundLocationState = + rememberPermissionState(Manifest.permission.ACCESS_BACKGROUND_LOCATION) + val fineLocationState = rememberPermissionState(Manifest.permission.ACCESS_FINE_LOCATION) + var currentText by remember { mutableStateOf("") } + val scrollState = rememberScrollState() + var isLocationServicesEnabled by remember { mutableStateOf(viewModel.checkLocationServicesEnabled())} + + LaunchedEffect(viewState) { + if (viewState.showSnackbarMessage) { + val result = snackbarHostState.showSnackbar( + message = viewState.snackbarMessage, + actionLabel = viewState.snackbarActionText, + duration = SnackbarDuration.Long, + ) + when (result) { + SnackbarResult.ActionPerformed -> viewState.onSnackbarActionClick + SnackbarResult.Dismissed -> viewState.onSnackbarActionClick + } + } + } + + fun saveTrustedSSID() { + if (currentText.isNotEmpty()) { + scope.launch { + viewModel.onSaveTrustedSSID(currentText) + currentText = "" + } + } + } + + fun openSettings() { + scope.launch { + val intentSettings = + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intentSettings.data = + Uri.fromParts("package", context.packageName, null) + context.startActivity(intentSettings) + } + } + + if(!backgroundLocationState.status.isGranted && Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + Column(horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .verticalScroll(scrollState) + .padding(padding)) { + Icon(Icons.Rounded.LocationOff, contentDescription = stringResource(id = R.string.map), modifier = Modifier + .padding(30.dp) + .size(128.dp)) + Text(stringResource(R.string.prominent_background_location_title), textAlign = TextAlign.Center, modifier = Modifier.padding(30.dp), fontSize = 20.sp) + Text(stringResource(R.string.prominent_background_location_message), textAlign = TextAlign.Center, modifier = Modifier.padding(30.dp), fontSize = 15.sp) + Row( + modifier = if(WireGuardAutoTunnel.isRunningOnAndroidTv(context)) Modifier + .fillMaxWidth() + .padding(10.dp) else Modifier + .fillMaxWidth() + .padding(30.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly + ) { + Button(onClick = { + navController.navigate(Routes.Main.name) + }) { + Text(stringResource(id = R.string.no_thanks)) + } + Button(modifier = Modifier.focusRequester(focusRequester), onClick = { + openSettings() + }) { + Text(stringResource(id = R.string.turn_on)) + } + } + } + return + } + + if(!fineLocationState.status.isGranted) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + Text( + stringResource(id = R.string.precise_location_message), + textAlign = TextAlign.Center, + modifier = Modifier.padding(15.dp), + fontStyle = FontStyle.Italic + ) + Button(modifier = Modifier.focusRequester(focusRequester),onClick = { + fineLocationState.launchPermissionRequest() + }) { + Text(stringResource(id = R.string.request)) + } + + } + return + } + + if (tunnels.isEmpty()) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + Text( + stringResource(R.string.one_tunnel_required), + textAlign = TextAlign.Center, + modifier = Modifier.padding(15.dp), + fontStyle = FontStyle.Italic + ) + } + return + } + if(!isLocationServicesEnabled && Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + Text( + stringResource(id = R.string.location_services_not_detected), + textAlign = TextAlign.Center, + modifier = Modifier.padding(15.dp), + fontStyle = FontStyle.Italic + ) + Button(modifier = Modifier.focusRequester(focusRequester), onClick = { + val locationServicesEnabled = viewModel.checkLocationServicesEnabled() + isLocationServicesEnabled = locationServicesEnabled + if(!locationServicesEnabled) { + scope.launch { + viewModel.showSnackBarMessage(context.getString(R.string.detecting_location_services_disabled)) + } + } + }) { + Text(stringResource(id = R.string.check_again)) + } + } + return + } + val screenPadding = if(WireGuardAutoTunnel.isRunningOnAndroidTv(context)) 5.dp else 15.dp + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Top, + modifier = if(WireGuardAutoTunnel.isRunningOnAndroidTv(context)) Modifier + .fillMaxHeight(.85f) + .fillMaxWidth() + .verticalScroll(scrollState) + .clickable(indication = null, interactionSource = interactionSource) { + focusManager.clearFocus() + } + .padding(padding) else Modifier + .fillMaxSize() + .verticalScroll(scrollState) + .clickable(indication = null, interactionSource = interactionSource) { + focusManager.clearFocus() + } + .padding(padding) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(screenPadding), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(R.string.enable_auto_tunnel)) + Switch( + modifier = Modifier.focusRequester(focusRequester), + enabled = !settings.isAlwaysOnVpnEnabled, + checked = settings.isAutoTunnelEnabled, + onCheckedChange = { + scope.launch { + viewModel.toggleAutoTunnel() + } + } + ) + } + Text( + stringResource(id = R.string.select_tunnel), + textAlign = TextAlign.Center, + modifier = Modifier.padding(screenPadding, bottom = 5.dp, top = 5.dp) + ) + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { + if(!(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled)) { + expanded = !expanded }}, + modifier = Modifier.padding(start = 15.dp, top = 5.dp, bottom = 10.dp).clickable { + expanded = !expanded + }, + ) { + TextField( + enabled = !(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled), + value = settings.defaultTunnel?.let { + TunnelConfig.from(it).name } + ?: "", + readOnly = true, + modifier = Modifier.menuAnchor(), + label = { Text(stringResource(R.string.tunnels)) }, + onValueChange = { }, + trailingIcon = { + ExposedDropdownMenuDefaults.TrailingIcon( + expanded = expanded + ) + } + ) + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { + expanded = false + } + ) { + tunnels.forEach() { tunnel -> + DropdownMenuItem( + onClick = { + scope.launch { + viewModel.onDefaultTunnelSelected(tunnel) + } + expanded = false + }, + text = { Text(text = tunnel.name) } + ) + } + } + } + Text( + stringResource(R.string.trusted_ssid), + textAlign = TextAlign.Center, + modifier = Modifier.padding(screenPadding, bottom = 5.dp, top = 5.dp) + ) + FlowRow( + modifier = Modifier.padding(screenPadding), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.SpaceEvenly + ) { + trustedSSIDs.forEach { ssid -> + ClickableIconButton(onIconClick = { + scope.launch { + viewModel.onDeleteTrustedSSID(ssid) + } + }, text = ssid, icon = Icons.Filled.Close, enabled = !(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled)) + } + } + OutlinedTextField( + enabled = !(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled), + value = currentText, + onValueChange = { currentText = it }, + label = { Text(stringResource(R.string.add_trusted_ssid)) }, + modifier = Modifier.padding(start = screenPadding, top = 5.dp), + maxLines = 1, + keyboardOptions = KeyboardOptions( + capitalization = KeyboardCapitalization.None, + imeAction = ImeAction.Done + ), + keyboardActions = KeyboardActions( + onDone = { + saveTrustedSSID() + } + ), + trailingIcon = { + IconButton(onClick = { saveTrustedSSID() }) { + Icon( + imageVector = Icons.Outlined.Add, + contentDescription = if (currentText == "") stringResource(id = R.string.trusted_ssid_empty_description) else stringResource( + id = R.string.trusted_ssid_value_description + ), + tint = if(currentText == "") Color.Transparent else Color.Green + ) + } + }, + ) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(screenPadding), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(R.string.tunnel_mobile_data)) + Switch( + enabled = !(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled), + checked = settings.isTunnelOnMobileDataEnabled, + onCheckedChange = { + scope.launch { + viewModel.onToggleTunnelOnMobileData() + } + } + ) + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(screenPadding), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(R.string.always_on_vpn_support)) + Switch( + enabled = !settings.isAutoTunnelEnabled, + checked = settings.isAlwaysOnVpnEnabled, + onCheckedChange = { + scope.launch { + viewModel.onToggleAlwaysOnVPN() + } + } + ) + } + } +} + + diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt new file mode 100644 index 0000000000..7143c1b4b6 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt @@ -0,0 +1,124 @@ +package net.nymtech.nymconnect.ui.screens.settings + +import android.app.Application +import android.content.Context +import android.location.LocationManager +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.foreground.ServiceManager +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import net.nymtech.nymconnect.ui.ViewState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + + +@HiltViewModel +class SettingsViewModel @Inject constructor(private val application : Application, + private val tunnelRepo : Repository, private val settingsRepo : Repository +) : ViewModel() { + + private val _trustedSSIDs = MutableStateFlow(emptyList()) + val trustedSSIDs = _trustedSSIDs.asStateFlow() + private val _settings = MutableStateFlow(Settings()) + val settings get() = _settings.asStateFlow() + val tunnels get() = tunnelRepo.itemFlow + private val _viewState = MutableStateFlow(ViewState()) + val viewState get() = _viewState.asStateFlow() + + init { + checkLocationServicesEnabled() + viewModelScope.launch { + settingsRepo.itemFlow.collect { + val settings = it.first() + _settings.emit(settings) + _trustedSSIDs.emit(settings.trustedNetworkSSIDs.toList()) + } + } + } + + suspend fun onSaveTrustedSSID(ssid: String) { + val trimmed = ssid.trim() + if (!_settings.value.trustedNetworkSSIDs.contains(trimmed)) { + _settings.value.trustedNetworkSSIDs.add(trimmed) + settingsRepo.save(_settings.value) + } else { + showSnackBarMessage("SSID already exists.") + } + } + + suspend fun onDefaultTunnelSelected(tunnelConfig: TunnelConfig) { + settingsRepo.save(_settings.value.copy( + defaultTunnel = tunnelConfig.toString() + )) + } + + suspend fun onToggleTunnelOnMobileData() { + settingsRepo.save(_settings.value.copy( + isTunnelOnMobileDataEnabled = !_settings.value.isTunnelOnMobileDataEnabled + )) + } + + suspend fun onDeleteTrustedSSID(ssid: String) { + _settings.value.trustedNetworkSSIDs.remove(ssid) + settingsRepo.save(_settings.value) + } + + suspend fun toggleAutoTunnel() { + if(_settings.value.defaultTunnel.isNullOrEmpty() && !_settings.value.isAutoTunnelEnabled) { + showSnackBarMessage(application.getString(R.string.select_tunnel_message)) + return + } + if(_settings.value.isAutoTunnelEnabled) { + ServiceManager.stopWatcherService(application) + } else { + if(_settings.value.defaultTunnel != null) { + val defaultTunnel = _settings.value.defaultTunnel + ServiceManager.startWatcherService(application, defaultTunnel!!) + } + } + settingsRepo.save(_settings.value.copy( + isAutoTunnelEnabled = !_settings.value.isAutoTunnelEnabled + )) + } + + suspend fun showSnackBarMessage(message : String) { + _viewState.emit(_viewState.value.copy( + showSnackbarMessage = true, + snackbarMessage = message, + snackbarActionText = "Okay", + onSnackbarActionClick = { + viewModelScope.launch { + dismissSnackBar() + } + } + )) + } + + private suspend fun dismissSnackBar() { + _viewState.emit(_viewState.value.copy( + showSnackbarMessage = false + )) + } + + suspend fun onToggleAlwaysOnVPN() { + if(_settings.value.defaultTunnel != null) { + _settings.emit( + _settings.value.copy(isAlwaysOnVpnEnabled = !_settings.value.isAlwaysOnVpnEnabled) + ) + settingsRepo.save(_settings.value) + } else { + showSnackBarMessage(application.getString(R.string.select_tunnel_message)) + } + } + fun checkLocationServicesEnabled() : Boolean { + val locationManager = + application.getSystemService(Context.LOCATION_SERVICE) as LocationManager + return locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt new file mode 100644 index 0000000000..31fc9dbf6a --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt @@ -0,0 +1,83 @@ +package net.nymtech.nymconnect.ui.screens.support + +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import androidx.compose.foundation.clickable +import androidx.compose.foundation.focusable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import net.nymtech.nymconnect.R + +@Composable +fun SupportScreen(padding : PaddingValues, focusRequester: FocusRequester) { + + val context = LocalContext.current + + fun openWebPage(url: String) { + val webpage: Uri = Uri.parse(url) + val intent = Intent(Intent.ACTION_VIEW, webpage) + context.startActivity(intent) + } + + Column(horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .focusable() + .padding(padding)) { + Text(stringResource(R.string.support_text), textAlign = TextAlign.Center, modifier = Modifier.padding(30.dp), fontSize = 15.sp) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly + ) { + IconButton(onClick = { + openWebPage(context.resources.getString(R.string.discord_url)) + }) { + Icon(imageVector = ImageVector.vectorResource(R.drawable.discord), "Discord") + } + IconButton(modifier = Modifier.focusRequester(focusRequester),onClick = { + openWebPage(context.resources.getString(R.string.github_url)) + }) { + Icon(imageVector = ImageVector.vectorResource(R.drawable.github), "Github") + } + } + Spacer(modifier = Modifier.weight(1f)) + Text(stringResource(id = R.string.privacy_policy), style = TextStyle(textDecoration = TextDecoration.Underline), + modifier = Modifier.clickable { + openWebPage(context.resources.getString(R.string.privacy_policy_url)) + }) + Text("App version: ${net.nymtech.nymconnect.BuildConfig.VERSION_NAME}", Modifier.padding(25.dp)) + } + } \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt new file mode 100644 index 0000000000..3561a75512 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt @@ -0,0 +1,17 @@ +package net.nymtech.nymconnect.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFF492532) +val virdigris = Color(0xFF5BC0BE) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFFFFFFFF) + +//status colors +val brickRed = Color(0xFFCE4257) +val pinkRed = Color(0xFFEF476F) +val mint = Color(0xFF52B788) diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt new file mode 100644 index 0000000000..647ad9f2ad --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt @@ -0,0 +1,80 @@ +package net.nymtech.nymconnect.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat + +private val DarkColorScheme = darkColorScheme( + //primary = Purple80, + primary = virdigris, + secondary = virdigris, + // secondary = PurpleGrey80, + tertiary = virdigris + //tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 + + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +@Composable +fun WireguardAutoTunnelTheme( + //force dark theme + darkTheme : Boolean = true, + //darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + //turning off dynamic color for now + dynamicColor: Boolean = false, + content: @Composable () -> Unit +) { + + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as Activity).window + WindowCompat.setDecorFitsSystemWindows(window, false) + window.statusBarColor = Color.Transparent.toArgb() + window.navigationBarColor = Color.Transparent.toArgb() + WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars = !darkTheme + WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightNavigationBars = !darkTheme + } + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt new file mode 100644 index 0000000000..6a1c35331c --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt @@ -0,0 +1,22 @@ +package net.nymtech.nymconnect.ui.theme + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.ui.graphics.Color +import com.google.accompanist.systemuicontroller.rememberSystemUiController + +@Composable +fun TransparentSystemBars() { + val systemUiController = rememberSystemUiController() + val useDarkIcons = !isSystemInDarkTheme() + + DisposableEffect(systemUiController, useDarkIcons) { + systemUiController.setSystemBarsColor( + color = Color.Transparent, + darkIcons = useDarkIcons + ) + + onDispose {} + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt new file mode 100644 index 0000000000..6b89a8e327 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package net.nymtech.nymconnect.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/NumberUtils.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/NumberUtils.kt new file mode 100644 index 0000000000..aa240e6eb2 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/NumberUtils.kt @@ -0,0 +1,25 @@ +package net.nymtech.nymconnect.util + +import java.math.BigDecimal +import java.text.DecimalFormat +import java.time.Duration +import java.time.Instant + +object NumberUtils { + + private const val BYTES_IN_KB = 1024L + + fun bytesToKB(bytes : Long) : BigDecimal { + return bytes.toBigDecimal().divide(BYTES_IN_KB.toBigDecimal()) + } + + fun formatDecimalTwoPlaces(bigDecimal: BigDecimal) : String { + val df = DecimalFormat("#.##") + return df.format(bigDecimal) + } + + fun getSecondsBetweenTimestampAndNow(epoch : Long) : Long { + val time = Instant.ofEpochMilli(epoch) + return Duration.between(time, Instant.now()).seconds + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/drawable/discord.xml b/nym-vpn/android/app/src/main/res/drawable/discord.xml new file mode 100644 index 0000000000..df43339353 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/discord.xml @@ -0,0 +1,10 @@ + + + diff --git a/nym-vpn/android/app/src/main/res/drawable/github.xml b/nym-vpn/android/app/src/main/res/drawable/github.xml new file mode 100644 index 0000000000..32f8254ebe --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/github.xml @@ -0,0 +1,12 @@ + + + diff --git a/nym-vpn/android/app/src/main/res/drawable/ic_launcher_background.xml b/nym-vpn/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000000..07d5da9cbf --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nym-vpn/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/nym-vpn/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000000..2b068d1146 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/drawable/shield.xml b/nym-vpn/android/app/src/main/res/drawable/shield.xml new file mode 100644 index 0000000000..e49a1f265d --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/shield.xml @@ -0,0 +1,5 @@ + + + diff --git a/nym-vpn/android/app/src/main/res/drawable/vpn_off.xml b/nym-vpn/android/app/src/main/res/drawable/vpn_off.xml new file mode 100644 index 0000000000..d33949b74b --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/vpn_off.xml @@ -0,0 +1,5 @@ + + + diff --git a/nym-vpn/android/app/src/main/res/drawable/vpn_on.xml b/nym-vpn/android/app/src/main/res/drawable/vpn_on.xml new file mode 100644 index 0000000000..1339fb3b8b --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/vpn_on.xml @@ -0,0 +1,5 @@ + + + diff --git a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml new file mode 100644 index 0000000000..cf3108b364 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000000..036d09bc5f --- /dev/null +++ b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000000..036d09bc5f --- /dev/null +++ b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..52206777aa3245f61ae885e0825057c0550c2f0e GIT binary patch literal 2004 zcmV;_2P^neNk&G@2LJ$9MM6+kP&iD#2LJ#sN5ByfRfmGMZJ3%r>|F>EF#*}5s2`8% z(Y0{0{g0&l%5BfNf`6&WWd2;`|9Mu?$Q~z%SS55=LIW-C5QLl62G(t@ZEF&DcWYB6$Ocw&D5>dLftJdp za+iuQgAJhT*f#-m^Z#EbDUF;9?(XjH?(TZ-?k?-QwJhz-htqO|J!{hpU3vD)1i2tO0WS z_W^{YWTb>NveAU(cM)z?I3;*~qz(;`Uk4ZA;YM__(P>8Jgp*xPrZEHo0Lwrb1ItQazE9(}vrgvpUY|cKYSv z=T|iaByDWN<=G{O{BK}r^2(|%FGHOlkwc@mq}gYqPRheLh-~uHBvh#A#w$14lrkPm z8D_s!??{ZRP}XJg1BjYqIR#g{fSMCI1=k@pr!mUp-U2sUbFRlLrdJf)bZCmN#1_m# zY`oTGbFViLnEE5(ofSu@R`_WVi(YQoTzsHnB_r}zzV=o)nuNT$NS8~PMlQr1u))Su zsyxk&SB$yY$o87@Gx?bGC#&y{v88em;4-m^0=7oi*qw=gldtLCGT~q1P5Adx5=o0~ zFxktV%v|?7-9u)4+I~x(?Ix?!t*0^~au5LN22Kfpf}#!sz0TGwc)c^cW|H5G|DOr| z^T_OvyW-)r9c))fwZ)EiTV@F0#kfMFOydy$4+0KI#+T!xlW5`uD3n>0qU4msjKs{8 zgv`(as6W;5CjNcyK$Lcg3`>+wdiBCH@ESRcoQ=>mch4%Yqg~P=+u6VN_KQfR7;)iGAGl1pt3O# zr;w@x29^>$4i+Ajg|0SU)zUMx7D|W6Sl)bJkxkfmZAOe3QLgqjUzu!#ZUv;6Kn!aM zZX1iB!awbM;#I7?&b_5#m(8nFUsb4P=I2DU8`WO3Jx=-RtKQI29GgYo5FC_xec8(@ zs7T8EFy4rU6V(%cUO8Sd(QO6RCV!g$dfn6kI+W&kkm}LJj#!Unh(v*1rWpV0!f6%(YFW~Me9YEim&!e2RiUTPsFrZrIhtH8{qmt z$No}8v%Y{o2Ljm;mN{AJz=Z$ri9GgFM7CR@`Zix~#ZLP+881aN;|r)}6DR+U7KV>j zI3(2yLc6MJDThA%`s?R39jg(ICt6qJ`lwwtTnm9}i=!B)*0H~5dda>M{J%LKv*(-- zJI~!dCnwjNZU~m0u*krHlmRqo`4XSaEBz#1cQj^bS@H+5!DyE+Cq;I zk^b z7V9d1HyiD%{uYrnb_cfmQE|@vH!GU?@Gq4J9yQtbWf75;*ESK50JysoJU`H-w=UF< z99IAg+blREkC}I~zE-HOvN}nCFKixGdVV-(;j0x5^)WRI1iMLiT(fLCbk$_v>GR=u zzZt*y#{bWF#r#^S^s1EJrYntl`vEIdpO$3#_c0Jl*(CX;rKOz! z)ss7bk8cs5ky)PC-XQ41fHMseIP011am9z^pAS$S@_0yBP4V@_r{u^E{jHMeu|a=- zC_W}9)taq8;no!own8Q1b8>b6JMS5IqVxtNFwI9!l5M_)*BHHa?C(SBoXRP76H?1S z%(0MZNMWi{n*1~srlz)okMsdh00-Pk?)_>Mxaybr0)ln+(KVn-# zo@nuHr~Uu~ctCb)>I-vN*3+EFr6eThOh_}*XrviwBx$4>X*AM|G}`yg_21(az-nLy mIKTlyAOhmfZ|?vb;B$y7K*FoQF<@JrzkPnvRMMS zIKW3lL`O9ACZIa#y-m>)0nt;1V{-qf~j+qR8w+h$Jy-D=y`Pf8)U zyF=uXt-HIsySx8w+e{|Zg--Ng$!2=k6Cg|czj)lR zLg1yc{Q2z=299#v0gzht4I7=p3wuoxc#%@*LuOk3WCK0runKCu20faBaJ!Ol(T*hK zhHQEpl=~mlc@9YBEuTNW5CuvC8UTDIIV3~1eKFhxNnm99`px98Ooac^7$)bV23uop zpaw-;u?PSF@t8wXx5QIG3V|=6js;4xL?3hv_)nvsDpg!@7y=;JO%<_7yaX(fz#mwK zI)|bFszd;m0Gu=0M}j6HpaU1mqSZMZ1%gKxQjm>kI}F$&N#F^PnI+QoTOqPJfKpo^ z7dS4`)>D*uN(|&~u&c_Ff0;MBlI5cm7A;n<(|57?dQJ2wEj*FH!6g>Cu}LPfkO~BL4=zKF%_gEK!u+SZ%OX5npUh< zCCiDG0}WeR)&&`J&}U$o(bWH|<5jTkX)FiloR<$DxuqOaFV(y~nJ<4)rC<1MTKV2@VWw3Lv-&(q+T~8sRXgL$rPUbpU|W zUU9@iFnLv~(Ega~|C+7%!ufuWG8-eX6r>Txya<;*NpRs{$bx0B!(cT92-L)xEZele z&xORrJ`S6vLb%g955kl76bQ~NK4K|zm-zr^eDYZ3bFS-zyy+3rc-j&TI6s~>BRzHMS zCJ^iy*%ZV8T#3Uku)0)S%khSYzX1Sr94d%dzHdw%s~1qFW;Ll?gpVc>zIc)Ww9jSQ z5wv?!5U9%{j$pax12NC>2Z&`iK8TBc9@#*jb~3?+l07X3SgOm^I3&RLIBXk*h)#7P z1xI)Xu}5!VFzrid6s}rj%Ug!8B7YUBb|h{a6F_cvnE=OeG?;0KE8cy8T4H-37TFyP z+B7lL7nHQX!5~CK@L)qCAdTXDEnyZ9SUJ^6 znm-7iwWSecL4+=~a-VW|j_1)AC{eL2Ndzc3DNx1HhVmj!j@j{RmNpI3qy6Rj!5Ztx z$eF`?=Xn5liSUsy&|g(*u#WLZZ{{kb?h{}mkJseJYA9pcD4jPzjW)C8SZO;_mVG&B zg;&P@4`sOWxVe`V#i~|&6w^<9blS=nI}R3SPyhVXsn*?8hzHM)nl6A47vJ=oHEX1< zxzMbe3c&BQ(whT>VJ3K_1)$z};>t{hv5LA6rsYqzQXXWhX3=~q1YqA#Xyw-jA;bWW zazG<_DDiXQ7f{(`033!oNEif z+q7B>jWF;5VB9R;1S;Z~`~O<}{n&n8TEm$^7^6;#1sX$tOi6!2r5M<2kB`mLQg7R) zZ4fodiYB0e-4u^1Z?jDY1~xYOeKTIFVqJp^OP4O$#|xT@SolOmL`qQy3)ikee4|Wt zT&=YtO@pbHoIG+?zi@(&fx1t;s=U=vY^jFQiQ5kFQ{XGZ0ZN+2Qw_wbh=E_G9=^GN zFHu>ZA^-rcT>klxq}5mxqt$Wo>|aqIx&sN|(CqBM68M$NyFwl8qV)8ozO`7imz0!_ zL#_RAX*JS{caAz^t?fu_Io?7di6}kjo4LAC9f_FXCV)WJXW+^M$jN*thz3f;yDH)k zp%7qcLYim@9&AVy@M=m5qkrUbQ>E%>KWX~#okT(P5D%{bJ{UA5p(qV$!XTQ8;R_-7 zkpbG-#7Cltw?U-oF3K3WsvoyZ&1$8GJcjb{YVkAJ!8p7zD*8)>!%M>H9zY5hMXQ%> z0E$MCcshLv^X)N&S>h2E0N^m*mrw*9OME5!ON9$H#UpJ1K!h#67vbcz{K+Q%zQXjA zrw@uQ3)(o|2LSwVR3XdW4Z-dU#p4OkVdzk{q! zkbLyzM)yGuEJ3_JeH}_*OK@F_^5p<<_N3<~Otb{}QAk_0*vzsZ?+ z!UoKyyC`Y=S4MtuQha}TJm!)nm1hMJz@0PV|3v#A<1xP^+weO0YCZk$089&G~JYgklo@g?P+P zf)F=iFo5i(qZ0*^1Rj@3I357IYqGqzeRo0fo2mNYlaNd)^!xHT_7Dl1xKzUO=yiEq z)3FBxN(X&IETQ?{-*)G9?CY4#Xr_X%{fZC__8jjX%7ySux)ySux)&vAD@ zV@Hbn&+q^LPakNu@m4?sHX%h2QUoQCS~MZq4~GWqWY7fHwU*HXF=Td#++8BgDPfUkX_~dnZI)F4z(ZQP5IIpC}JRBog8I7x41u`=b2k&2Wm*XQB3Fpa@=LB&BNAoxP**k$=hZr*5UA!;0p!<62w@(r z>%z)t9!~d(d~YF~6XwD6z_R1IP$9YdN=^vy|0TIf)TdB65)g3}j?)|_^KiL2P5v@p z+LLuI)2-DAuaU2a1a>&R99bFXh0cV-L}TB_u(mARvv;U6(^S49@=L(LL8rpx{gY1! z!D(;O%a~Rx5!4P|*Wko1Mb;+hPvk3Hh_RcSAS!zvp&HS=0?Ymsg8YPszltyHd&Gxh?fuSow$W71elw?BOi2ae2rr1yMf8&#}t)0h>K+;3+Vx zu1d3=>|&!mCBjQWzhp?1=ft_&bjMq9wgrtkhIk0T@Sy1BkP-ku;Sk!RwM#C|SJ596 z?kyp{66E&_{QCv{`9gmr@=Fq3?Vsy^*x|3Y$tRv48B-NKIYK6_59}IW3pRh)0D#Im zQK!0^c%@gXd6h0@y}^n*MJXkM6_rh*PGfaxueROQrl;C>RnL|(t5V`JYt|-DJ1p}{ zAgYncIqgY(=Hap<>zlmprvcjo0FG5^L8MD~OTNuwf$ z1@!ZFQYq)ZZZf(#dKW1l{T;0{C~8!)HNW=ZBW&<~he?(Vvh|);65l*xMtRxVp9gII zu!ASZ!NG$cAf|LvaOXfR5`ZtR2!W*5jpB-F39-S8eq#b(s zZNBtSKo(a0K47!Q4Wyik$?IN1H_L|IB#XqayUf^j=2cFf(1v|61}hkt{}RBRpmZYu zW{P%(g!MiGi~J9er7)J^yrx11(XGiRW!>MM)lN2If&?Q$I6*oq3>P765S_Ktl6{>z zD)Yf4yiT^g?cQ1nzy)Af6d0u(1(-=V=nz`=)uF^Ihq$^=LI#z!tO?NXV=Rm`XU95~@u#`9O$*L>bAp7M|vFLGmW9 zg$BYHqz<=22o2}er+Q03no_EX8KHOv1- zW9Ri%h_C6A>>Y;?l5So$@4e_uUf8+x;?Rtnw@I zl7no0-FkkMM2+YnQ;sD04QPyORh|=^%083X7ms05mre$yO4s>g+kY7o9xl#uJs@&TX=#+wC9nGigpX?Mc4Oa5$L`H|9fV+}l0G)dvt`^z(QyS@xXBg_WC@vx5vOh4Is+ zU>?k8DYV#1bMr}myp$^kSyT!L5xOP+V#&3$lndK@={T9{U8JFQjch}d#(0Q|wIXLm zJ#m&0M+0kQn*EjWpZP+3rN2z1yL2S}X)M_uQ`tWgjkm2;Y;^2&>0As78NH0Pk458-41pEt+teUyo%Y7e) zj9Ft11Z3}|H=#Z|U4XTwIWW!cP_D#0-_F1ppKHmlTX1TI&?DUYM>&c7i&C>~sEp`^ z+uDZ`Jz9#;gq*&4R;uPY88?v889e|~RfY38IHNz*#(+hEu_00X~lM;de3K6D$?vai)( z=S~KMoJQnKAU3*P@wIeL0ZgbgI~pGKD5Iv2ygDx)n3+&M5!pukI~dl5&B@Oj@~mi_*Dv zz_>IHthCUEZN89iYZJ>XG*R3+t*x_#`1<+|>|o$7094bAp}cD`mX~HaRzj2s{BVq> zjfSXBwtD;zABIp|#pHEW(aZC~3+;`o5TVD81SRC|5Mf6#@hspwEaU2i8CP?%u?@d9RxB`CYG+ zquOpLTmy`+8%8^U7Z*UhmENp=aWat5WZ#?jSe3~Z-1J8y&u@gWytXR;zt2H?CBX-f zNvb3>5l17EIF|~bbDxN^6|O@Cp8l#rbZVUt0>}eQGu*0Dtr3&S8-X3o=nURfbMrYYD70Svjk9UgL|4QW`andy5r59TPM0b&DAz| zY*(78(WOFg5eCQswBtr%hKCnN^hEt!+tvHd4W6Lr;?rU(x!QAm-plOL`F9bZ*QsKX z%M?>r`%fmS*8~4ti~OKoCz{L??%S`^i2bGbw>z)&t24D!tTw|jK5H}FG=yRnh$2}% zimJv!$#CPWdjZfnJkJ)CQD`jhO?iG}-;dtf z^0;?T8TqBwb40}}@N`=5@qgbx8=!Gf0}LBrI?@KWR(Q_+f208>hhKEj?Zg>an7&^#H7odksD^s;#igNw!_LgO+Bm(U0q2Sb(#VA!^8 z*f4?E$#%~knA-pV$R@UJ8&{-j-}48?Ro3WEfZY85*Ev}PcXxNEba!`mcXxL=iTuyq zWx3ezpGl~$TG)Vx{surdVGKGJ zaCgd7{}#Da5N+EoB-Q_~m6U?Y%S)+yY}>YN+eTFx3|K^^|1UQEp8#x10wzDA9`g~9 zBS7~Y4hS-PJodWEpI?AyI2cNFz;-WtQNR2DfoF-1WdA|3P6;qAf>A_|Ci|56s@KMH znqh)~6VI5tRQ6^S@m?A4ePSy-r_Ed@a}8u->m2(sO1?Vh|1%idMy14?r8VulFj|=Evn!{(U1B2h;Ur-y28J91 zV9Jmfm3px?Di_AcFfo?07&%IeLjxz`0-k2L6dRp@#K9stBNFI+<|+V;m>fpM-)%@y znCSiLJr=R3{VtQ30l(;q_5mJ2>Gavd2_uv1?^EaY=yL5VpSuICi-i;6D6u-LsA>d- zi#33&ZlSLy3J}qxemNB!#~2_8f+Zr6*_QF66G0S3;<6-Efe%x*{D)7?N1~CPlG~lf zS?k8*@r-SnY?+x+-OB?O3sfGVfCZ6NH-Umn+qIr(X1}0vuuA|mIx?}#k-em$&>$9p zlwnkCDDq(niW^(-%S2zHv~dIgvKr<7GY=_kw-lYm;>-@21zNog+HYL;*W zFRS00_@b73XN~Gr7+#nJA`d|AV3Wv!aKI7LZEa02v*m&F<3Kn>>#}#LAc76C8YYe? zYw-b4w%kK!#*2&vG8(VA`nOdP7q6(@%}BqzlE#_(vcP$)C<|NxvuYn=YCfGK7Y*3u0b0!;1?on e(REB;y+!YEab!Dz5j4T6Z;y`LSMs6iS8Pg*JY-e? literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..106e0e13cc5996f9e412a6277c365a55550b330d GIT binary patch literal 1926 zcmV;12YL8XNk&F~2LJ$9MM6+kP&iC+2LJ#sYrq;1HPN;9|Mca|eZ;nt+O}=mw(T6- z=FBnvzwa-;fn1OFckexG?S0zhH|S3HX`|8=FJii^wPUu^#kmICcDk%oPAYY?(wViZ zL6vIyu(QqDMrYeem7H$6X_MBr*`_pZVpgssg>2il)3!=}vVUWCm?K-Z&OTC@p}ow^ z%*;$r%pkdqBuSFII;#X9Ay+8~ZQHi7c`|3)wr$(C-A#a+ ze1MX4A@*7zUGomf$xZN?0Ku1WqTgBa3c<-na3h`RWi}EF1bZfQe}&}@0;x&x3?FuH zRuK&dcIEVwY&&Bm|4R^WyO>3SO$nWR1j`8i11^-iQve8_3r@$0yq_SOA#w(icH{Ym zrj=^z6Racn0{}S+Pp_aQxF%R%(My6EnWVHZDQ77nw*Z0tKx@r~mq$|f+El2_>TBr8_=TmTU5DT$@t!9*@I9f239cRr0P|Uj*lP~HL1jq52lUn;!{)msrILQ54~sK6Y9(CT?Gyu9*oaITovtP1i&IVYxTxX8sDO6H%$?3W4z&emFRS$Ce^^WzM7^MlVuWk|8TCCQ{Oi z8F6jm>%`U=Az3|-UmU>&OA$OmOotw)BfMM@<%%p5S*>2WV+5?2Do2c9)|mZa4wdqO zOo^`#fcQp5l#3(SVW~Bcrt$2oG8>%`S7RW#JSEY!imKM&Sfl8rm(s7{4#$wkB4$>M zhg-P{AYGPU0D!nUk(J^ImRL$+4}yO+BL;}6Rdf}d!H-{R`tztN`*5nxK03Sok*fjl zj*9?F`sWJ3u6uF><18h(D~rl7N22P?!>Rt?qqd(n$7%b~k)zl!2MpZAg$1MvUIMV^ zuAEfc+)@NHb^L<*-#}`gT7TV~)}9_|y%NlzCoa`w9!~emi@RIHRA_tkN;UvRLB_}vw4`vmRb9-hK@!R#)>Eh#gUu7L=5A zbQaZnxw`)kCwx&FwEFCD`n+&q5}SmT3cxQ(nw*rZgu;rT?!ukcQUnjpC5+2?B}c>b zcJbo0|KNiuvmFeQ+C~;5SjG9}%0Se-oNE6+zz%%!;;`g_j58x2*syTZ$7f zQrTiff_vr+2Coa)ZR92?5{BUY1mYWK4@#=-%@vUhC)QeXR|rz z?=6O4va-o(|6^i#bvAi-eyzc?LtY~_RIl(0RSGa^T(sM zUyp^W7>HaH^ob2uw)qpm2~B2#k6++tiKuYPW=W%pomSMm21z4i8IkjXKEa(dk#PG^ z!lWF*UjSJt!!(x833owzi6CH5a2hH*6)+1xil&3*>kgewm@yp$FmQ~r)y!d{4+HQG z_*s|?rrpJBq~_Yor$i64SCTS|rMzSO1{uC{JL%UJA%n|1^f{4yFJo@6jJwyg=|#PzotK9*6$q*a`eBn=o!R z&~7VfYAbu*o7ih^Yvvm_yEFvuKI*1{jatJELsbvSmkW(c$cMFt83me`ViC z|D%aDD-tV3u=2_)CrAcvuW#@rVS6b%U+G!s=Mo-nf#9pqX{zk~{HyeG6rOJVe5SH{ z(MyD+-KevSo0a{7lTF!wMS_{@XilTll$ebK7s@0cPn4t$!583d7pIQOD_uxYNqbh( MZk0*0tH~@60R0}G`2YX_ literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..c388f6dae5a66dd7133c1c43af5f493e7a735579 GIT binary patch literal 2242 zcmV;z2tD^wNk&Gx2mkZJ3xp?HvjcF#*l+iB`GU z{x_2H$9uQCvpXZ<2?=R}R_MQiyBld|JNP%iLwc7}1QAvIo{e$wnUoIh3Lv}`8`DBT14|`|@XYBo4*t zBX%{Y~f&bDoOkFCv|_2QVBr3|--%yKfVfCjj(4{L%BsNgh! zM-=m>hnx-^I*lZ-{|ApikZt1+@>?!d{mcB*U;r#xt}Gh9FJnHm*|rc)B}|BR(bbvt&dEKg+-jz{};aX!q7 zXx~<8{RxPd5o#!c-b1G$N%(rKmasjSOpq*PtJ&|VvhT<7It$`h8hK9F^zgnz6zT6w zPjk1bt;j2b2Md&ml}ssEIJ`5X(X6DuS#ds&;Q0SL1rJy3j}4-Jg`Byf7CMTA+KxU5 z3Sv}cbQzR-ebQz`di9Rcm7xg(01O0-3IJfk=*fP5Hhe5}7e4@O2pO*pbqH!RptX3GgOz|9K&{7Q+)ytVt!8v5;bOtb z#^68zfW)LqmWD|H@K(yqV5X4CfRRA17689QrM@$u$txVCv2AI*4GBQ?=LI1ahF>xj zp&SBZ000-N%4<*b?-T9k6h3$YVvt<*l1vmn3J@yS3V>U_622Ocz~5etTTb^>7)$dK za>{Nk0FWzqs6+780ayU-MR##=W6MIhRY2>~#v zuUxLQvtVz?r?~Iu0N+gFsUx*@SZx6BlRa7YegVI01o#Wg4Wv+uD89D{Kn=bba_#Iy z?SvKO$GkHGz-NK|HqUGUns9w zB@WpU_sz)Oc61DCj(tQeCIvwV3KRHcq6i(HACZ2KSjM(wp5n~G~w>TnFW9bb7B|sc}O5J`C|wee+{alSf8eh0?>2x;=kMdgCoJC*+>wr`i90r z079S#KpU=jZ->P4IYz+Rit~>0VGP1lUwPJIo=hpQq3S#+O=hI}W2S$m2v zKIPY!bFl!xBx;K|KbbUhTIQP1;bd6_$9d9tu|Ci6+JK2;CJR?T^F%sw!!dy(xQ+x0xlR`sgv5Bk^Ec}qq=68wHoPpjghIlm)g+R@=N5s^ zj%~wJfi61ZFD&>hFarP~xLRNd)CevvAbpwn4;0D#H))1t4a*$!7)V8Gp?QDj{DgiT znPcE^7NN9CWx~OQk^+z^HID@h2}H<^ZYZk5mu@r^p@+s22p-E@H6D^at<$#@9BRAN z7MvWYNbo{9h&36nALvTwteS5&{EiWX{yNoVQ{rb^91J*<@OJQ9%1_r#(c)duM zpFcV$NR+48mM5EFQD3?wTgnG>D33XidBGqktqQa-0EK}ClSHnwWw*8_@@tZbAmGUl z%N#ZYhG#XUrV5oL&o;O@1gYtub8ck5S|pCDNwcQytJQtd2%@|hPjBcKYyNlOn5K>11Zgg(2u9@w>uHn;ifq#+@)JfE(1i>HKQptvuc&2?3Aj}g zO-#X@rZ7oW`!O`t#2|e?(ZsFV)gI+LPQEw-lVF~+>I+Mo0=Q9AxB(!&p0yeX76+~4 zNIWhR1SG2|v)nt}63t`Us`{zbHTEsJO=jB7sjZ9SgsVRrR4zhyKz9x(M?2 z%+|9nKdjkJFdMw|xWqq~TLju*U(X2GjE2XkQ_t1Q?)CHyZn|Y-E)mz53mp04Ze1df Q3Dna|FWs`0M)6J<0KA+ky8r+H literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner.png b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd39f501dd7a23fb706d9c597bdec9b3c511e5e GIT binary patch literal 3578 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 BaRvYY literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..634417a64034f28adeff6c7c3c5b29d0a2fb2908 GIT binary patch literal 3770 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 O>pytM>i)0$zdmieM{+&@ literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..c89a4abd0e7daace668cc1a0b61de43fff99bf6e GIT binary patch literal 5030 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 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..bf191eb8171c41c8f46e66be48b647099254f843 GIT binary patch literal 4246 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 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..0a5390f963768a0a39cfa58f6d30e1d0d199509e GIT binary patch literal 7718 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 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..b8e72301e0f7b7f4efaf60a6eb7fee52662a62c9 GIT binary patch literal 5854 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 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..dae95ed873f77c0e88a56b5880539a0d0741908e GIT binary patch literal 8314 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 E01HmZuK)l5 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..e16ef0b03fa9704ca00bb07a75ff2866d3cbd07b GIT binary patch literal 10402 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 M72vGu^g0t40MXOiGynhq literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/values/colors.xml b/nym-vpn/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000000..d035176a0b --- /dev/null +++ b/nym-vpn/android/app/src/main/res/values/colors.xml @@ -0,0 +1,11 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF1c1b20 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/values/ic_banner_background.xml b/nym-vpn/android/app/src/main/res/values/ic_banner_background.xml new file mode 100644 index 0000000000..5274b8a4f3 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/values/ic_banner_background.xml @@ -0,0 +1,4 @@ + + + #121212 + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml b/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000000..9c1cd0cc32 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #1C1B20 + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/values/strings.xml b/nym-vpn/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000000..2c1d791d4d --- /dev/null +++ b/nym-vpn/android/app/src/main/res/values/strings.xml @@ -0,0 +1,90 @@ + + NymConnect + tunnelConfig + VPN Channel + VPN Notification Channel + Watcher Channel + Watcher Notification Channel + FOREGROUND_FILE + https://github.com/nymtech/nym + https://github.com/nymtech/nym + File is not a .conf file + Turn off tunnel before editing + No tunnels added yet! + Tunnel name already exists + https://discord.com/invite/nym + Watcher Service + Monitoring network state changes + VPN Connected + Connected to tunnel - + VPN permission is required for the app to work properly. If this permission is not launching, please disable \"Always-on VPN\" in your phone settings for the official WireGuard mobile app and try again. + Notifications permission is required for the app to work properly. + Open Settings + Add Trusted SSID + Trusted SSID + Tunnels + Select Tunnel + Enable auto tunneling + Tunnel on mobile data + \"Allow all the time\" location permission is required for retrieving Wi-Fi SSID in the background. Permission is needed for this feature. + Location permission is required for this feature to work properly. + At least one tunnel required to use this feature + "Retry" + View Privacy Policy + Okay + This feature requires background location permission to enable Wi-Fi SSID monitoring even while the application is closed. For more details, please see the Privacy Policy linked on the Support screen. + Background Location Disclosure + TODO + Enter SSID + Submit SSID + [Interface] + Add tunnel from files + File Open + Tunnel Edit + Tunnel Name + Edit + Delete + Add Tunnel + Exclude + Include + Tunnel all applications + Configuration changes saved. + Save changes + Icon + No thanks + Turn on + Map + Bad config. Please try again. + Interface + Public key + Waiting for the Barcode UI module to be downloaded. + Barcode module downloading. Try again. + Addresses + DNS servers + MTU + Peer + Allowed IPs + Endpoint + Transfer + Last handshake + Name + Restart Tunnel + VPN Connection Failed + Failed connection to - + Attempting to connect to server after 30 seconds of no response. + Attempting to reconnect to server after more than one minute of no response. + Enable Always-On VPN support + Please select a tunnel first + Unable to detect Location Services which are required for this feature. Please enable Location Services. + Check again + Detecting Location Services disabled + This feature requires precise location to access Wi-Fi SSID name. Please enable precise location here or in the app settings. + Request + Toggle VPN + No tunnels available + Search packages + Clear Icon + Search Icon + Attempting connection.. + VPN Starting + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/values/themes.xml b/nym-vpn/android/app/src/main/res/values/themes.xml new file mode 100644 index 0000000000..9414a536e4 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/values/themes.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/xml/backup_rules.xml b/nym-vpn/android/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000000..fa0f996d2c --- /dev/null +++ b/nym-vpn/android/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/xml/data_extraction_rules.xml b/nym-vpn/android/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000000..9ee9997b0b --- /dev/null +++ b/nym-vpn/android/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt b/nym-vpn/android/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt new file mode 100644 index 0000000000..c3453e018c --- /dev/null +++ b/nym-vpn/android/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package net.nymtech.nymconnect + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/nym-vpn/android/build.gradle.kts b/nym-vpn/android/build.gradle.kts new file mode 100644 index 0000000000..09b1978ecb --- /dev/null +++ b/nym-vpn/android/build.gradle.kts @@ -0,0 +1,19 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + val objectBoxVersion by extra("3.5.1") + val hiltVersion by extra("2.47") + val accompanistVersion by extra("0.31.2-alpha") + + dependencies { + classpath("io.objectbox:objectbox-gradle-plugin:$objectBoxVersion") + classpath("com.google.gms:google-services:4.3.15") + } +} + +plugins { + id("com.android.application") version "8.2.0-beta01" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false + id("com.google.dagger.hilt.android") version "2.44" apply false + kotlin("plugin.serialization") version "1.8.22" apply false +} diff --git a/nym-vpn/android/gradle.properties b/nym-vpn/android/gradle.properties new file mode 100644 index 0000000000..1023be831f --- /dev/null +++ b/nym-vpn/android/gradle.properties @@ -0,0 +1,25 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true +#enable buildconfig values +android.defaults.buildfeatures.buildconfig=true \ No newline at end of file diff --git a/nym-vpn/android/gradle/wrapper/gradle-wrapper.jar b/nym-vpn/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

    K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/nym-vpn/android/gradle/wrapper/gradle-wrapper.properties b/nym-vpn/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..96f2e7a959 --- /dev/null +++ b/nym-vpn/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Apr 24 22:46:45 EDT 2023 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/nym-vpn/android/gradlew b/nym-vpn/android/gradlew new file mode 100755 index 0000000000..4f906e0c81 --- /dev/null +++ b/nym-vpn/android/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/nym-vpn/android/gradlew.bat b/nym-vpn/android/gradlew.bat new file mode 100644 index 0000000000..107acd32c4 --- /dev/null +++ b/nym-vpn/android/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/nym-vpn/android/settings.gradle.kts b/nym-vpn/android/settings.gradle.kts new file mode 100644 index 0000000000..aaebe93cd6 --- /dev/null +++ b/nym-vpn/android/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "NymConnect" +include(":app") + \ No newline at end of file From 07eddc818714b47f59311baff3a84307f1475524 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 10:34:59 +0200 Subject: [PATCH 22/47] added link to faq to all intros --- .../dev-portal/src/infrastructure/nym.md | 35 ++++++++++--------- documentation/dev-portal/src/introduction.md | 2 +- documentation/docs/src/introduction.md | 4 +-- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/documentation/dev-portal/src/infrastructure/nym.md b/documentation/dev-portal/src/infrastructure/nym.md index 3d32e2a43f..53bc4b377f 100644 --- a/documentation/dev-portal/src/infrastructure/nym.md +++ b/documentation/dev-portal/src/infrastructure/nym.md @@ -1,30 +1,33 @@ # What is Nym? - Nym is a privacy platform that secures user data and protects against surveillance. It leverages the [mixnet](./node-types.md), a type of overlay network that makes both content and metadata of transactions private through network-level obfuscation and incentivisation, and [Coconut](https://nymtech.net/docs/coconut.html), a privacy technology that creates an application-level private access control layer. Nym also utilises [Nyx](https://blog.nymtech.net/nym-now-supports-smart-contracts-2186da46bc7f), our Cosmos SDK blockchain, to allow for us to use payment tokens in the form of `NYM`, as well as smart contracts, in order to create a robust, decentralised, and secure environment for the mixnet. In a nutshell, Nym is a solution that provides strong privacy protection for users in the digital world. +Nym is a privacy platform that secures user data and protects against surveillance. It leverages the [mixnet](./node-types.md), a type of overlay network that makes both content and metadata of transactions private through network-level obfuscation and incentivisation, and [Coconut](https://nymtech.net/docs/coconut.html), a privacy technology that creates an application-level private access control layer. Nym also utilises [Nyx](https://blog.nymtech.net/nym-now-supports-smart-contracts-2186da46bc7f), our Cosmos SDK blockchain, to allow for us to use payment tokens in the form of `NYM`, as well as smart contracts, in order to create a robust, decentralised, and secure environment for the mixnet. In a nutshell, Nym is a solution that provides strong privacy protection for users in the digital world. - ### An overlay network for network-level traffic privacy - Our mixnet design is based on the [Loopix Anonymity System](https://arxiv.org/abs/1703.00536), somewhat modified to provide better quality of service guarantees. +> All the technical nuances about Nym platform can come out quite complex at first. Look for any questions in the [FAQ section](../faq/general-faq.md), take part in our [DevRel AMAs](../community-resources/ama.md) or seek support in [Nym's community](https://nymtech.net/community) - In this brief video, our Head of Research and creator of the Loopix mixnet paper, Ania Piotrowska, delves into the design of the Loopix mixnet in depth at USENix 2017. +### An overlay network for network-level traffic privacy +Our mixnet design is based on the [Loopix Anonymity System](https://arxiv.org/abs/1703.00536), somewhat modified to provide better quality of service guarantees. - +In this brief video, our Head of Research and creator of the Loopix mixnet paper, Ania Piotrowska, delves into the design of the Loopix mixnet in depth at USENix 2017. - The Nym mixnet effectively addresses privacy concerns by utilizing network nodes to mix messages, making them unidentifiable to adversaries. Each packet is layer encrypted, and binary-padded so that it's indistinguishable from all other packets. Incoming packets are "mixed" with all other messages inside the node. That is, the node strips one layer of packet encryption, and adds a small random transmission delay, so that messages are not emitted in the same order as which they arrived. - Next, the message is sent to another mix node, decrypted and mixed again, then to a third mixnode for further mixing. Finally, the message is delivered to its destination gateway. + - As long as there's enough traffic flowing through the nodes, even an adversary who can monitor the entire network cannot trace the packet flow through the system. +The Nym mixnet effectively addresses privacy concerns by utilizing network nodes to mix messages, making them unidentifiable to adversaries. Each packet is layer encrypted, and binary-padded so that it's indistinguishable from all other packets. Incoming packets are "mixed" with all other messages inside the node. That is, the node strips one layer of packet encryption, and adds a small random transmission delay, so that messages are not emitted in the same order as which they arrived. - Privacy Enhanced Applications (PEApps) that need to defend against network-level monitoring can utilize the Nym mixnet to protect against network-level surveillance. +Next, the message is sent to another mix node, decrypted and mixed again, then to a third mixnode for further mixing. Finally, the message is delivered to its destination gateway. - ### Revolutionising Privacy: An Incentivized Mixnet, the First of its Kind - Nym is the first mixnet to incentivise its node operators via a cryptocurrency: the `NYM` token. The tokenomic design of Nym ensures that nodes are motivated to provide top-notch performance and robust security, as they are financially rewarded for doing so. The video below contains an explanation of Nym's tokenomic design from Nym's Chief Scientist Claudia Diaz: +As long as there's enough traffic flowing through the nodes, even an adversary who can monitor the entire network cannot trace the packet flow through the system. - +Privacy Enhanced Applications (PEApps) that need to defend against network-level monitoring can utilize the Nym mixnet to protect against network-level surveillance. - ### ELI5 Understanding of the Implications of Nym - Nym is a type of technology that is designed to keep your online activities private from surveillance networks which track users of many online services. As well as protecting the contents of your messages - the data - Nym's design means that metadata - data about the data - is also kept private. This means that the location from which you sent your message, the time you did so, and a lot of information about your network connection is kept private: this is information that can be used to deanonymise users of other privacy systems, even if they employ encrypted messaging! +### Revolutionising Privacy: An Incentivized Mixnet, the First of its Kind +Nym is the first mixnet to incentivise its node operators via a cryptocurrency: the `NYM` token. The tokenomic design of Nym ensures that nodes are motivated to provide top-notch performance and robust security, as they are financially rewarded for doing so. The video below contains an explanation of Nym's tokenomic design from Nym's Chief Scientist Claudia Diaz: - Nym works by "mixing" your data with other users' data, making it much more difficult for anyone to single out and track just your information. + - This system is unique because it provides an incentive for people to participate and help improve the network, making it stronger and more secure for everyone. By breaking down Nym and understanding its implications, you can see why it's an important tool for anyone who values their privacy online. \ No newline at end of file +### ELI5 Understanding of the Implications of Nym +Nym is a type of technology that is designed to keep your online activities private from surveillance networks which track users of many online services. As well as protecting the contents of your messages - the data - Nym's design means that metadata - data about the data - is also kept private. This means that the location from which you sent your message, the time you did so, and a lot of information about your network connection is kept private: this is information that can be used to deanonymise users of other privacy systems, even if they employ encrypted messaging! + +Nym works by "mixing" your data with other users' data, making it much more difficult for anyone to single out and track just your information. + +This system is unique because it provides an incentive for people to participate and help improve the network, making it stronger and more secure for everyone. By breaking down Nym and understanding its implications, you can see why it's an important tool for anyone who values their privacy online. diff --git a/documentation/dev-portal/src/introduction.md b/documentation/dev-portal/src/introduction.md index 7335fab32b..c28c708921 100644 --- a/documentation/dev-portal/src/introduction.md +++ b/documentation/dev-portal/src/introduction.md @@ -2,4 +2,4 @@ Welcome to the Nym Developer Portal, containing quickstart resources, user manuals, integration information, and tutorials outlining to start building privacy enhanced apps. -For more in-depth information about nodes, network traffic flows, etc check out the [docs](https://nymtech.net/docs). +For more in-depth information about nodes, network traffic flows, clients, coconut etc check out the [docs](https://nymtech.net/docs). If you are looking for information and setup guides for the various pieces of Nym mixnet infrastructure (mix nodes, gateways and network requesters) and Nyx blockchain validators see the **new [Operators Guides](https://nymtech.net/operators)** book. diff --git a/documentation/docs/src/introduction.md b/documentation/docs/src/introduction.md index 9964ec5b75..ac5d425a02 100644 --- a/documentation/docs/src/introduction.md +++ b/documentation/docs/src/introduction.md @@ -4,7 +4,7 @@ This is Nym's technical documentation, containing information and setup guides a If you are looking for information and setup guides for the various pieces of Nym mixnet infrastructure (mix nodes, gateways and network requesters) and Nyx blockchain validators see the **new [Operators Guides](https://nymtech.net/operators)** book. -If you are new to Nym and want to learn about the mixnet, explore kickstart options and demos, learn how to integrate with the network, and follow developer tutorials check out the [Developer Portal](https://nymtech.net/developers/). +If you are new to Nym and want to learn about the mixnet, explore kickstart options and demos, learn how to integrate with the network, and follow developer tutorials check out the [Developer Portal](https://nymtech.net/developers/) where you can find also our [FAQ section](https://nymtech.net/developers/faq/general-faq.md). ## Popular pages **Network Architecture:** @@ -27,4 +27,4 @@ If you are new to Nym and want to learn about the mixnet, explore kickstart opti **Wallets** * [Desktop](./wallet/desktop-wallet.md) -* [CLI](./wallet/cli-wallet.md) \ No newline at end of file +* [CLI](./wallet/cli-wallet.md) From 4677312cadb6f9254bb0f85c3d4acf61dcead8e2 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 10:42:23 +0200 Subject: [PATCH 23/47] fixed ls command for unknown/allowed.list --- documentation/operators/src/nodes/network-requester-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/operators/src/nodes/network-requester-setup.md b/documentation/operators/src/nodes/network-requester-setup.md index b89dc4d0b2..640f103a65 100644 --- a/documentation/operators/src/nodes/network-requester-setup.md +++ b/documentation/operators/src/nodes/network-requester-setup.md @@ -263,7 +263,7 @@ It is easy to add new domains and services to your network requester - simply fi How to go about this? Have a look in your nym-network-requester config directory: ``` -ls $HOME/.nym/service-providers/network-requester/ +ls -lt $HOME/.nym/service-providers/network-requester/*/data | grep "list" # returns: allowed.list unknown.list ``` From 26507ee7d3c61ad097598e06732aa784b3a81d21 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 10:58:38 +0200 Subject: [PATCH 24/47] minor syntax correction --- documentation/dev-portal/src/SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/dev-portal/src/SUMMARY.md b/documentation/dev-portal/src/SUMMARY.md index 6ee7eec1de..dcd96a9eef 100644 --- a/documentation/dev-portal/src/SUMMARY.md +++ b/documentation/dev-portal/src/SUMMARY.md @@ -1,6 +1,6 @@ # Summary -[Introduction](introduction.md) +- [Introduction](introduction.md) # Infrastructure From 17bd44f840f0751c852819248c2b22cb65fe06e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Thu, 7 Sep 2023 10:22:14 +0100 Subject: [PATCH 25/47] added optional name to TaskManager --- common/task/src/manager.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/common/task/src/manager.rs b/common/task/src/manager.rs index 670f9c7bb6..96210776f9 100644 --- a/common/task/src/manager.rs +++ b/common/task/src/manager.rs @@ -49,6 +49,9 @@ pub enum TaskStatus { /// shutdown. Keeps track of if task stop unexpectedly, such as in a panic. #[derive(Debug)] pub struct TaskManager { + // optional name assigned to the task manager that all subscribed task clients will inherit + name: Option, + // These channels have the dual purpose of signalling it's time to shutdown, but also to keep // track of which tasks we are still waiting for. notify_tx: watch::Sender<()>, @@ -81,6 +84,7 @@ impl Default for TaskManager { // there is a listener. let (task_status_tx, task_status_rx) = futures::channel::mpsc::channel(128); Self { + name: None, notify_tx, notify_rx: Some(notify_rx), shutdown_timer_secs: DEFAULT_SHUTDOWN_TIMER_SECS, @@ -102,6 +106,12 @@ impl TaskManager { } } + #[must_use] + pub fn named>(mut self, name: S) -> Self { + self.name = Some(name.into()); + self + } + #[cfg(not(target_arch = "wasm32"))] pub async fn catch_interrupt(mut self) -> Result<(), SentError> { let res = crate::wait_for_signal_and_error(&mut self).await; @@ -116,7 +126,7 @@ impl TaskManager { } pub fn subscribe(&self) -> TaskClient { - TaskClient::new( + let task_client = TaskClient::new( self.notify_rx .as_ref() .expect("Unable to subscribe to shutdown notifier that is already shutdown") @@ -124,7 +134,13 @@ impl TaskManager { self.task_return_error_tx.clone(), self.task_drop_tx.clone(), self.task_status_tx.clone(), - ) + ); + + if let Some(name) = &self.name { + task_client.named(format!("{name}-child")) + } else { + task_client + } } pub fn signal_shutdown(&self) -> Result<(), SendError<()>> { From 74cd6f0198782a9df2b5b4a1e968f5401aa0d00c Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 13:01:50 +0200 Subject: [PATCH 26/47] docs: correcting links to operators pages --- documentation/docs/src/nodes/mixnode.md | 4 ++-- documentation/docs/src/nodes/network-requester.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/documentation/docs/src/nodes/mixnode.md b/documentation/docs/src/nodes/mixnode.md index b093c6f0b4..8565f7be0a 100644 --- a/documentation/docs/src/nodes/mixnode.md +++ b/documentation/docs/src/nodes/mixnode.md @@ -1,6 +1,6 @@ # Mix Nodes -> The mix node setup and maintenance guide has migrated to the [Operator Guides book](https://nymtech.net/developers/nodes/mix-node-setup.html). +> The mix node setup and maintenance guide has migrated to the [Operator Guides book](https://nymtech.net/operators/nodes/mix-node-setup.html). Mix nodes are the backbone of the mixnet. These are the nodes that perform 'mix mining', otherwise known simply as 'mixing'. @@ -14,4 +14,4 @@ Mix nodes are rewarded according to their quality of service, and the probabilit * [Nym Whitepaper](https://nymtech.net/nym-whitepaper.pdf) section 4 * [Nym Blog: Mix node deepdive](https://blog.nymtech.net/nym-mixnodes-deep-dive-d2b91917f097) * [Mixnet Traffic Flow overview](../architecture/traffic-flow.md) -* [Reward Sharing for Mixnets](https://nymtech.net/nym-cryptoecon-paper.pdf) \ No newline at end of file +* [Reward Sharing for Mixnets](https://nymtech.net/nym-cryptoecon-paper.pdf) diff --git a/documentation/docs/src/nodes/network-requester.md b/documentation/docs/src/nodes/network-requester.md index ac083a3143..da9fff6a64 100644 --- a/documentation/docs/src/nodes/network-requester.md +++ b/documentation/docs/src/nodes/network-requester.md @@ -1,6 +1,6 @@ # Network Requester -> The network requester setup and maintenance guide has moved to the [Operator Guides book](https://nymtech.net/developers/nodes/network-requester-setup.html). +> The network requester setup and maintenance guide has moved to the [Operator Guides book](https://nymtech.net/operators/nodes/network-requester-setup.html). Network requesters are the first instance of the catch-all term 'service', or 'service providers'. In essence, think of services as being the part of the mixnet infrastructure that let you _do_ something, such as access emails, messaging service backends, or blockchains via the mixnet. @@ -19,4 +19,4 @@ This default whitelist is useful for knowing that the majority of Network reques ## Further reading * [Nym Blog: Network Requester deepdive](https://blog.nymtech.net/tech-deepdive-network-requesters-e5359a6cc31c) -* [Nym Blog: Choose Your Character](https://blog.nymtech.net/choose-your-character-an-overview-of-nym-network-actors-19e6a9808540) \ No newline at end of file +* [Nym Blog: Choose Your Character](https://blog.nymtech.net/choose-your-character-an-overview-of-nym-network-actors-19e6a9808540) From d96de448d0ac4c0899d6c7e0f982797095e125ec Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 13:19:29 +0200 Subject: [PATCH 27/47] operators/maintenance page: syntax corrections --- .../operators/src/nodes/maintenance.md | 103 ++++++++++-------- 1 file changed, 59 insertions(+), 44 deletions(-) diff --git a/documentation/operators/src/nodes/maintenance.md b/documentation/operators/src/nodes/maintenance.md index 7f0416ea9d..3c517a9671 100644 --- a/documentation/operators/src/nodes/maintenance.md +++ b/documentation/operators/src/nodes/maintenance.md @@ -10,7 +10,7 @@ A `build-info` command prints the build information like commit hash, rust versi For example `./target/debug/nym-network-requester --no-banner build-info --output json` will return: -``` +```sh {"binary_name":"nym-network-requester","build_timestamp":"2023-07-24T15:38:37.00657Z","build_version":"1.1.23","commit_sha":"c70149400206dce24cf20babb1e64f22202672dd","commit_timestamp":"2023-07-24T14:45:45Z","commit_branch":"feature/simplify-cli-parsing","rustc_version":"1.71.0","rustc_channel":"stable","cargo_profile":"debug"} ``` @@ -57,25 +57,25 @@ If you are running an existing network requester registered with nym-connect, up Initiate the new network requester: -``` +```sh nym-network-requester init --id ``` Copy the old keys from your client to the network-requester configuration that was created above: -``` +```sh cp -vr ~/.nym/clients/myoldclient/data/* ~/.nym/service-providers/network-requester//data ``` Edit the configuration to match what you used on your client. Specifically, edit the configuration file at: -``` +```sh ~/.nym/service-providers/network-requester//config/config.toml ``` Ensure that the fields `gateway_id`, `gateway_owner`, `gateway_listener` in the new config match those in the old client config at: -``` +```sh ~/.nym/clients/myoldclient/config/config.toml ``` @@ -115,7 +115,8 @@ Assuming both machines are remote VPS. * Make sure your `~/.ssh/.pub` is in both of the machines `~/.ssh/authorized_keys` file * Create a `mixnodes` folder in the target VPS. Ssh in from your terminal and run: -``` + +```sh # in case none of the nym configs was created previously mkdir ~/.nym @@ -123,7 +124,7 @@ mkdir ~/.nym mkdir ~/.nym/mixnodes ``` * Move the node data (keys) and config file to the new machine by opening a local terminal (as that one's ssh key is authorized in both of the machines) and running: -``` +```sh scp -r -3 @:~/.nym/mixnodes/ @:~/.nym/mixnodes/ ``` * Re-run init (remember that init doesn't overwrite existing keys) to generate a config with the new listening address etc. @@ -134,7 +135,7 @@ scp -r -3 @:~/.nym/mixnodes/ ` is now ready to receive traffic, your server may not be. The following commands will allow you to set up a firewall using `ufw`. -``` +```sh # check if you have ufw installed ufw version @@ -150,7 +151,7 @@ sudo ufw status Finally open your `` p2p port, as well as ports for ssh and ports for verloc and measurement pings: -``` +```sh # for mix node sudo ufw allow 1789,1790,8000,22/tcp @@ -165,7 +166,7 @@ sudo ufw allow 1317,26656,26660,22,80,443/tcp ``` Check the status of the firewall: -``` +```sh sudo ufw status ``` @@ -179,7 +180,7 @@ Although it’s not totally necessary, it's useful to have the mix node automati `nohup` is a command with which your terminal is told to ignore the `HUP` or 'hangup' signal. This will stop the node process ending if you kill your session. -``` +```sh nohup ./ run --id # where `` is the id you set during the `init` command and depends on which node you starting ``` @@ -207,17 +208,17 @@ No when you installed tmux on your VPS, let's run a mix node on tmux, which allo * Pause your `` * Start tmux with the command -``` +```sh tmux ``` * The tmux terminal should open in the same working directory, just the layout changed into tmux default layout. * Start the `` again with a command: -``` +```sh ./ run --id ``` * Now, without closing the tmux window, you can close the whole terminal and the `` (and any other process running in tmux) will stay active. * Next time just start your teminal, ssh into the VPS and run the following command to attach back to your previous session: -``` +```sh tmux attach-session ``` * To see keybinding options of tmux press `ctrl`+`b` and after 1 second `?` @@ -293,7 +294,7 @@ WantedBy=multi-user.target Now enable and start your requester: -``` +```sh systemctl enable nym-network-requester.service systemctl start nym-network-requester.service @@ -313,10 +314,10 @@ StartLimitInterval=350 StartLimitBurst=10 [Service] -User=nyx # change to your user +User= # change to your user Type=simple -Environment="LD_LIBRARY_PATH=/home/youruser/path/to/nyx/binaries" # change to correct path -ExecStart=/home/youruser/path/to/nyx/binaries/nymd start # change to correct path +Environment="LD_LIBRARY_PATH=/home//" # change to correct path +ExecStart=/home///nymd start # change to correct path Restart=on-failure RestartSec=30 LimitNOFILE=infinity @@ -327,11 +328,11 @@ WantedBy=multi-user.target Proceed to start it with: -``` +```sh systemctl daemon-reload # to pickup the new unit file systemctl enable nymd # to enable the service systemctl start nymd # to actually start the service -journalctl -f # to monitor system logs showing the service start +journalctl -f -u nymd # to monitor system logs showing the service start ``` ##### Following steps for Nym Mixnet nodes @@ -344,9 +345,13 @@ If you have built nym in the `$HOME` directory on your server, and your username Then run: +```sh +systemctl daemon-reload # to pickup the new unit file ``` + +```sh # for mix node -systemctl enable nym-mix node.service +systemctl enable nym-mixnode.service # for gateway systemctl enable nym-gateway.service @@ -354,7 +359,7 @@ systemctl enable nym-gateway.service Start your node: -``` +```sh # for mix node service nym-mixnode start @@ -365,6 +370,16 @@ service nym-gateway start This will cause your node to start at system boot time. If you restart your machine, the node will come back up automatically. +You can monitor system logs of your node by running: +```sh +journalctl -f -u .service +``` + +Or check a status by running: +```sh +systemctl status .service +``` + You can also do `service stop` or `service restart`. Note: if you make any changes to your systemd script after you've enabled it, you will need to run: @@ -383,7 +398,7 @@ Linux machines limit how many open files a user is allowed to have. This is call If you see errors such as: -``` +```sh Failed to accept incoming connection - Os { code: 24, kind: Other, message: "Too many open files" } ``` @@ -397,8 +412,8 @@ The ulimit setup is relevant for maintenance of nym mix node only. Query the `ulimit` of your `` with: -``` -# for nym-, nym-gateway and nym-network requester: +```sh +# for nym-mixnode, nym-gateway and nym-network requester: grep -i "open files" /proc/$(ps -A -o pid,cmd|grep | grep -v grep |head -n 1 | awk '{print $1}')/limits # for nyx validator: @@ -409,7 +424,7 @@ grep -i "open files" /proc/$(ps -A -o pid,cmd|grep nymd | grep -v grep |head -n You'll get back the hard and soft limits, which looks something like this: -``` +```sh Max open files 65536 65536 files ``` @@ -417,26 +432,26 @@ If your output is **the same as above**, your node will not encounter any `ulimi However if either value is `1024`, you must raise the limit via the systemd service file. Add the line: -``` +```sh LimitNOFILE=65536 ``` Reload the daemon: -``` +```sh systemctl daemon-reload ``` or execute this as root for system-wide setting of `ulimit`: -``` +```sh echo "DefaultLimitNOFILE=65535" >> /etc/systemd/system.conf ``` Reboot your machine and restart your node. When it comes back, use: -``` +```sh # for nym-mixnode, nym-gateway and nym-network requester: -cat /proc/$(pidof )/limits | grep "Max open files"` to make sure the limit has changed to 65535. +cat /proc/$(pidof )/limits | grep "Max open files" # for validator cat /proc/$(pidof nym-validator)/limits | grep "Max open files" @@ -447,7 +462,7 @@ Make sure the limit has changed to 65535. In case you chose tmux option for mix node automatization, see your `ulimit` list by running: -``` +```sh ulimit -a # watch for the output line -n @@ -456,13 +471,13 @@ ulimit -a You can change it either by running a command: -``` +```sh ulimit -u -n 4096 ``` or editing `etc/security/conf` and add the following lines: -``` +```sh # Example hard limit for max opened files username hard nofile 4096 @@ -479,7 +494,7 @@ On some services (AWS, Google, etc) the machine's available bind address is not For example, on a Google machine, you may see the following output from the `ifconfig` command: -``` +```sh ens4: flags=4163 mtu 1460 inet 10.126.5.7 netmask 255.255.255.255 broadcast 0.0.0.0 ... @@ -492,7 +507,7 @@ The `ens4` interface has the IP `10.126.5.7`. But this isn't the public IP of th Trying `nym-mixnode init --host 36.68.243.18`, you'll get back a startup error saying `AddrNotAvailable`. This is because the mix node doesn't know how to bind to a host that's not in the output of `ifconfig`. The right thing to do in this situation is to init with a command: -``` +```sh ./nym-mixnode init --host 10.126.5.7 --announce-host 36.68.243.18 ``` @@ -513,13 +528,13 @@ The endpoint is a particularly common for mix node operators as it can provide a Using this API endpoint returns information about the Reward Estimation: -``` +```sh /status/mixnode//reward-estimation ``` Query Response: -``` +```sh "estimation": { "total_node_reward": "942035.916721770541325331", "operator": "161666.263307386408152071", @@ -546,19 +561,19 @@ Query Response: Install `nginx` and allow the 'Nginx Full' rule in your firewall: -``` +```sh sudo ufw allow 'Nginx Full' ``` Check nginx is running via systemctl: -``` +```sh systemctl status nginx ``` Which should return: -``` +```sh ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2018-04-20 16:08:19 UTC; 3 days ago @@ -574,7 +589,7 @@ Which should return: Proxying your validator's port `26657` to nginx port `80` can then be done by creating a file with the following at `/etc/nginx/conf.d/validator.conf`: -``` +```sh server { listen 80; listen [::]:80; @@ -591,7 +606,7 @@ server { Followed by: -``` +```sh sudo apt install certbot nginx python3 certbot --nginx -d nym-validator.yourdomain.com -m you@yourdomain.com --agree-tos --noninteractive --redirect ``` @@ -606,7 +621,7 @@ These commands will get you an https encrypted nginx proxy in front of the API. Configure Prometheus with the following commands (adapted from NodesGuru's [Agoric setup guide](https://nodes.guru/agoric/setup-guide/en)): -``` +```sh echo 'export OTEL_EXPORTER_PROMETHEUS_PORT=9464' >> $HOME/.bashrc source ~/.bashrc sed -i '/\[telemetry\]/{:a;n;/enabled/s/false/true/;Ta}' $HOME/.nymd/config/app.toml From 4890c528bcb519290de81ef968bb2ba1399914a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Thu, 7 Sep 2023 12:45:03 +0100 Subject: [PATCH 28/47] feat: mixFetch - the final countdown (#3737) * mixFetch * clippy * removed redundant Arc over 'WasmStorage' in the 'ClientStorage' --------- Co-authored-by: Fouad --- .../build-and-upload-binaries-ci.yml | 2 +- .github/workflows/contracts-build.yml | 2 +- .github/workflows/sdk-docs-typescript.yml | 30 +- .github/workflows/typescript-lint.yml | 24 +- .github/workflows/wasm_client_build.yml | 40 - .github/workflows/wasm_sdk.yml | 46 + .gitignore | 4 +- Cargo.lock | 703 +- Cargo.toml | 25 +- Makefile | 84 +- clients/webassembly/.appveyor.yml | 11 - clients/webassembly/.cargo-ok | 0 clients/webassembly/.cargo/config.toml | 2 - clients/webassembly/.gitignore | 6 - clients/webassembly/.travis.yml | 69 - clients/webassembly/Cargo.lock | 5559 ------------- clients/webassembly/Cargo.toml | 74 - clients/webassembly/LICENSE_APACHE | 176 - clients/webassembly/Makefile | 8 - clients/webassembly/internal-dev/worker.js | 382 - clients/webassembly/src/constants.rs | 5 - clients/webassembly/src/gateway_selector.rs | 45 - clients/webassembly/src/lib.rs | 42 - clients/webassembly/src/storage/error.rs | 28 - clients/webassembly/src/storage/mod.rs | 294 - clients/webassembly/src/topology.rs | 267 - clients/webassembly/src/validation.rs | 35 - clients/webassembly/tests/web.rs | 13 - common/client-core/Cargo.toml | 18 +- .../replies/reply_storage/backend/mod.rs | 2 +- common/client-core/src/config/mod.rs | 12 +- common/client-libs/gateway-client/Cargo.toml | 13 +- .../client-libs/gateway-client/src/client.rs | 4 +- .../client-libs/gateway-client/src/error.rs | 7 +- .../src/ephemeral_storage.rs | 3 +- common/http-requests/Cargo.toml | 19 + common/http-requests/src/error.rs | 23 + common/http-requests/src/lib.rs | 63 + common/http-requests/src/socks.rs | 214 + common/node-tester-utils/Cargo.toml | 2 +- common/node-tester-utils/src/lib.rs | 3 + common/nymsphinx/addressing/Cargo.toml | 1 + common/nymsphinx/addressing/src/clients.rs | 9 +- common/nymsphinx/src/receiver.rs | 8 +- common/socks5/ordered-buffer/src/buffer.rs | 12 +- .../src/connection_controller.rs | 2 +- common/socks5/requests/src/request.rs | 16 +- common/socks5/requests/src/response.rs | 2 +- common/task/src/manager.rs | 1 + common/topology/Cargo.toml | 1 + common/topology/src/gateway.rs | 9 +- common/topology/src/lib.rs | 36 +- common/topology/src/mix.rs | 9 +- common/wasm-utils/Cargo.toml | 63 - common/wasm-utils/src/websocket/mod.rs | 289 - common/wasm-utils/src/websocket/state.rs | 27 - common/wasm/client-core/Cargo.toml | 46 + .../wasm/client-core/src/config/mod.rs | 735 +- .../wasm/client-core/src/config/override.rs | 334 + .../wasm/client-core}/src/error.rs | 48 +- .../wasm/client-core}/src/helpers.rs | 39 +- common/wasm/client-core/src/lib.rs | 55 + .../src/storage/core_client_traits.rs | 22 +- common/wasm/client-core/src/storage/mod.rs | 151 + .../src/storage/wasm_client_traits.rs | 220 + common/wasm/client-core/src/topology.rs | 251 + common/wasm/storage/Cargo.toml | 20 + .../storage/src}/cipher_export.rs | 0 .../src/storage => wasm/storage/src}/error.rs | 2 +- .../mod.rs => wasm/storage/src/lib.rs} | 19 +- common/wasm/storage/src/traits.rs | 100 + common/wasm/utils/Cargo.toml | 44 + .../utils}/src/crypto/asymmetric.rs | 0 .../utils}/src/crypto/mod.rs | 0 .../utils}/src/crypto/symmetric.rs | 0 .../src/lib.rs => wasm/utils/src/error.rs} | 76 +- common/wasm/utils/src/lib.rs | 72 + common/wasm/utils/src/websocket/mod.rs | 108 + nym-browser-extension/package.json | 6 +- nym-browser-extension/storage/Cargo.toml | 29 +- nym-browser-extension/storage/Makefile | 2 +- nym-browser-extension/storage/src/error.rs | 12 +- nym-browser-extension/storage/src/lib.rs | 12 +- nym-browser-extension/storage/src/storage.rs | 6 +- nym-connect/desktop/Cargo.lock | 73 +- nym-connect/desktop/src-tauri/Cargo.toml | 3 +- nym-wallet/package.json | 4 +- nym-wallet/src-tauri/Cargo.toml | 2 +- .../src/components/TestNode/Packets.tsx | 2 +- .../src/components/TestNode/Results.tsx | 2 +- nym-wallet/src/components/TestNode/types.ts | 1 + .../bonding/node-settings/node-test/index.tsx | 3 +- package.json | 21 +- .../yarn/storage-placeholder/package.json | 5 - .../build/yarn/wasm-placeholder/package.json | 5 - scripts/generate_changelog.sh | 30 - scripts/start_local_network.sh | 60 - sdk/rust/nym-sdk/Cargo.toml | 7 + .../examples/manually_overwrite_topology.rs | 6 +- sdk/rust/nym-sdk/examples/mixfetch.rs | 166 + sdk/typescript/.eslintrc.js | 2 +- sdk/typescript/docs/.gitignore | 1 + sdk/typescript/docs/README.md | 26 + sdk/typescript/docs/components/wallet.tsx | 27 + sdk/typescript/docs/next-env.d.ts | 5 + sdk/typescript/docs/next.config.js | 21 + sdk/typescript/docs/package-lock.json | 7113 +++++++++++++++++ sdk/typescript/docs/package.json | 29 + sdk/typescript/docs/pages/_meta.json | 6 + .../docs/pages/blockchain/_meta.json | 3 + .../docs/pages/blockchain/wallet.mdx | 13 + sdk/typescript/docs/pages/examples/_meta.json | 5 + .../docs/pages/examples/community.mdx | 8 + sdk/typescript/docs/pages/examples/index.mdx | 12 + .../docs/pages/examples/playground.mdx | 7 + sdk/typescript/docs/pages/index.mdx | 3 + sdk/typescript/docs/pages/sdk/_meta.json | 5 + sdk/typescript/docs/pages/sdk/index.mdx | 9 + sdk/typescript/docs/pages/sdk/mix-fetch.mdx | 8 + sdk/typescript/docs/pages/sdk/node-tester.mdx | 3 + .../docs/pages/sdk/react/_meta.json | 3 + .../docs/pages/sdk/react/components.mdx | 9 + sdk/typescript/docs/pages/sdk/react/hooks.mdx | 3 + sdk/typescript/docs/pages/sdk/react/index.mdx | 9 + .../docs/pages/sdk/tsdoc/_meta.json | 21 + sdk/typescript/docs/pages/sdk/tsdoc/index.mdx | 4 + sdk/typescript/docs/pnpm-lock.yaml | 2172 +++++ .../docs/scripts/build-prod-docs.sh | 17 + sdk/typescript/docs/theme.config.tsx | 43 + sdk/typescript/docs/tsconfig.json | 20 + .../examples/chat-app/parcel/package.json | 2 +- .../examples/chat-app/parcel/src/index.html | 2 +- .../examples/chat-app/plain-html/package.json | 2 +- .../examples/chat-app/plain-html/src/index.ts | 58 - .../chat-app/plain-html/tsconfig.json | 1 - .../chat-app/plain-html/webpack.common.js | 2 +- .../package.json | 2 +- .../src/App.tsx | 2 +- .../src/context/mixnet.tsx | 1 - .../webpack.common.js | 2 +- .../examples/chrome-extension/package.json | 4 +- .../examples/chrome-extension/tsconfig.json | 9 + .../examples/firefox-extension/package.json | 7 +- .../firefox-extension/src/background.ts | 114 + .../firefox-extension/src/dom-utils.ts | 35 + .../examples/firefox-extension/src/popup.ts | 40 + .../examples/firefox-extension/tsconfig.json | 9 + .../examples/node-tester/parcel/package.json | 2 +- .../node-tester/plain-html/package.json | 2 +- .../examples/node-tester/react/package.json | 2 +- .../examples/react/mui-theme}/README.md | 0 .../examples/react/mui-theme}/package.json | 0 .../examples/react/mui-theme}/src/App.tsx | 0 .../react/mui-theme}/src/ThemeToggle.tsx | 0 .../react/mui-theme}/src/context/index.tsx | 0 .../examples/react/mui-theme}/src/index.html | 0 .../examples/react/mui-theme}/src/index.tsx | 0 .../react/mui-theme}/src/tests/App.test.tsx | 0 .../react/mui-theme}/src/theme/mui-theme.d.ts | 0 .../react}/mui-theme/src/typings/FC.d.ts | 0 .../examples/react/mui-theme}/tsconfig.json | 0 .../react/mui-theme}/tsconfig.prod.json | 0 .../react/mui-theme}/webpack.common.js | 0 .../react/mui-theme}/webpack.config.js | 0 .../examples/react/mui-theme}/webpack.prod.js | 0 .../examples/react/mui-theme}/yarn-error.log | 0 .../examples/react/sdk-react/package.json | 43 + .../examples/react/sdk-react/src/App.tsx | 97 + .../examples/react/sdk-react/src/index.html | 20 + .../examples/react/sdk-react/src/index.tsx | 7 + .../react/sdk-react}/src/typings/FC.d.ts | 0 .../examples/react/sdk-react/tsconfig.json | 9 + .../plain-html/src => shared}/dom-utils.ts | 48 +- .../{chat-app/parcel/src => shared}/index.ts | 4 +- sdk/typescript/packages/dom-utils/README.md | 7 + .../dom-utils/index.ts} | 43 +- sdk/typescript/packages/mix-fetch/.babelrc | 3 + sdk/typescript/packages/mix-fetch/.gitignore | 2 + .../mix-fetch/README-CommonJS-full-fat.md | 16 + .../packages/mix-fetch/README-CommonJS.md | 16 + .../packages/mix-fetch/README-full-fat.md | 16 + sdk/typescript/packages/mix-fetch/README.md | 19 + .../packages/mix-fetch/internal-dev/README.md | 44 + .../mix-fetch/internal-dev/package.json | 57 + .../internal-dev/parcel/package.json | 14 + .../mix-fetch/internal-dev/src/index.html | 18 + .../mix-fetch/internal-dev/src/index.ts | 72 + .../mix-fetch/internal-dev/tsconfig.json | 8 + .../mix-fetch/internal-dev/webpack.common.js | 45 + .../mix-fetch/internal-dev/webpack.config.js | 71 + .../mix-fetch/internal-dev/webpack.prod.js | 42 + .../packages/mix-fetch/jest.config.mjs | 15 + .../packages/mix-fetch/package.json | 83 + .../mix-fetch/rollup-cjs-full-fat.config.mjs | 8 + .../packages/mix-fetch/rollup-cjs.config.mjs | 5 + .../mix-fetch/rollup-esm-full-fat.config.mjs | 8 + .../packages/mix-fetch/rollup-esm.config.mjs | 8 + .../mix-fetch/rollup-worker-new.config.mjs | 37 + .../mix-fetch/rollup-worker.config.mjs | 37 + .../packages/mix-fetch/rollup/cjs.mjs | 30 + .../packages/mix-fetch/rollup/esm.mjs | 41 + .../mix-fetch/scripts/build-dev-esm.sh | 46 + .../scripts/build-prod-docs-collect.sh | 17 + .../packages/mix-fetch/scripts/build-prod.sh | 20 + .../packages/mix-fetch/scripts/build.sh | 78 + .../mix-fetch/scripts/buildPackageJson.mjs | 29 + .../mix-fetch/scripts/postBuildReplace.mjs | 39 + .../{sdk => mix-fetch}/scripts/publish.sh | 0 .../mix-fetch/src/create-mix-fetch.ts | 76 + .../packages/mix-fetch/src/index.ts | 42 + .../packages/mix-fetch/src/types.ts | 96 + .../worker/handle-response-mime-types.test.ts | 45 + .../src/worker/handle-response-mime-types.ts | 111 + .../packages/mix-fetch/src/worker/index.ts | 9 + .../packages/mix-fetch/src/worker/main.ts | 64 + .../mix-fetch/src/worker/wasm-loading.ts | 87 + .../packages/mix-fetch/tsconfig.jest.json | 43 + .../packages/mix-fetch/tsconfig.json | 45 + .../packages/mix-fetch/typedoc.json | 32 + .../mix-fetch/typings/rollup-worker.d.ts | 4 + .../packages/mix-fetch/typings/wasm_exec.d.ts | 11 + .../typescript/packages}/mui-theme/README.md | 0 .../packages}/mui-theme/package.json | 1 + .../packages}/mui-theme/src/index.ts | 0 .../packages}/mui-theme/src/theme/common.ts | 0 .../packages}/mui-theme/src/theme/index.tsx | 0 .../mui-theme/src/theme/network-explorer.ts | 0 .../packages}/mui-theme/src/theme/theme.ts | 0 .../packages}/mui-theme/src/theme/utils.ts | 0 .../packages}/mui-theme/src/theme/wallet.ts | 0 .../packages/mui-theme}/src/typings/FC.d.ts | 0 .../mui-theme/template/mui-theme.d.ts | 0 .../packages}/mui-theme/tsconfig.json | 2 +- sdk/typescript/packages/node-tester/.babelrc | 3 + .../packages/node-tester/.gitignore | 1 + .../node-tester/README-CommonJS-full-fat.md | 7 + .../packages/node-tester/README-CommonJS.md | 7 + .../packages/node-tester/README-full-fat.md | 7 + sdk/typescript/packages/node-tester/README.md | 7 + .../packages/node-tester/jest.config.mjs | 15 + .../packages/node-tester/package.json | 74 + .../rollup-cjs-full-fat.config.mjs | 8 + .../node-tester/rollup-cjs.config.mjs | 5 + .../rollup-esm-full-fat.config.mjs | 8 + .../node-tester/rollup-esm.config.mjs | 8 + .../rollup-worker.config.mjs} | 8 +- .../packages/node-tester/rollup/cjs.mjs | 30 + .../packages/node-tester/rollup/esm.mjs | 28 + .../node-tester/scripts/build-dev-esm.sh | 33 + .../node-tester/scripts/build-prod.sh | 20 + .../packages/node-tester/scripts/build.sh | 69 + .../node-tester/scripts/buildPackageJson.mjs | 29 + .../packages/node-tester/scripts/publish.sh | 19 + .../node-tester => node-tester/src}/index.ts | 2 + .../node-tester => node-tester/src}/types.ts | 0 .../node-tester => node-tester/src}/worker.ts | 10 +- .../packages/node-tester/tsconfig.jest.json | 43 + .../packages/node-tester/tsconfig.json | 45 + .../node-tester/typings/rollup-worker.d.ts | 4 + .../packages/nym-client-wasm/BUILD.md | 39 - .../packages/nym-client-wasm/scripts/build.sh | 23 - .../packages}/react-components/.eslintrc.json | 0 .../react-components/.storybook/main.js | 0 .../react-components/.storybook/preview.js | 0 .../packages}/react-components/README.md | 0 .../packages}/react-components/package.json | 1 + .../WalletAddressFormField.stories.tsx | 0 .../account/WalletAddressFormField.tsx | 0 .../components/banners/MaintenanceBanner.tsx | 0 .../client-address/ClientAddress.stories.tsx | 0 .../client-address/ClientAddress.tsx | 0 .../clipboard/CopyToClipboard.stories.tsx | 0 .../components/clipboard/CopyToClipboard.tsx | 0 .../src/components/coins/CoinMark.stories.tsx | 0 .../src/components/coins/CoinMark.tsx | 0 .../coins/CoinMarkTestnet.stories.tsx | 0 .../src/components/coins/CoinMarkTestnet.tsx | 0 .../components/currency/Currency.stories.tsx | 0 .../src/components/currency/Currency.tsx | 0 .../currency/CurrencyAmount.stories.tsx | 0 .../components/currency/CurrencyAmount.tsx | 0 .../currency/CurrencyFormField.stories.tsx | 0 .../components/currency/CurrencyFormField.tsx | 0 .../currency/CurrencyWithCoinMark.tsx | 0 .../src/components/link/Link.stories.tsx | 0 .../src/components/link/Link.tsx | 0 .../src/components/logo/Logo.stories.tsx | 0 .../src/components/logo/LogoProps.ts | 0 .../src/components/logo/NymIcon.tsx | 0 .../src/components/logo/NymLogo.tsx | 0 .../src/components/logo/NymLogoBW.tsx | 0 .../src/components/logo/NymWordmark.tsx | 0 .../mixnodes/IdentityKeyFormField.stories.tsx | 0 .../mixnodes/IdentityKeyFormField.tsx | 0 .../networks/NetworkSelector.stories.tsx | 0 .../components/networks/NetworkSelector.tsx | 0 .../password-strength/PasswordStrength.tsx | 0 .../src/components/textfields/Mnemonic.tsx | 0 .../src/components/textfields/Password.tsx | 0 .../components/tooltip/Tooltip.stories.tsx | 0 .../src/components/tooltip/Tooltip.tsx | 0 .../src/components/warnings/Error.tsx | 0 .../src/hooks/useIsMounted.ts | 0 .../packages}/react-components/src/index.ts | 0 .../src/playground/Playground.tsx | 0 .../src/playground/buttons.tsx | 0 .../src/playground/checkboxes.tsx | 0 .../react-components/src/playground/fonts.tsx | 0 .../src/playground/switches.tsx | 0 .../react-components/src/playground/theme.tsx | 0 .../src/playground/theme/MUIThemeExplorer.tsx | 0 .../src/playground/theme/PaletteSwatches.tsx | 0 .../src/stories/Introduction.stories.mdx | 0 .../src/stories/Playground.stories.tsx | 0 .../src/theme/mui-theme.d.ts | 0 .../react-components/src/typings/FC.d.ts | 1 + .../react-components/src/typings/jpeg.d.ts | 0 .../react-components/src/typings/json.d.ts | 0 .../react-components/src/typings/png.d.ts | 0 .../react-components/src/typings/svg.d.ts | 0 .../react-components/tsconfig.eslint.json | 0 .../packages}/react-components/tsconfig.json | 2 +- .../packages/sdk-react/.eslintrc.json | 5 + sdk/typescript/packages/sdk-react/README.md | 7 + .../packages/sdk-react/package.json | 69 + .../packages/sdk-react/src/context/index.tsx | 1 + .../packages/sdk-react/src/context/mixnet.tsx | 109 + .../packages/sdk-react/src/index.ts | 1 + .../packages/sdk-react/src/typings/FC.d.ts | 1 + .../packages/sdk-react/tsconfig.eslint.json | 19 + .../packages/sdk-react/tsconfig.json | 19 + sdk/typescript/packages/sdk/.eslintrc.json | 5 + sdk/typescript/packages/sdk/.gitignore | 3 +- .../packages/sdk/README-CommonJS-full-fat.md | 62 + .../packages/sdk/README-full-fat.md | 62 + sdk/typescript/packages/sdk/package.json | 53 +- .../sdk/rollup-cjs-full-fat.config.mjs | 8 + .../packages/sdk/rollup-cjs.config.mjs | 22 +- .../sdk/rollup-esm-full-fat.config.mjs | 8 + .../packages/sdk/rollup-esm.config.mjs | 22 +- .../packages/sdk/rollup-worker.config.mjs | 6 +- sdk/typescript/packages/sdk/rollup/cjs.mjs | 30 + sdk/typescript/packages/sdk/rollup/esm.mjs | 28 + .../packages/sdk/scripts/build-dev-esm.sh | 33 + .../sdk/scripts/build-prod-docs-collect.sh | 17 + .../packages/sdk/scripts/build-prod.sh | 10 +- sdk/typescript/packages/sdk/scripts/build.sh | 30 +- .../packages/sdk/scripts/buildPackageJson.mjs | 27 +- .../packages/sdk/src/mixnet/index.ts | 2 - .../src/mixnet/wasm/types-from-wasm-pack.ts | 336 - .../packages/sdk/src/mixnet/wasm/types.ts | 4 +- .../packages/sdk/src/mixnet/wasm/worker.ts | 14 +- .../packages/sdk/tsconfig.eslint.json | 19 + .../packages/validator-client}/.eslintrc.json | 0 .../packages/validator-client}/.gitignore | 0 .../packages/validator-client}/.npmignore | 0 .../packages/validator-client}/.nvmrc | 0 .../packages/validator-client}/.nycrc.json | 0 .../packages/validator-client}/.prettierrc | 0 .../packages/validator-client}/LICENSE | 0 .../packages/validator-client}/README.md | 0 .../packages/validator-client}/package.json | 48 +- .../validator-client}/rollup.config.mjs | 0 .../validator-client}/scripts/build-prod.sh | 0 .../scripts/buildPackageJson.mjs | 0 .../validator-client}/src/currency.ts | 0 .../packages/validator-client}/src/index.ts | 0 .../validator-client}/src/nym-api-querier.ts | 0 .../validator-client}/src/nyxd-querier.ts | 0 .../validator-client}/src/query-client.ts | 0 .../validator-client}/src/signing-client.ts | 0 .../validator-client}/src/stargate-helper.ts | 0 .../src/tests/expectedResponses.ts | 0 .../src/tests/mock/client.ts | 0 .../src/tests/mock/delegation.mock.test.ts | 0 .../src/tests/mock/gateway.mock.test.ts | 0 .../src/tests/mock/mixnet.mock.test.ts | 0 .../src/tests/mock/mixnode.mock.test.ts | 0 .../src/tests/mock/testData.ts | 0 .../src/tests/query/mixnetQueries.test.ts | 0 .../src/tests/query/vestingQueries.test.ts | 0 .../src/tests/sign/mixnetActions.test.ts | 0 .../src/tests/simulate/simulateTx.test.ts | 0 .../validator-client}/src/types/global.d.ts | 0 .../validator-client}/src/types/shared.ts | 0 .../validator-client}/src/types/simulate.ts | 0 .../packages/validator-client}/src/utils.ts | 0 .../packages/validator-client}/tsconfig.json | 0 .../validator-client}/tsconfig.test.json | 0 sdk/typescript/scripts/build-prod-examples.sh | 46 + sdk/typescript/scripts/build-prod-sdk.sh | 26 + sdk/typescript/scripts/publish.sh | 57 + sdk/typescript/scripts/unpublish.sh | 68 + .../common/examples/control_requests.rs | 2 +- .../common/src/interface/version.rs | 12 +- .../network-requester/src/core.rs | 3 + .../network-requester/src/reply.rs | 3 - tools/internal/sdk-version-bump/Cargo.toml | 19 + tools/internal/sdk-version-bump/README.md | 19 + tools/internal/sdk-version-bump/src/cargo.rs | 47 + .../internal/sdk-version-bump/src/helpers.rs | 164 + tools/internal/sdk-version-bump/src/json.rs | 150 + .../sdk-version-bump/src/json_types.rs | 281 + tools/internal/sdk-version-bump/src/main.rs | 208 + tools/internal/ssl-inject/Cargo.toml | 12 + tools/internal/ssl-inject/src/main.rs | 96 + .../react-webpack-with-theme-example/.babelrc | 3 - .../jest.config.js | 5 - wasm/client/.cargo/config.toml | 6 + wasm/client/Cargo.toml | 46 + wasm/client/Makefile | 3 + .../webassembly => wasm/client}/README.md | 14 +- .../client}/internal-dev/.gitignore | 0 .../client}/internal-dev/bootstrap.js | 0 .../client}/internal-dev/index.html | 7 +- .../client}/internal-dev/index.js | 19 +- .../client}/internal-dev/package.json | 4 +- .../client}/internal-dev/webpack.config.js | 6 +- wasm/client/internal-dev/worker.js | 316 + wasm/client/internal-dev/yarn-error.log | 2261 ++++++ wasm/client/internal-dev/yarn.lock | 2189 +++++ .../mod.rs => wasm/client/src/client.rs | 212 +- wasm/client/src/config.rs | 63 + .../client}/src/encoded_payload_helper.rs | 0 wasm/client/src/error.rs | 51 + .../src/client => wasm/client/src}/helpers.rs | 53 +- wasm/client/src/lib.rs | 23 + .../client/src}/response_pusher.rs | 14 +- wasm/full-nym-wasm/.cargo/config.toml | 3 + wasm/full-nym-wasm/Cargo.toml | 32 + wasm/full-nym-wasm/Makefile | 3 + wasm/full-nym-wasm/src/lib.rs | 11 + wasm/mix-fetch/.cargo/config.toml | 3 + wasm/mix-fetch/Cargo.toml | 41 + wasm/mix-fetch/Makefile | 24 + wasm/mix-fetch/build.mjs | 12 + wasm/mix-fetch/go-mix-conn/.gitignore | 2 + wasm/mix-fetch/go-mix-conn/Makefile | 30 + wasm/mix-fetch/go-mix-conn/cmd/wasm/main.go | 31 + wasm/mix-fetch/go-mix-conn/go.mod | 7 + wasm/mix-fetch/go-mix-conn/go.sum | 4 + .../internal/bridge/go_bridge/go_bridge.go | 150 + .../bridge/rust_bridge/rust_bridge.go | 80 + .../internal/external/roundtrip_js.go | 158 + .../go-mix-conn/internal/external/set.go | 26 + .../go-mix-conn/internal/helpers/helpers.go | 121 + .../go-mix-conn/internal/jstypes/async.go | 67 + .../internal/jstypes/conv/request.go | 413 + .../internal/jstypes/conv/response.go | 350 + .../go-mix-conn/internal/jstypes/globals.go | 30 + .../go-mix-conn/internal/jstypes/headers.go | 102 + .../go-mix-conn/internal/jstypes/helpers.go | 140 + .../go-mix-conn/internal/jstypes/request.go | 45 + .../go-mix-conn/internal/jstypes/response.go | 16 + .../go-mix-conn/internal/log/logger.go | 100 + .../go-mix-conn/internal/mixfetch/helpers.go | 59 + .../go-mix-conn/internal/mixfetch/mixfetch.go | 362 + .../internal/sslhelpers/root_certs.go | 3235 ++++++++ .../internal/sslhelpers/ssl_helper.go | 15 + .../internal/state/fake_connection.go | 307 + .../go-mix-conn/internal/state/state.go | 124 + .../go-mix-conn/internal/types/options.go | 37 + .../go-mix-conn/internal/types/types.go | 6 + wasm/mix-fetch/internal-dev/.gitignore | 2 + wasm/mix-fetch/internal-dev/bootstrap.js | 5 + wasm/mix-fetch/internal-dev/index.html | 27 + wasm/mix-fetch/internal-dev/index.js | 96 + wasm/mix-fetch/internal-dev/package.json | 41 + wasm/mix-fetch/internal-dev/webpack.config.js | 37 + wasm/mix-fetch/internal-dev/worker.js | 278 + .../mix-fetch}/internal-dev/yarn.lock | 5 +- wasm/mix-fetch/src/active_requests.rs | 142 + wasm/mix-fetch/src/client.rs | 258 + wasm/mix-fetch/src/config.rs | 153 + wasm/mix-fetch/src/error.rs | 90 + wasm/mix-fetch/src/fetch.rs | 145 + wasm/mix-fetch/src/go_bridge.rs | 99 + wasm/mix-fetch/src/harbourmaster.rs | 141 + wasm/mix-fetch/src/helpers.rs | 36 + wasm/mix-fetch/src/lib.rs | 44 + wasm/mix-fetch/src/request_writer.rs | 83 + wasm/mix-fetch/src/socks_helpers.rs | 49 + wasm/node-tester/.cargo/config.toml | 3 + wasm/node-tester/Cargo.toml | 39 + wasm/node-tester/Makefile | 3 + wasm/node-tester/internal-dev/.gitignore | 2 + wasm/node-tester/internal-dev/bootstrap.js | 5 + wasm/node-tester/internal-dev/index.html | 44 + wasm/node-tester/internal-dev/index.js | 173 + wasm/node-tester/internal-dev/package.json | 40 + .../internal-dev/webpack.config.js | 33 + wasm/node-tester/internal-dev/worker.js | 152 + wasm/node-tester/internal-dev/yarn-error.log | 2261 ++++++ wasm/node-tester/internal-dev/yarn.lock | 2189 +++++ .../node-tester/src}/ephemeral_receiver.rs | 4 +- wasm/node-tester/src/error.rs | 64 + .../node-tester/src}/helpers.rs | 60 +- wasm/node-tester/src/lib.rs | 20 + .../mod.rs => wasm/node-tester/src/tester.rs | 166 +- wasm/node-tester/src/types.rs | 59 + yarn.lock | 1266 ++- 501 files changed, 36928 insertions(+), 9114 deletions(-) delete mode 100644 .github/workflows/wasm_client_build.yml create mode 100644 .github/workflows/wasm_sdk.yml delete mode 100644 clients/webassembly/.appveyor.yml delete mode 100644 clients/webassembly/.cargo-ok delete mode 100644 clients/webassembly/.cargo/config.toml delete mode 100644 clients/webassembly/.gitignore delete mode 100644 clients/webassembly/.travis.yml delete mode 100644 clients/webassembly/Cargo.lock delete mode 100644 clients/webassembly/Cargo.toml delete mode 100644 clients/webassembly/LICENSE_APACHE delete mode 100644 clients/webassembly/Makefile delete mode 100644 clients/webassembly/internal-dev/worker.js delete mode 100644 clients/webassembly/src/constants.rs delete mode 100644 clients/webassembly/src/gateway_selector.rs delete mode 100644 clients/webassembly/src/lib.rs delete mode 100644 clients/webassembly/src/storage/error.rs delete mode 100644 clients/webassembly/src/storage/mod.rs delete mode 100644 clients/webassembly/src/topology.rs delete mode 100644 clients/webassembly/src/validation.rs delete mode 100644 clients/webassembly/tests/web.rs create mode 100644 common/http-requests/Cargo.toml create mode 100644 common/http-requests/src/error.rs create mode 100644 common/http-requests/src/lib.rs create mode 100644 common/http-requests/src/socks.rs delete mode 100644 common/wasm-utils/Cargo.toml delete mode 100644 common/wasm-utils/src/websocket/mod.rs delete mode 100644 common/wasm-utils/src/websocket/state.rs create mode 100644 common/wasm/client-core/Cargo.toml rename clients/webassembly/src/client/config.rs => common/wasm/client-core/src/config/mod.rs (72%) create mode 100644 common/wasm/client-core/src/config/override.rs rename {clients/webassembly => common/wasm/client-core}/src/error.rs (73%) rename {clients/webassembly => common/wasm/client-core}/src/helpers.rs (72%) create mode 100644 common/wasm/client-core/src/lib.rs rename clients/webassembly/src/storage/traits.rs => common/wasm/client-core/src/storage/core_client_traits.rs (80%) create mode 100644 common/wasm/client-core/src/storage/mod.rs create mode 100644 common/wasm/client-core/src/storage/wasm_client_traits.rs create mode 100644 common/wasm/client-core/src/topology.rs create mode 100644 common/wasm/storage/Cargo.toml rename common/{wasm-utils/src/storage => wasm/storage/src}/cipher_export.rs (100%) rename common/{wasm-utils/src/storage => wasm/storage/src}/error.rs (97%) rename common/{wasm-utils/src/storage/mod.rs => wasm/storage/src/lib.rs} (96%) create mode 100644 common/wasm/storage/src/traits.rs create mode 100644 common/wasm/utils/Cargo.toml rename common/{wasm-utils => wasm/utils}/src/crypto/asymmetric.rs (100%) rename common/{wasm-utils => wasm/utils}/src/crypto/mod.rs (100%) rename common/{wasm-utils => wasm/utils}/src/crypto/symmetric.rs (100%) rename common/{wasm-utils/src/lib.rs => wasm/utils/src/error.rs} (54%) create mode 100644 common/wasm/utils/src/lib.rs create mode 100644 common/wasm/utils/src/websocket/mod.rs create mode 100644 nym-wallet/src/components/TestNode/types.ts delete mode 100644 scripts/build/yarn/storage-placeholder/package.json delete mode 100644 scripts/build/yarn/wasm-placeholder/package.json delete mode 100755 scripts/generate_changelog.sh delete mode 100755 scripts/start_local_network.sh create mode 100644 sdk/rust/nym-sdk/examples/mixfetch.rs create mode 100644 sdk/typescript/docs/.gitignore create mode 100644 sdk/typescript/docs/README.md create mode 100644 sdk/typescript/docs/components/wallet.tsx create mode 100644 sdk/typescript/docs/next-env.d.ts create mode 100644 sdk/typescript/docs/next.config.js create mode 100644 sdk/typescript/docs/package-lock.json create mode 100644 sdk/typescript/docs/package.json create mode 100644 sdk/typescript/docs/pages/_meta.json create mode 100644 sdk/typescript/docs/pages/blockchain/_meta.json create mode 100644 sdk/typescript/docs/pages/blockchain/wallet.mdx create mode 100644 sdk/typescript/docs/pages/examples/_meta.json create mode 100644 sdk/typescript/docs/pages/examples/community.mdx create mode 100644 sdk/typescript/docs/pages/examples/index.mdx create mode 100644 sdk/typescript/docs/pages/examples/playground.mdx create mode 100644 sdk/typescript/docs/pages/index.mdx create mode 100644 sdk/typescript/docs/pages/sdk/_meta.json create mode 100644 sdk/typescript/docs/pages/sdk/index.mdx create mode 100644 sdk/typescript/docs/pages/sdk/mix-fetch.mdx create mode 100644 sdk/typescript/docs/pages/sdk/node-tester.mdx create mode 100644 sdk/typescript/docs/pages/sdk/react/_meta.json create mode 100644 sdk/typescript/docs/pages/sdk/react/components.mdx create mode 100644 sdk/typescript/docs/pages/sdk/react/hooks.mdx create mode 100644 sdk/typescript/docs/pages/sdk/react/index.mdx create mode 100644 sdk/typescript/docs/pages/sdk/tsdoc/_meta.json create mode 100644 sdk/typescript/docs/pages/sdk/tsdoc/index.mdx create mode 100644 sdk/typescript/docs/pnpm-lock.yaml create mode 100755 sdk/typescript/docs/scripts/build-prod-docs.sh create mode 100644 sdk/typescript/docs/theme.config.tsx create mode 100644 sdk/typescript/docs/tsconfig.json delete mode 100644 sdk/typescript/examples/chat-app/plain-html/src/index.ts create mode 100644 sdk/typescript/examples/chrome-extension/tsconfig.json create mode 100644 sdk/typescript/examples/firefox-extension/src/background.ts create mode 100644 sdk/typescript/examples/firefox-extension/src/dom-utils.ts create mode 100644 sdk/typescript/examples/firefox-extension/src/popup.ts create mode 100644 sdk/typescript/examples/firefox-extension/tsconfig.json rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/README.md (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/package.json (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/src/App.tsx (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/src/ThemeToggle.tsx (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/src/context/index.tsx (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/src/index.html (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/src/index.tsx (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/src/tests/App.test.tsx (100%) rename {ts-packages/react-components => sdk/typescript/examples/react/mui-theme}/src/theme/mui-theme.d.ts (100%) rename {ts-packages => sdk/typescript/examples/react}/mui-theme/src/typings/FC.d.ts (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/tsconfig.json (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/tsconfig.prod.json (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/webpack.common.js (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/webpack.config.js (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/webpack.prod.js (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/examples/react/mui-theme}/yarn-error.log (100%) create mode 100644 sdk/typescript/examples/react/sdk-react/package.json create mode 100644 sdk/typescript/examples/react/sdk-react/src/App.tsx create mode 100644 sdk/typescript/examples/react/sdk-react/src/index.html create mode 100644 sdk/typescript/examples/react/sdk-react/src/index.tsx rename {ts-packages/react-components => sdk/typescript/examples/react/sdk-react}/src/typings/FC.d.ts (100%) create mode 100644 sdk/typescript/examples/react/sdk-react/tsconfig.json rename sdk/typescript/examples/{chat-app/plain-html/src => shared}/dom-utils.ts (58%) rename sdk/typescript/examples/{chat-app/parcel/src => shared}/index.ts (89%) create mode 100644 sdk/typescript/packages/dom-utils/README.md rename sdk/typescript/{examples/chat-app/parcel/src/dom-utils.ts => packages/dom-utils/index.ts} (62%) create mode 100644 sdk/typescript/packages/mix-fetch/.babelrc create mode 100644 sdk/typescript/packages/mix-fetch/.gitignore create mode 100644 sdk/typescript/packages/mix-fetch/README-CommonJS-full-fat.md create mode 100644 sdk/typescript/packages/mix-fetch/README-CommonJS.md create mode 100644 sdk/typescript/packages/mix-fetch/README-full-fat.md create mode 100644 sdk/typescript/packages/mix-fetch/README.md create mode 100644 sdk/typescript/packages/mix-fetch/internal-dev/README.md create mode 100644 sdk/typescript/packages/mix-fetch/internal-dev/package.json create mode 100644 sdk/typescript/packages/mix-fetch/internal-dev/parcel/package.json create mode 100644 sdk/typescript/packages/mix-fetch/internal-dev/src/index.html create mode 100644 sdk/typescript/packages/mix-fetch/internal-dev/src/index.ts create mode 100644 sdk/typescript/packages/mix-fetch/internal-dev/tsconfig.json create mode 100644 sdk/typescript/packages/mix-fetch/internal-dev/webpack.common.js create mode 100644 sdk/typescript/packages/mix-fetch/internal-dev/webpack.config.js create mode 100644 sdk/typescript/packages/mix-fetch/internal-dev/webpack.prod.js create mode 100644 sdk/typescript/packages/mix-fetch/jest.config.mjs create mode 100644 sdk/typescript/packages/mix-fetch/package.json create mode 100644 sdk/typescript/packages/mix-fetch/rollup-cjs-full-fat.config.mjs create mode 100644 sdk/typescript/packages/mix-fetch/rollup-cjs.config.mjs create mode 100644 sdk/typescript/packages/mix-fetch/rollup-esm-full-fat.config.mjs create mode 100644 sdk/typescript/packages/mix-fetch/rollup-esm.config.mjs create mode 100644 sdk/typescript/packages/mix-fetch/rollup-worker-new.config.mjs create mode 100644 sdk/typescript/packages/mix-fetch/rollup-worker.config.mjs create mode 100644 sdk/typescript/packages/mix-fetch/rollup/cjs.mjs create mode 100644 sdk/typescript/packages/mix-fetch/rollup/esm.mjs create mode 100755 sdk/typescript/packages/mix-fetch/scripts/build-dev-esm.sh create mode 100755 sdk/typescript/packages/mix-fetch/scripts/build-prod-docs-collect.sh create mode 100755 sdk/typescript/packages/mix-fetch/scripts/build-prod.sh create mode 100755 sdk/typescript/packages/mix-fetch/scripts/build.sh create mode 100644 sdk/typescript/packages/mix-fetch/scripts/buildPackageJson.mjs create mode 100644 sdk/typescript/packages/mix-fetch/scripts/postBuildReplace.mjs rename sdk/typescript/packages/{sdk => mix-fetch}/scripts/publish.sh (100%) create mode 100644 sdk/typescript/packages/mix-fetch/src/create-mix-fetch.ts create mode 100644 sdk/typescript/packages/mix-fetch/src/index.ts create mode 100644 sdk/typescript/packages/mix-fetch/src/types.ts create mode 100644 sdk/typescript/packages/mix-fetch/src/worker/handle-response-mime-types.test.ts create mode 100644 sdk/typescript/packages/mix-fetch/src/worker/handle-response-mime-types.ts create mode 100644 sdk/typescript/packages/mix-fetch/src/worker/index.ts create mode 100644 sdk/typescript/packages/mix-fetch/src/worker/main.ts create mode 100644 sdk/typescript/packages/mix-fetch/src/worker/wasm-loading.ts create mode 100644 sdk/typescript/packages/mix-fetch/tsconfig.jest.json create mode 100644 sdk/typescript/packages/mix-fetch/tsconfig.json create mode 100644 sdk/typescript/packages/mix-fetch/typedoc.json create mode 100644 sdk/typescript/packages/mix-fetch/typings/rollup-worker.d.ts create mode 100644 sdk/typescript/packages/mix-fetch/typings/wasm_exec.d.ts rename {ts-packages => sdk/typescript/packages}/mui-theme/README.md (100%) rename {ts-packages => sdk/typescript/packages}/mui-theme/package.json (97%) rename {ts-packages => sdk/typescript/packages}/mui-theme/src/index.ts (100%) rename {ts-packages => sdk/typescript/packages}/mui-theme/src/theme/common.ts (100%) rename {ts-packages => sdk/typescript/packages}/mui-theme/src/theme/index.tsx (100%) rename {ts-packages => sdk/typescript/packages}/mui-theme/src/theme/network-explorer.ts (100%) rename {ts-packages => sdk/typescript/packages}/mui-theme/src/theme/theme.ts (100%) rename {ts-packages => sdk/typescript/packages}/mui-theme/src/theme/utils.ts (100%) rename {ts-packages => sdk/typescript/packages}/mui-theme/src/theme/wallet.ts (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/packages/mui-theme}/src/typings/FC.d.ts (100%) rename {ts-packages => sdk/typescript/packages}/mui-theme/template/mui-theme.d.ts (100%) rename {ts-packages => sdk/typescript/packages}/mui-theme/tsconfig.json (86%) create mode 100644 sdk/typescript/packages/node-tester/.babelrc create mode 100644 sdk/typescript/packages/node-tester/.gitignore create mode 100644 sdk/typescript/packages/node-tester/README-CommonJS-full-fat.md create mode 100644 sdk/typescript/packages/node-tester/README-CommonJS.md create mode 100644 sdk/typescript/packages/node-tester/README-full-fat.md create mode 100644 sdk/typescript/packages/node-tester/README.md create mode 100644 sdk/typescript/packages/node-tester/jest.config.mjs create mode 100644 sdk/typescript/packages/node-tester/package.json create mode 100644 sdk/typescript/packages/node-tester/rollup-cjs-full-fat.config.mjs create mode 100644 sdk/typescript/packages/node-tester/rollup-cjs.config.mjs create mode 100644 sdk/typescript/packages/node-tester/rollup-esm-full-fat.config.mjs create mode 100644 sdk/typescript/packages/node-tester/rollup-esm.config.mjs rename sdk/typescript/packages/{sdk/rollup-node-tester-worker.config.mjs => node-tester/rollup-worker.config.mjs} (79%) create mode 100644 sdk/typescript/packages/node-tester/rollup/cjs.mjs create mode 100644 sdk/typescript/packages/node-tester/rollup/esm.mjs create mode 100755 sdk/typescript/packages/node-tester/scripts/build-dev-esm.sh create mode 100755 sdk/typescript/packages/node-tester/scripts/build-prod.sh create mode 100755 sdk/typescript/packages/node-tester/scripts/build.sh create mode 100644 sdk/typescript/packages/node-tester/scripts/buildPackageJson.mjs create mode 100755 sdk/typescript/packages/node-tester/scripts/publish.sh rename sdk/typescript/packages/{sdk/src/mixnet/node-tester => node-tester/src}/index.ts (98%) rename sdk/typescript/packages/{sdk/src/mixnet/node-tester => node-tester/src}/types.ts (100%) rename sdk/typescript/packages/{sdk/src/mixnet/node-tester => node-tester/src}/worker.ts (91%) create mode 100644 sdk/typescript/packages/node-tester/tsconfig.jest.json create mode 100644 sdk/typescript/packages/node-tester/tsconfig.json create mode 100644 sdk/typescript/packages/node-tester/typings/rollup-worker.d.ts delete mode 100644 sdk/typescript/packages/nym-client-wasm/BUILD.md delete mode 100755 sdk/typescript/packages/nym-client-wasm/scripts/build.sh rename {ts-packages => sdk/typescript/packages}/react-components/.eslintrc.json (100%) rename {ts-packages => sdk/typescript/packages}/react-components/.storybook/main.js (100%) rename {ts-packages => sdk/typescript/packages}/react-components/.storybook/preview.js (100%) rename {ts-packages => sdk/typescript/packages}/react-components/README.md (100%) rename {ts-packages => sdk/typescript/packages}/react-components/package.json (98%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/account/WalletAddressFormField.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/account/WalletAddressFormField.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/banners/MaintenanceBanner.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/client-address/ClientAddress.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/client-address/ClientAddress.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/clipboard/CopyToClipboard.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/clipboard/CopyToClipboard.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/coins/CoinMark.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/coins/CoinMark.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/coins/CoinMarkTestnet.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/coins/CoinMarkTestnet.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/currency/Currency.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/currency/Currency.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/currency/CurrencyAmount.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/currency/CurrencyAmount.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/currency/CurrencyFormField.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/currency/CurrencyFormField.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/currency/CurrencyWithCoinMark.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/link/Link.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/link/Link.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/logo/Logo.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/logo/LogoProps.ts (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/logo/NymIcon.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/logo/NymLogo.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/logo/NymLogoBW.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/logo/NymWordmark.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/mixnodes/IdentityKeyFormField.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/mixnodes/IdentityKeyFormField.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/networks/NetworkSelector.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/networks/NetworkSelector.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/password-strength/PasswordStrength.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/textfields/Mnemonic.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/textfields/Password.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/tooltip/Tooltip.stories.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/tooltip/Tooltip.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/components/warnings/Error.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/hooks/useIsMounted.ts (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/index.ts (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/playground/Playground.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/playground/buttons.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/playground/checkboxes.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/playground/fonts.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/playground/switches.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/playground/theme.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/playground/theme/MUIThemeExplorer.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/playground/theme/PaletteSwatches.tsx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/stories/Introduction.stories.mdx (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/stories/Playground.stories.tsx (100%) rename {ts-packages/react-webpack-with-theme-example => sdk/typescript/packages/react-components}/src/theme/mui-theme.d.ts (100%) create mode 100644 sdk/typescript/packages/react-components/src/typings/FC.d.ts rename {ts-packages => sdk/typescript/packages}/react-components/src/typings/jpeg.d.ts (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/typings/json.d.ts (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/typings/png.d.ts (100%) rename {ts-packages => sdk/typescript/packages}/react-components/src/typings/svg.d.ts (100%) rename {ts-packages => sdk/typescript/packages}/react-components/tsconfig.eslint.json (100%) rename {ts-packages => sdk/typescript/packages}/react-components/tsconfig.json (88%) create mode 100644 sdk/typescript/packages/sdk-react/.eslintrc.json create mode 100644 sdk/typescript/packages/sdk-react/README.md create mode 100644 sdk/typescript/packages/sdk-react/package.json create mode 100644 sdk/typescript/packages/sdk-react/src/context/index.tsx create mode 100644 sdk/typescript/packages/sdk-react/src/context/mixnet.tsx create mode 100644 sdk/typescript/packages/sdk-react/src/index.ts create mode 100644 sdk/typescript/packages/sdk-react/src/typings/FC.d.ts create mode 100644 sdk/typescript/packages/sdk-react/tsconfig.eslint.json create mode 100644 sdk/typescript/packages/sdk-react/tsconfig.json create mode 100644 sdk/typescript/packages/sdk/.eslintrc.json create mode 100644 sdk/typescript/packages/sdk/README-CommonJS-full-fat.md create mode 100644 sdk/typescript/packages/sdk/README-full-fat.md create mode 100644 sdk/typescript/packages/sdk/rollup-cjs-full-fat.config.mjs create mode 100644 sdk/typescript/packages/sdk/rollup-esm-full-fat.config.mjs create mode 100644 sdk/typescript/packages/sdk/rollup/cjs.mjs create mode 100644 sdk/typescript/packages/sdk/rollup/esm.mjs create mode 100755 sdk/typescript/packages/sdk/scripts/build-dev-esm.sh create mode 100755 sdk/typescript/packages/sdk/scripts/build-prod-docs-collect.sh delete mode 100644 sdk/typescript/packages/sdk/src/mixnet/wasm/types-from-wasm-pack.ts create mode 100644 sdk/typescript/packages/sdk/tsconfig.eslint.json rename {clients/validator => sdk/typescript/packages/validator-client}/.eslintrc.json (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/.gitignore (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/.npmignore (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/.nvmrc (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/.nycrc.json (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/.prettierrc (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/LICENSE (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/README.md (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/package.json (93%) rename {clients/validator => sdk/typescript/packages/validator-client}/rollup.config.mjs (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/scripts/build-prod.sh (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/scripts/buildPackageJson.mjs (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/currency.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/index.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/nym-api-querier.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/nyxd-querier.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/query-client.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/signing-client.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/stargate-helper.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/tests/expectedResponses.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/tests/mock/client.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/tests/mock/delegation.mock.test.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/tests/mock/gateway.mock.test.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/tests/mock/mixnet.mock.test.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/tests/mock/mixnode.mock.test.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/tests/mock/testData.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/tests/query/mixnetQueries.test.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/tests/query/vestingQueries.test.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/tests/sign/mixnetActions.test.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/tests/simulate/simulateTx.test.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/types/global.d.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/types/shared.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/types/simulate.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/src/utils.ts (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/tsconfig.json (100%) rename {clients/validator => sdk/typescript/packages/validator-client}/tsconfig.test.json (100%) create mode 100755 sdk/typescript/scripts/build-prod-examples.sh create mode 100755 sdk/typescript/scripts/build-prod-sdk.sh create mode 100755 sdk/typescript/scripts/publish.sh create mode 100755 sdk/typescript/scripts/unpublish.sh create mode 100644 tools/internal/sdk-version-bump/Cargo.toml create mode 100644 tools/internal/sdk-version-bump/README.md create mode 100644 tools/internal/sdk-version-bump/src/cargo.rs create mode 100644 tools/internal/sdk-version-bump/src/helpers.rs create mode 100644 tools/internal/sdk-version-bump/src/json.rs create mode 100644 tools/internal/sdk-version-bump/src/json_types.rs create mode 100644 tools/internal/sdk-version-bump/src/main.rs create mode 100644 tools/internal/ssl-inject/Cargo.toml create mode 100644 tools/internal/ssl-inject/src/main.rs delete mode 100644 ts-packages/react-webpack-with-theme-example/.babelrc delete mode 100644 ts-packages/react-webpack-with-theme-example/jest.config.js create mode 100644 wasm/client/.cargo/config.toml create mode 100644 wasm/client/Cargo.toml create mode 100644 wasm/client/Makefile rename {clients/webassembly => wasm/client}/README.md (62%) rename {clients/webassembly => wasm/client}/internal-dev/.gitignore (100%) rename {clients/webassembly => wasm/client}/internal-dev/bootstrap.js (100%) rename {clients/webassembly => wasm/client}/internal-dev/index.html (86%) rename {clients/webassembly => wasm/client}/internal-dev/index.js (91%) rename {clients/webassembly => wasm/client}/internal-dev/package.json (89%) rename {clients/webassembly => wasm/client}/internal-dev/webpack.config.js (83%) create mode 100644 wasm/client/internal-dev/worker.js create mode 100644 wasm/client/internal-dev/yarn-error.log create mode 100644 wasm/client/internal-dev/yarn.lock rename clients/webassembly/src/client/mod.rs => wasm/client/src/client.rs (63%) create mode 100644 wasm/client/src/config.rs rename {clients/webassembly => wasm/client}/src/encoded_payload_helper.rs (100%) create mode 100644 wasm/client/src/error.rs rename {clients/webassembly/src/client => wasm/client/src}/helpers.rs (74%) create mode 100644 wasm/client/src/lib.rs rename {clients/webassembly/src/client => wasm/client/src}/response_pusher.rs (87%) create mode 100644 wasm/full-nym-wasm/.cargo/config.toml create mode 100644 wasm/full-nym-wasm/Cargo.toml create mode 100644 wasm/full-nym-wasm/Makefile create mode 100644 wasm/full-nym-wasm/src/lib.rs create mode 100644 wasm/mix-fetch/.cargo/config.toml create mode 100644 wasm/mix-fetch/Cargo.toml create mode 100644 wasm/mix-fetch/Makefile create mode 100644 wasm/mix-fetch/build.mjs create mode 100644 wasm/mix-fetch/go-mix-conn/.gitignore create mode 100644 wasm/mix-fetch/go-mix-conn/Makefile create mode 100644 wasm/mix-fetch/go-mix-conn/cmd/wasm/main.go create mode 100644 wasm/mix-fetch/go-mix-conn/go.mod create mode 100644 wasm/mix-fetch/go-mix-conn/go.sum create mode 100644 wasm/mix-fetch/go-mix-conn/internal/bridge/go_bridge/go_bridge.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/bridge/rust_bridge/rust_bridge.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/external/roundtrip_js.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/external/set.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/helpers/helpers.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/jstypes/async.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/jstypes/conv/request.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/jstypes/conv/response.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/jstypes/globals.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/jstypes/headers.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/jstypes/helpers.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/jstypes/request.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/jstypes/response.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/log/logger.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/mixfetch/helpers.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/mixfetch/mixfetch.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/sslhelpers/root_certs.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/sslhelpers/ssl_helper.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/state/fake_connection.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/state/state.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/types/options.go create mode 100644 wasm/mix-fetch/go-mix-conn/internal/types/types.go create mode 100644 wasm/mix-fetch/internal-dev/.gitignore create mode 100644 wasm/mix-fetch/internal-dev/bootstrap.js create mode 100644 wasm/mix-fetch/internal-dev/index.html create mode 100644 wasm/mix-fetch/internal-dev/index.js create mode 100644 wasm/mix-fetch/internal-dev/package.json create mode 100644 wasm/mix-fetch/internal-dev/webpack.config.js create mode 100644 wasm/mix-fetch/internal-dev/worker.js rename {clients/webassembly => wasm/mix-fetch}/internal-dev/yarn.lock (99%) create mode 100644 wasm/mix-fetch/src/active_requests.rs create mode 100644 wasm/mix-fetch/src/client.rs create mode 100644 wasm/mix-fetch/src/config.rs create mode 100644 wasm/mix-fetch/src/error.rs create mode 100644 wasm/mix-fetch/src/fetch.rs create mode 100644 wasm/mix-fetch/src/go_bridge.rs create mode 100644 wasm/mix-fetch/src/harbourmaster.rs create mode 100644 wasm/mix-fetch/src/helpers.rs create mode 100644 wasm/mix-fetch/src/lib.rs create mode 100644 wasm/mix-fetch/src/request_writer.rs create mode 100644 wasm/mix-fetch/src/socks_helpers.rs create mode 100644 wasm/node-tester/.cargo/config.toml create mode 100644 wasm/node-tester/Cargo.toml create mode 100644 wasm/node-tester/Makefile create mode 100644 wasm/node-tester/internal-dev/.gitignore create mode 100644 wasm/node-tester/internal-dev/bootstrap.js create mode 100644 wasm/node-tester/internal-dev/index.html create mode 100644 wasm/node-tester/internal-dev/index.js create mode 100644 wasm/node-tester/internal-dev/package.json create mode 100644 wasm/node-tester/internal-dev/webpack.config.js create mode 100644 wasm/node-tester/internal-dev/worker.js create mode 100644 wasm/node-tester/internal-dev/yarn-error.log create mode 100644 wasm/node-tester/internal-dev/yarn.lock rename {clients/webassembly/src/tester => wasm/node-tester/src}/ephemeral_receiver.rs (96%) create mode 100644 wasm/node-tester/src/error.rs rename {clients/webassembly/src/tester => wasm/node-tester/src}/helpers.rs (62%) create mode 100644 wasm/node-tester/src/lib.rs rename clients/webassembly/src/tester/mod.rs => wasm/node-tester/src/tester.rs (72%) create mode 100644 wasm/node-tester/src/types.rs diff --git a/.github/workflows/build-and-upload-binaries-ci.yml b/.github/workflows/build-and-upload-binaries-ci.yml index 57b897d9c2..26f3ccb588 100644 --- a/.github/workflows/build-and-upload-binaries-ci.yml +++ b/.github/workflows/build-and-upload-binaries-ci.yml @@ -83,7 +83,7 @@ jobs: run: cargo install --version 0.112.0 wasm-opt - name: Build release contracts - run: make wasm + run: make contracts-wasm - name: Prepare build output shell: bash diff --git a/.github/workflows/contracts-build.yml b/.github/workflows/contracts-build.yml index 8a0a5d4122..bc7a343cb4 100644 --- a/.github/workflows/contracts-build.yml +++ b/.github/workflows/contracts-build.yml @@ -23,7 +23,7 @@ jobs: run: cargo install --version 0.112.0 wasm-opt - name: Build release contracts - run: make wasm + run: make contracts-wasm - name: Upload Mixnet Contract Artifact uses: actions/upload-artifact@v3 diff --git a/.github/workflows/sdk-docs-typescript.yml b/.github/workflows/sdk-docs-typescript.yml index 2df60dcc0b..e6ed5161f1 100644 --- a/.github/workflows/sdk-docs-typescript.yml +++ b/.github/workflows/sdk-docs-typescript.yml @@ -4,9 +4,11 @@ on: push: paths: - "sdk/typescript/**" + - "wasm/**" pull_request: paths: - "sdk/typescript/**" + - "wasm/**" jobs: build: @@ -26,17 +28,39 @@ jobs: toolchain: stable - name: Setup yarn run: npm install -g yarn + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.20' + + - name: Build branch WASM packages + run: make sdk-wasm-build + - name: Install run: yarn + - name: Build + run: yarn docs:prod:build + - name: Deploy branch to CI www (docs) + continue-on-error: true + uses: easingthemes/ssh-deploy@main + env: + SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }} + ARGS: "-rltgoDzvO --delete" + SOURCE: "dist/ts/" + REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }} + REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }} + TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/sdk-ts-docs-${{ env.GITHUB_REF_SLUG }} + EXCLUDE: "/dist/, /node_modules/" - name: Matrix - Node Install run: npm install working-directory: .github/workflows/support-files - name: Matrix - Send Notification env: NYM_NOTIFICATION_KIND: ts-packages - NYM_PROJECT_NAME: "ts-packages" - NYM_CI_WWW_BASE: "${{ secrets.NYM_CI_WWW_BASE }}" - NYM_CI_WWW_LOCATION: "ts-${{ env.GITHUB_REF_SLUG }}" + NYM_PROJECT_NAME: "sdk-ts-docs" + NYM_CI_WWW_BASE: "${{ secrets.NYM_CI_WWW_BASE }}/docs/sdk/typescript" + NYM_CI_WWW_LOCATION: "sdk-ts-docs-${{ env.GITHUB_REF_SLUG }}" GIT_COMMIT_MESSAGE: "${{ github.event.head_commit.message }}" GIT_BRANCH: "${GITHUB_REF##*/}" IS_SUCCESS: "${{ job.status == 'success' }}" diff --git a/.github/workflows/typescript-lint.yml b/.github/workflows/typescript-lint.yml index a8318364a4..bed25154a6 100644 --- a/.github/workflows/typescript-lint.yml +++ b/.github/workflows/typescript-lint.yml @@ -25,27 +25,37 @@ jobs: runs-on: custom-runner-linux steps: - uses: actions/checkout@v2 - - name: Install rsync - run: sudo apt-get install rsync - continue-on-error: true - uses: rlespinasse/github-slug-action@v3.x + - uses: actions/setup-node@v3 with: node-version: 18 + - name: Setup yarn + run: npm install -g yarn + - name: Install Rust stable uses: actions-rs/toolchain@v1 with: toolchain: stable - name: Install wasm-pack run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - - name: Setup yarn - run: npm install -g yarn + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.20' + - name: Install run: yarn + - name: Build packages - run: yarn build + run: yarn build:ci:sdk + - name: Lint - run: yarn lint && yarn tsc + run: yarn lint + - name: Typecheck with tsc + run: yarn tsc + - name: Matrix - Node Install run: npm install working-directory: .github/workflows/support-files diff --git a/.github/workflows/wasm_client_build.yml b/.github/workflows/wasm_client_build.yml deleted file mode 100644 index e71120a346..0000000000 --- a/.github/workflows/wasm_client_build.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Wasm Client - -on: - pull_request: - paths: - - 'clients/webassembly/**' - - 'clients/client-core/**' - - 'common/**' - - 'contracts/**' - - 'gateway/gateway-requests/**' - - 'nym-api/nym-api-requests/**' - -jobs: - wasm: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v2 - - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - target: wasm32-unknown-unknown - override: true - components: rustfmt, clippy - - - uses: actions-rs/cargo@v1 - with: - command: build - args: --manifest-path clients/webassembly/Cargo.toml --target wasm32-unknown-unknown - - - uses: actions-rs/cargo@v1 - with: - command: fmt - args: --manifest-path clients/webassembly/Cargo.toml -- --check - - - uses: actions-rs/cargo@v1 - with: - command: clippy - args: --manifest-path clients/webassembly/Cargo.toml --target wasm32-unknown-unknown -- -D warnings diff --git a/.github/workflows/wasm_sdk.yml b/.github/workflows/wasm_sdk.yml new file mode 100644 index 0000000000..d3f5a2813b --- /dev/null +++ b/.github/workflows/wasm_sdk.yml @@ -0,0 +1,46 @@ +name: Wasm Client + +on: + pull_request: + paths: + - 'wasm/**' + - 'clients/client-core/**' + - 'common/**' + +jobs: + wasm: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + target: wasm32-unknown-unknown + override: true + components: rustfmt, clippy + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.20' + + + - name: Install wasm-pack + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + + - name: Install wasm-opt + run: cargo install wasm-opt + + - name: Install wasm-bindgen-cli + run: cargo install wasm-bindgen-cli + + - name: "Build" + run: make sdk-wasm-build + + - name: "Test" + run: make sdk-wasm-test + + - name: "Lint" + run: make sdk-wasm-lint diff --git a/.gitignore b/.gitignore index 21ea8966e7..aef1cee421 100644 --- a/.gitignore +++ b/.gitignore @@ -43,4 +43,6 @@ envs/qwerty.env .parcel-cache **/.DS_Store cpu-cycles/libcpucycles/build -foxyfox.env \ No newline at end of file +foxyfox.env + +.next \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 5e8ae04207..916cbf68bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1078,6 +1078,16 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" +[[package]] +name = "bytecodec" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adf4c9d0bbf32eea58d7c0f812058138ee8edaf0f2802b6d03561b504729a325" +dependencies = [ + "byteorder", + "trackable 0.2.24", +] + [[package]] name = "byteorder" version = "1.4.3" @@ -1113,6 +1123,69 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "camino" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-edit" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f769ab9e8c1652d78dd0b3ec59cdaa1e2bcb3b6b39f6681b256abcdbe101cc14" +dependencies = [ + "anyhow", + "cargo_metadata", + "clap 4.3.21", + "concolor-control", + "crates-index", + "dirs-next", + "dunce", + "env_proxy", + "git2", + "hex", + "indexmap 1.9.3", + "native-tls", + "pathdiff", + "regex", + "semver 1.0.18", + "serde", + "serde_derive", + "serde_json", + "subprocess", + "termcolor", + "toml_edit 0.16.2", + "ureq", + "url", +] + +[[package]] +name = "cargo-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.18", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cast" version = "0.3.0" @@ -1343,6 +1416,7 @@ dependencies = [ "clap_lex 0.5.0", "once_cell", "strsim", + "terminal_size", ] [[package]] @@ -1439,6 +1513,23 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "concolor-control" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7104119c2f80d887239879d0c50e033cd40eac9a3f3561e0684ba7d5d654f4da" +dependencies = [ + "atty", + "bitflags 1.3.2", + "concolor-query", +] + +[[package]] +name = "concolor-query" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad159cc964ac8f9d407cbc0aa44b02436c054b541f2b4b5f06972e1efdc54bc7" + [[package]] name = "concurrent-queue" version = "2.2.0" @@ -1498,6 +1589,16 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + [[package]] name = "const-oid" version = "0.9.5" @@ -1678,6 +1779,27 @@ dependencies = [ "libc", ] +[[package]] +name = "crates-index" +version = "0.18.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599f67b56f40863598cb30450427049935d05de2e36c61d33c050f04d7ec8cf2" +dependencies = [ + "git2", + "hex", + "home", + "memchr", + "num_cpus", + "rayon", + "rustc-hash", + "semver 1.0.18", + "serde", + "serde_derive", + "serde_json", + "smartstring", + "toml 0.5.11", +] + [[package]] name = "crc" version = "2.1.0" @@ -2419,6 +2541,16 @@ dependencies = [ "dirs-sys 0.4.1", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + [[package]] name = "dirs-sys" version = "0.3.7" @@ -2442,6 +2574,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "displaydoc" version = "0.2.4" @@ -2477,6 +2620,12 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65d09067bfacaa79114679b279d7f5885b53295b1e2cfb4e79c8e4bd3d633169" +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + [[package]] name = "dyn-clone" version = "1.0.12" @@ -2683,6 +2832,16 @@ dependencies = [ "regex", ] +[[package]] +name = "env_proxy" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a5019be18538406a43b5419a5501461f0c8b49ea7dfda0cfc32f4e51fc44be1" +dependencies = [ + "log", + "url", +] + [[package]] name = "ephemera" version = "0.1.0" @@ -2822,6 +2981,22 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "extension-storage" +version = "1.2.0-rc.2" +dependencies = [ + "bip39", + "console_error_panic_hook", + "js-sys", + "serde-wasm-bindgen", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-storage", + "wasm-utils", + "zeroize", +] + [[package]] name = "extension-traits" version = "1.0.1" @@ -3294,6 +3469,8 @@ dependencies = [ "libc", "libgit2-sys", "log", + "openssl-probe", + "openssl-sys", "url", ] @@ -3303,6 +3480,26 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "gloo-net" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9902a044653b26b99f7e3693a42f171312d9be8b26b5697bd1e43ad1f8a35e10" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "gloo-timers" version = "0.2.6" @@ -3315,6 +3512,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gloo-utils" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037fcb07216cb3a30f7292bd0176b050b7b9a052ba830ef7d5d65f6dc64ba58e" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "group" version = "0.10.0" @@ -3531,6 +3741,9 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] [[package]] name = "hex-literal" @@ -3594,6 +3807,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "hostname" version = "0.3.1" @@ -3633,6 +3855,16 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +[[package]] +name = "httpcodec" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f49d64351430cabd543943b79d48aaf0bc95a41d9ccf5b8774c2cfd23422775" +dependencies = [ + "bytecodec", + "trackable 0.2.24", +] + [[package]] name = "httpdate" version = "1.0.3" @@ -4111,9 +4343,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -4170,6 +4402,15 @@ dependencies = [ "libc", ] +[[package]] +name = "kstring" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3066350882a1cd6d950d055997f379ac37fd39f81cd4d8ed186032eb3c5747" +dependencies = [ + "static_assertions", +] + [[package]] name = "language-tags" version = "0.3.2" @@ -4250,7 +4491,9 @@ checksum = "51e5ea06c26926f1002dd553fded6cfcdc9784c1f60feeb58368b4d9b07b6dba" dependencies = [ "cc", "libc", + "libssh2-sys", "libz-sys", + "openssl-sys", "pkg-config", ] @@ -5041,6 +5284,20 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libssh2-sys" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", +] + [[package]] name = "libz-sys" version = "1.1.12" @@ -5300,6 +5557,29 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mix-fetch-wasm" +version = "1.2.0-rc.2" +dependencies = [ + "futures", + "js-sys", + "nym-ordered-buffer", + "nym-service-providers-common", + "nym-socks5-requests", + "rand 0.7.3", + "reqwest", + "serde", + "serde-wasm-bindgen", + "thiserror", + "tokio", + "tsify", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-client-core", + "wasm-utils", +] + [[package]] name = "multer" version = "2.1.0" @@ -5547,6 +5827,15 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nom8" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae01545c9c7fc4486ab7debaf2aad7003ac19431791868fb2e8066df97fad2f8" +dependencies = [ + "memchr", +] + [[package]] name = "notify" version = "5.2.0" @@ -5941,6 +6230,28 @@ dependencies = [ "zeroize", ] +[[package]] +name = "nym-client-wasm" +version = "1.2.0-rc.2" +dependencies = [ + "anyhow", + "futures", + "js-sys", + "nym-node-tester-utils", + "nym-node-tester-wasm", + "rand 0.7.3", + "serde", + "serde-wasm-bindgen", + "serde_json", + "thiserror", + "tsify", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test", + "wasm-client-core", + "wasm-utils", +] + [[package]] name = "nym-client-websocket-requests" version = "0.1.0" @@ -6220,6 +6531,7 @@ version = "0.1.0" dependencies = [ "futures", "getrandom 0.2.10", + "gloo-utils", "log", "nym-bandwidth-controller", "nym-coconut-interface", @@ -6277,6 +6589,21 @@ dependencies = [ "serde", ] +[[package]] +name = "nym-http-requests" +version = "0.1.0" +dependencies = [ + "bytecodec", + "bytes", + "http", + "httpcodec", + "nym-ordered-buffer", + "nym-service-providers-common", + "nym-socks5-requests", + "thiserror", + "url", +] + [[package]] name = "nym-inclusion-probability" version = "0.1.0" @@ -6520,6 +6847,26 @@ dependencies = [ "wasm-utils", ] +[[package]] +name = "nym-node-tester-wasm" +version = "1.2.0-rc.2" +dependencies = [ + "futures", + "js-sys", + "nym-node-tester-utils", + "rand 0.7.3", + "serde", + "serde-wasm-bindgen", + "thiserror", + "tokio", + "tsify", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-client-core", + "wasm-utils", + "wasmtimer", +] + [[package]] name = "nym-nonexhaustive-delayqueue" version = "0.1.0" @@ -6587,9 +6934,13 @@ dependencies = [ "anyhow", "async-trait", "bip39", + "bytecodec", + "bytes", "dotenvy", "futures", "hex", + "http", + "httpcodec", "libp2p 0.51.0", "log", "nym-bandwidth-controller", @@ -6601,7 +6952,10 @@ dependencies = [ "nym-crypto", "nym-gateway-requests", "nym-network-defaults", + "nym-ordered-buffer", + "nym-service-providers-common", "nym-socks5-client-core", + "nym-socks5-requests", "nym-sphinx", "nym-task", "nym-topology", @@ -6967,6 +7321,7 @@ dependencies = [ "nym-sphinx-routing", "nym-sphinx-types", "rand 0.7.3", + "semver 0.11.0", "thiserror", ] @@ -7077,6 +7432,15 @@ dependencies = [ "ts-rs", ] +[[package]] +name = "nym-wasm-sdk" +version = "1.2.0-rc.2" +dependencies = [ + "mix-fetch-wasm", + "nym-client-wasm", + "nym-node-tester-wasm", +] + [[package]] name = "object" version = "0.31.1" @@ -8831,6 +9195,18 @@ dependencies = [ "webpki 0.22.0", ] +[[package]] +name = "rustls" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.4", + "sct 0.7.0", +] + [[package]] name = "rustls-native-certs" version = "0.5.0" @@ -8852,6 +9228,26 @@ dependencies = [ "base64 0.21.2", ] +[[package]] +name = "rustls-webpki" +version = "0.100.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e98ff011474fa39949b7e5c0428f9b4937eda7da7848bbb947786b7be0b27dab" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -8954,7 +9350,7 @@ checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", - "serde_derive_internals", + "serde_derive_internals 0.26.0", "syn 1.0.109", ] @@ -8990,6 +9386,18 @@ dependencies = [ "untrusted", ] +[[package]] +name = "sdk-version-bump" +version = "0.1.0" +dependencies = [ + "anyhow", + "cargo-edit", + "clap 4.3.21", + "semver 1.0.18", + "serde", + "serde_json", +] + [[package]] name = "sdp" version = "0.5.3" @@ -9076,6 +9484,9 @@ name = "semver" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +dependencies = [ + "serde", +] [[package]] name = "semver-parser" @@ -9161,6 +9572,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "serde_derive_internals" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e578a843d40b4189a4d66bba51d7684f57da5bd7c304c64e14bd63efbef49509" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.28", +] + [[package]] name = "serde_json" version = "1.0.104" @@ -9369,6 +9791,18 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +[[package]] +name = "smartstring" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" +dependencies = [ + "autocfg 1.1.0", + "serde", + "static_assertions", + "version_check", +] + [[package]] name = "snafu" version = "0.7.5" @@ -9428,6 +9862,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "socks" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" +dependencies = [ + "byteorder", + "libc", + "winapi", +] + [[package]] name = "soketto" version = "0.7.1" @@ -9698,6 +10143,16 @@ dependencies = [ "tokio-rustls 0.23.4", ] +[[package]] +name = "ssl-inject" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap 4.3.21", + "hex", + "tokio", +] + [[package]] name = "stable-pattern" version = "0.1.0" @@ -9798,6 +10253,16 @@ dependencies = [ "webrtc-util", ] +[[package]] +name = "subprocess" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2e86926081dda636c546d8c5e641661049d7562a68f5488be4a1f7f66f6086" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "substring" version = "1.4.5" @@ -10036,6 +10501,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "terminal_size" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e6bf6f19e9f8ed8d4048dc22981458ebcf406d67e94cd422e5ecd73d63b3237" +dependencies = [ + "rustix 0.37.23", + "windows-sys 0.48.0", +] + [[package]] name = "textwrap" version = "0.16.0" @@ -10341,8 +10816,17 @@ checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" dependencies = [ "serde", "serde_spanned", - "toml_datetime", - "toml_edit", + "toml_datetime 0.6.3", + "toml_edit 0.19.14", +] + +[[package]] +name = "toml_datetime" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" +dependencies = [ + "serde", ] [[package]] @@ -10354,6 +10838,20 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_edit" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd30deba9a1cd7153c22aecf93e86df639e7b81c622b0af8d9255e989991a7b7" +dependencies = [ + "indexmap 1.9.3", + "itertools", + "kstring", + "nom8", + "serde", + "toml_datetime 0.5.1", +] + [[package]] name = "toml_edit" version = "0.19.14" @@ -10363,7 +10861,7 @@ dependencies = [ "indexmap 2.0.0", "serde", "serde_spanned", - "toml_datetime", + "toml_datetime 0.6.3", "winnow", ] @@ -10527,6 +11025,35 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "trackable" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98abb9e7300b9ac902cc04920945a874c1973e08c310627cc4458c04b70dd32" +dependencies = [ + "trackable 1.3.0", + "trackable_derive", +] + +[[package]] +name = "trackable" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15bd114abb99ef8cee977e517c8f37aee63f184f2d08e3e6ceca092373369ae" +dependencies = [ + "trackable_derive", +] + +[[package]] +name = "trackable_derive" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebeb235c5847e2f82cfe0f07eb971d1e5f6804b18dac2ae16349cc604380f82f" +dependencies = [ + "quote", + "syn 1.0.109", +] + [[package]] name = "trust-dns-proto" version = "0.22.0" @@ -10617,6 +11144,32 @@ dependencies = [ "termcolor", ] +[[package]] +name = "tsify" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b26cf145f2f3b9ff84e182c448eaf05468e247f148cf3d2a7d67d78ff023a0" +dependencies = [ + "gloo-utils", + "serde", + "serde-wasm-bindgen", + "serde_json", + "tsify-macros", + "wasm-bindgen", +] + +[[package]] +name = "tsify-macros" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a94b0f0954b3e59bfc2c246b4c8574390d94a4ad4ad246aaf2fb07d7dfd3b47" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals 0.28.0", + "syn 2.0.28", +] + [[package]] name = "tungstenite" version = "0.13.0" @@ -10852,6 +11405,25 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0976c77def3f1f75c4ef892a292c31c0bbe9e3d0702c63044d7c76db298171a3" +[[package]] +name = "ureq" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b11c96ac7ee530603dcdf68ed1557050f374ce55a5a07193ebf8cbc9f8927e9" +dependencies = [ + "base64 0.21.2", + "log", + "native-tls", + "once_cell", + "rustls 0.21.7", + "rustls-webpki 0.100.2", + "serde", + "serde_json", + "socks", + "url", + "webpki-roots 0.23.1", +] + [[package]] name = "url" version = "2.4.0" @@ -11036,9 +11608,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -11046,24 +11618,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.28", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.33" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -11073,9 +11645,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -11083,22 +11655,93 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.28", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e6e302a7ea94f83a6d09e78e7dc7d9ca7b186bc2829c24a22d0753efd680671" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecb993dd8c836930ed130e020e77d9b2e65dd0fbab1b67c790b0f5d80b11a575" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "wasm-client-core" +version = "0.1.0" +dependencies = [ + "async-trait", + "console_error_panic_hook", + "js-sys", + "nym-bandwidth-controller", + "nym-client-core", + "nym-config", + "nym-credential-storage", + "nym-crypto", + "nym-gateway-client", + "nym-sphinx", + "nym-sphinx-acknowledgements", + "nym-task", + "nym-topology", + "nym-validator-client", + "rand 0.7.3", + "serde", + "serde-wasm-bindgen", + "thiserror", + "tsify", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-storage", + "wasm-utils", + "zeroize", +] + +[[package]] +name = "wasm-storage" +version = "0.1.0" +dependencies = [ + "async-trait", + "futures", + "indexed_db_futures", + "js-sys", + "nym-store-cipher", + "serde", + "serde-wasm-bindgen", + "thiserror", + "wasm-bindgen", + "wasm-utils", +] [[package]] name = "wasm-timer" @@ -11121,12 +11764,9 @@ version = "0.1.0" dependencies = [ "futures", "getrandom 0.2.10", - "indexed_db_futures", + "gloo-net", + "gloo-utils", "js-sys", - "nym-store-cipher", - "serde", - "serde-wasm-bindgen", - "thiserror", "tungstenite 0.13.0", "wasm-bindgen", "wasm-bindgen-futures", @@ -11149,9 +11789,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -11195,6 +11835,15 @@ dependencies = [ "webpki 0.22.0", ] +[[package]] +name = "webpki-roots" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" +dependencies = [ + "rustls-webpki 0.100.2", +] + [[package]] name = "webrtc" version = "0.6.0" diff --git a/Cargo.toml b/Cargo.toml index a1634e02d2..40800e47d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,6 +46,7 @@ members = [ "common/crypto", "common/dkg", "common/execute", + "common/http-requests", "common/inclusion-probability", "common/ledger", "common/mixnode-common", @@ -73,7 +74,9 @@ members = [ "common/task", "common/topology", "common/types", - "common/wasm-utils", + "common/wasm/client-core", + "common/wasm/storage", + "common/wasm/utils", "explorer-api", "explorer-api/explorer-api-requests", "explorer-api/explorer-client", @@ -87,11 +90,18 @@ members = [ "service-providers/network-requester", "service-providers/network-statistics", "nym-api", + "nym-browser-extension/storage", "nym-api/nym-api-requests", "nym-outfox", + "tools/internal/ssl-inject", + "tools/internal/sdk-version-bump", "tools/nym-cli", "tools/nym-nr-query", - "tools/ts-rs-cli" + "tools/ts-rs-cli", + "wasm/client", + "wasm/full-nym-wasm", + "wasm/mix-fetch", + "wasm/node-tester", ] default-members = [ @@ -105,7 +115,7 @@ default-members = [ "explorer-api", ] -exclude = ["explorer", "contracts", "clients/webassembly", "nym-wallet", "nym-connect/mobile/src-tauri", "nym-connect/desktop", "nym-browser-extension/storage", "cpu-cycles"] +exclude = ["explorer", "contracts", "nym-wallet", "nym-connect/mobile/src-tauri", "nym-connect/desktop", "cpu-cycles"] [workspace.package] authors = ["Nym Technologies SA"] @@ -117,7 +127,7 @@ license = "Apache-2.0" [workspace.dependencies] anyhow = "1.0.71" -async-trait = "0.1.64" +async-trait = "0.1.68" bip39 = { version = "2.0.0", features = ["zeroize"] } cfg-if = "1.0.0" cosmwasm-derive = "=1.3.0" @@ -156,4 +166,11 @@ url = "2.4" zeroize = "1.6.0" # wasm-related dependencies +gloo-utils = "0.1.6" +js-sys = "0.3.63" +serde-wasm-bindgen = "0.5.0" +tsify = "0.4.5" +wasm-bindgen = "0.2.86" +wasm-bindgen-futures = "0.4.37" wasmtimer = "0.2.0" +web-sys = "0.3.63" diff --git a/Makefile b/Makefile index 6fc92e55f8..c74994904e 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,21 @@ # Default target all: test -test: clippy-all cargo-test wasm fmt +test: clippy-all cargo-test contracts-wasm sdk-wasm-test fmt test-all: test cargo-test-expensive -no-clippy: build cargo-test wasm fmt +no-clippy: build cargo-test contracts-wasm fmt fmt-browser-extension-storage happy: fmt clippy-happy test +build: sdk-wasm-build build-browser-extension-storage + # Building release binaries is a little manual as we can't just build --release # on all workspaces. -build-release: build-release-main wasm +build-release: build-release-main contracts-wasm + +clippy: sdk-wasm-lint clippy-browser-extension-storage # Deprecated # For backwards compatibility @@ -43,6 +47,9 @@ test-$(1): test-expensive-$(1): cargo test --manifest-path $(2)/Cargo.toml --workspace -- --ignored +build-standalone-$(1): + cargo build --manifest-path $(2)/Cargo.toml $(3) + build-$(1): cargo build --manifest-path $(2)/Cargo.toml --workspace $(3) @@ -74,7 +81,7 @@ endef $(eval $(call add_cargo_workspace,main,.)) $(eval $(call add_cargo_workspace,contracts,contracts,--lib --target wasm32-unknown-unknown)) -$(eval $(call add_cargo_workspace,wasm-client,clients/webassembly,--target wasm32-unknown-unknown)) +#$(eval $(call add_cargo_workspace,wasm-client,clients/webassembly,--target wasm32-unknown-unknown)) $(eval $(call add_cargo_workspace,wallet,nym-wallet,)) $(eval $(call add_cargo_workspace,connect,nym-connect/desktop)) @@ -88,6 +95,67 @@ build-explorer-api: build-nym-cli: cargo build -p nym-cli --release +build-browser-extension-storage: + cargo build -p extension-storage --target wasm32-unknown-unknown + +fmt-browser-extension-storage: + cargo fmt -p extension-storage -- --check + +clippy-browser-extension-storage: + cargo clippy -p extension-storage --target wasm32-unknown-unknown -- -Dwarnings + +sdk-wasm: sdk-wasm-build sdk-wasm-test sdk-wasm-lint + +sdk-wasm-build: + # browser storage + $(MAKE) -C nym-browser-extension/storage wasm-pack + + # client + $(MAKE) -C wasm/client build + + # node-tester + $(MAKE) -C wasm/node-tester build + + # mix-fetch + $(MAKE) -C wasm/mix-fetch build + + # full + $(MAKE) -C wasm/full-nym-wasm build-full + +# run this from npm/yarn to ensure tools are in the path, e.g. yarn build:sdk from root of repo +sdk-typescript-build: + lerna run --scope @nymproject/sdk build --stream + lerna run --scope @nymproject/mix-fetch build --stream + lerna run --scope @nymproject/node-tester build --stream + +sdk-wasm-test: +# # client +# cargo test -p nym-client-wasm --target wasm32-unknown-unknown +# +# # node-tester +# cargo test -p nym-node-tester-wasm --target wasm32-unknown-unknown +# +# # mix-fetch +# #cargo test -p nym-wasm-sdk --target wasm32-unknown-unknown +# +# # full +# cargo test -p nym-wasm-sdk --target wasm32-unknown-unknown + + +sdk-wasm-lint: + # client + cargo clippy -p nym-client-wasm --target wasm32-unknown-unknown -- -Dwarnings + + # node-tester + cargo clippy -p nym-node-tester-wasm --target wasm32-unknown-unknown -- -Dwarnings + + # mix-fetch + $(MAKE) -C wasm/mix-fetch check-fmt + + # full + cargo clippy -p nym-wasm-sdk --target wasm32-unknown-unknown -- -Dwarnings + + # ----------------------------------------------------------------------------- # Build contracts ready for deploy # ----------------------------------------------------------------------------- @@ -98,12 +166,12 @@ MIXNET_CONTRACT=$(CONTRACTS_OUT_DIR)/mixnet_contract.wasm SERVICE_PROVIDER_DIRECTORY_CONTRACT=$(CONTRACTS_OUT_DIR)/nym_service_provider_directory.wasm NAME_SERVICE_CONTRACT=$(CONTRACTS_OUT_DIR)/nym_name_service.wasm -wasm: wasm-build wasm-opt +contracts-wasm: contracts-wasm-build contracts-wasm-opt -wasm-build: +contracts-wasm-build: RUSTFLAGS='-C link-arg=-s' cargo build --lib --manifest-path contracts/Cargo.toml --release --target wasm32-unknown-unknown -wasm-opt: +contracts-wasm-opt: wasm-opt --disable-sign-ext -Os $(VESTING_CONTRACT) -o $(VESTING_CONTRACT) wasm-opt --disable-sign-ext -Os $(MIXNET_CONTRACT) -o $(MIXNET_CONTRACT) wasm-opt --disable-sign-ext -Os $(SERVICE_PROVIDER_DIRECTORY_CONTRACT) -o $(SERVICE_PROVIDER_DIRECTORY_CONTRACT) @@ -117,7 +185,7 @@ contract-schema: # ----------------------------------------------------------------------------- # NOTE: this seems deprecated an not needed anymore? -mixnet-opt: wasm +mixnet-opt: contracts-wasm cd contracts/mixnet && make opt generate-typescript: diff --git a/clients/webassembly/.appveyor.yml b/clients/webassembly/.appveyor.yml deleted file mode 100644 index 50910bd6f3..0000000000 --- a/clients/webassembly/.appveyor.yml +++ /dev/null @@ -1,11 +0,0 @@ -install: - - appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe - - if not defined RUSTFLAGS rustup-init.exe -y --default-host x86_64-pc-windows-msvc --default-toolchain nightly - - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin - - rustc -V - - cargo -V - -build: false - -test_script: - - cargo test --locked diff --git a/clients/webassembly/.cargo-ok b/clients/webassembly/.cargo-ok deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/clients/webassembly/.cargo/config.toml b/clients/webassembly/.cargo/config.toml deleted file mode 100644 index 435ed755ec..0000000000 --- a/clients/webassembly/.cargo/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -[build] -target = "wasm32-unknown-unknown" \ No newline at end of file diff --git a/clients/webassembly/.gitignore b/clients/webassembly/.gitignore deleted file mode 100644 index 5b7187cad5..0000000000 --- a/clients/webassembly/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/target -**/*.rs.bk -bin/ -pkg/ -wasm-pack.log -node_modules \ No newline at end of file diff --git a/clients/webassembly/.travis.yml b/clients/webassembly/.travis.yml deleted file mode 100644 index 7a913256e8..0000000000 --- a/clients/webassembly/.travis.yml +++ /dev/null @@ -1,69 +0,0 @@ -language: rust -sudo: false - -cache: cargo - -matrix: - include: - - # Builds with wasm-pack. - - rust: beta - env: RUST_BACKTRACE=1 - addons: - firefox: latest - chrome: stable - before_script: - - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) - - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) - - cargo install-update -a - - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f - script: - - cargo generate --git . --name testing - # Having a broken Cargo.toml (in that it has curlies in fields) anywhere - # in any of our parent dirs is problematic. - - mv Cargo.toml Cargo.toml.tmpl - - cd testing - - wasm-pack build - - wasm-pack test --chrome --firefox --headless - - # Builds on nightly. - - rust: nightly - env: RUST_BACKTRACE=1 - before_script: - - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) - - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) - - cargo install-update -a - - rustup target add wasm32-unknown-unknown - script: - - cargo generate --git . --name testing - - mv Cargo.toml Cargo.toml.tmpl - - cd testing - - cargo check - - cargo check --target wasm32-unknown-unknown - - cargo check --no-default-features - - cargo check --target wasm32-unknown-unknown --no-default-features - - cargo check --no-default-features --features console_error_panic_hook - - cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook - - cargo check --no-default-features --features "console_error_panic_hook wee_alloc" - - cargo check --target wasm32-unknown-unknown --no-default-features --features "console_error_panic_hook wee_alloc" - - # Builds on beta. - - rust: beta - env: RUST_BACKTRACE=1 - before_script: - - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) - - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) - - cargo install-update -a - - rustup target add wasm32-unknown-unknown - script: - - cargo generate --git . --name testing - - mv Cargo.toml Cargo.toml.tmpl - - cd testing - - cargo check - - cargo check --target wasm32-unknown-unknown - - cargo check --no-default-features - - cargo check --target wasm32-unknown-unknown --no-default-features - - cargo check --no-default-features --features console_error_panic_hook - - cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook - # Note: no enabling the `wee_alloc` feature here because it requires - # nightly for now. diff --git a/clients/webassembly/Cargo.lock b/clients/webassembly/Cargo.lock deleted file mode 100644 index e39f1ef98c..0000000000 --- a/clients/webassembly/Cargo.lock +++ /dev/null @@ -1,5559 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array 0.14.7", -] - -[[package]] -name = "aes" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" -dependencies = [ - "cfg-if 1.0.0", - "cipher 0.3.0", - "cpufeatures", - "ctr 0.8.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aes" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" -dependencies = [ - "cfg-if 1.0.0", - "cipher 0.4.4", - "cpufeatures", -] - -[[package]] -name = "aes-gcm" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209b47e8954a928e1d72e86eca7000ebb6655fe1436d33eefc2201cad027e237" -dependencies = [ - "aead", - "aes 0.8.3", - "cipher 0.4.4", - "ctr 0.9.2", - "ghash", - "subtle 2.4.1", -] - -[[package]] -name = "ahash" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" -dependencies = [ - "getrandom 0.2.10", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" -dependencies = [ - "cfg-if 1.0.0", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8f9420f797f2d9e935edf629310eb938a0d839f984e25327f3c7eed22300c" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - -[[package]] -name = "anstream" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is-terminal", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" - -[[package]] -name = "anstyle-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "anyhow" -version = "1.0.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" - -[[package]] -name = "argon2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e554a8638bdc1e4eae9984845306cc95f8a9208ba8d49c3859fd958b46774d" -dependencies = [ - "base64ct", - "blake2 0.10.6", - "cpufeatures", - "password-hash", -] - -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "async-trait" -version = "0.1.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "atoi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5" -dependencies = [ - "num-traits", -] - -[[package]] -name = "atoi" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" -dependencies = [ - "num-traits", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" -dependencies = [ - "addr2line", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bip32" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e141fb0f8be1c7b45887af94c88b182472b57c96b56773250ae00cd6a14a164" -dependencies = [ - "bs58 0.5.0", - "hmac 0.12.1", - "k256 0.13.1", - "once_cell", - "pbkdf2", - "rand_core 0.6.4", - "ripemd", - "sha2 0.10.7", - "subtle 2.4.1", - "zeroize", -] - -[[package]] -name = "bip39" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" -dependencies = [ - "bitcoin_hashes", - "rand 0.8.5", - "rand_core 0.6.4", - "serde", - "unicode-normalization", - "zeroize", -] - -[[package]] -name = "bitcoin_hashes" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" -dependencies = [ - "byte-tools", - "crypto-mac 0.7.0", - "digest 0.8.1", - "opaque-debug 0.2.3", -] - -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "blake3" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "199c42ab6972d92c9f8995f086273d25c42fc0f7b2a1fcefba465c1352d25ba5" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if 1.0.0", - "constant_time_eq", - "digest 0.10.7", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "bls12_381" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54757888b09a69be70b5ec303e382a74227392086ba808cb01eeca29233a2397" -dependencies = [ - "digest 0.9.0", - "ff 0.10.1", - "group 0.10.0", - "pairing 0.20.0", - "rand_core 0.6.4", - "subtle 2.4.1", -] - -[[package]] -name = "bls12_381" -version = "0.6.0" -source = "git+https://github.com/jstuczyn/bls12_381?branch=gt-serialisation#10fb6f700bfda17c8475af3bfd31e3fec15f2278" -dependencies = [ - "digest 0.9.0", - "ff 0.11.1", - "group 0.11.0", - "pairing 0.21.0", - "rand_core 0.6.4", - "subtle 2.4.1", - "zeroize", -] - -[[package]] -name = "bnum" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845141a4fade3f790628b7daaaa298a25b204fb28907eb54febe5142db6ce653" - -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" - -[[package]] -name = "bs58" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" -dependencies = [ - "sha2 0.10.7", -] - -[[package]] -name = "bumpalo" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" -dependencies = [ - "serde", -] - -[[package]] -name = "cc" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" -dependencies = [ - "jobserver", - "libc", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf3c081b5fba1e5615640aae998e0fbd10c24cbd897ee39ed754a77601a4862" -dependencies = [ - "byteorder", - "keystream", -] - -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" -dependencies = [ - "cfg-if 1.0.0", - "cipher 0.4.4", - "cpufeatures", -] - -[[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" -dependencies = [ - "aead", - "chacha20", - "cipher 0.4.4", - "poly1305", - "zeroize", -] - -[[package]] -name = "cipher" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", - "zeroize", -] - -[[package]] -name = "clap" -version = "4.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c27cdf28c0f604ba3f512b0c9a409f8de8513e4816705deb0498b627e7c3a3fd" -dependencies = [ - "clap_builder", - "clap_derive", - "once_cell", -] - -[[package]] -name = "clap_builder" -version = "4.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a9f1ab5e9f01a9b81f202e8562eb9a10de70abf9eaeac1be465c28b75aa4aa" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_complete" -version = "4.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc443334c81a804575546c5a8a79b4913b50e28d69232903604cada1de817ce" -dependencies = [ - "clap", -] - -[[package]] -name = "clap_complete_fig" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fee1d30a51305a6c2ed3fc5709be3c8af626c9c958e04dd9ae94e27bcbce9f" -dependencies = [ - "clap", - "clap_complete", -] - -[[package]] -name = "clap_derive" -version = "4.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "clap_lex" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "colored" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" -dependencies = [ - "is-terminal", - "lazy_static", - "windows-sys", -] - -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen", -] - -[[package]] -name = "const-oid" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" - -[[package]] -name = "constant_time_eq" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" - -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "cosmos-sdk-proto" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73c9d2043a9e617b0d602fbc0a0ecd621568edbf3a9774890a6d562389bd8e1c" -dependencies = [ - "prost", - "prost-types", - "tendermint-proto", -] - -[[package]] -name = "cosmrs" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af13955d6f356272e6def9ff5e2450a7650df536d8934f47052a20c76513d2f6" -dependencies = [ - "bip32", - "cosmos-sdk-proto", - "ecdsa 0.16.8", - "eyre", - "getrandom 0.2.10", - "k256 0.13.1", - "rand_core 0.6.4", - "serde", - "serde_json", - "subtle-encoding", - "tendermint", - "tendermint-rpc", - "thiserror", -] - -[[package]] -name = "cosmwasm-crypto" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e272708a9745dad8b591ef8a718571512130f2b39b33e3d7a27c558e3069394" -dependencies = [ - "digest 0.10.7", - "ed25519-zebra", - "k256 0.11.6", - "rand_core 0.6.4", - "thiserror", -] - -[[package]] -name = "cosmwasm-derive" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "296db6a3caca5283425ae0cf347f4e46999ba3f6620dbea8939a0e00347831ce" -dependencies = [ - "syn 1.0.109", -] - -[[package]] -name = "cosmwasm-schema" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6b2fb76758ef59cddc77f2e2ae91c22f77da49037e9f182e9c2833f0e959b1" -dependencies = [ - "cosmwasm-schema-derive", - "schemars", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cosmwasm-schema-derive" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bfa39422f0d9f1c9a6fd3711573258495314dfa3aae738ea825ecd9964bc659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "cosmwasm-std" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f6dc2ee23313add5ecacc3ccac217b9967ad9d2d11bd56e5da6aa65a9da6138" -dependencies = [ - "base64 0.13.1", - "bnum", - "cosmwasm-crypto", - "cosmwasm-derive", - "derivative", - "forward_ref", - "hex", - "schemars", - "serde", - "serde-json-wasm", - "sha2 0.10.7", - "thiserror", -] - -[[package]] -name = "cpufeatures" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" -dependencies = [ - "crc-catalog 1.1.1", -] - -[[package]] -name = "crc" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" -dependencies = [ - "crc-catalog 2.2.0", -] - -[[package]] -name = "crc-catalog" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" - -[[package]] -name = "crc-catalog" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" -dependencies = [ - "autocfg", - "cfg-if 1.0.0", - "crossbeam-utils", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "subtle 2.4.1", - "zeroize", -] - -[[package]] -name = "crypto-bigint" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "subtle 2.4.1", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "crypto-mac" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" -dependencies = [ - "generic-array 0.12.4", - "subtle 1.0.0", -] - -[[package]] -name = "crypto-mac" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" -dependencies = [ - "generic-array 0.14.7", - "subtle 2.4.1", -] - -[[package]] -name = "ct-logs" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" -dependencies = [ - "sct 0.6.1", -] - -[[package]] -name = "ctr" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" -dependencies = [ - "cipher 0.3.0", -] - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher 0.4.4", -] - -[[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "serde", - "subtle 2.4.1", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-ng" -version = "4.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.6.4", - "subtle-ng", - "zeroize", -] - -[[package]] -name = "cw-controllers" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d8edce4b78785f36413f67387e4be7d0cb7d032b5d4164bcc024f9c3f3f2ea" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "cw-utils", - "schemars", - "serde", - "thiserror", -] - -[[package]] -name = "cw-storage-plus" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f0e92a069d62067f3472c62e30adedb4cab1754725c0f2a682b3128d2bf3c79" -dependencies = [ - "cosmwasm-std", - "schemars", - "serde", -] - -[[package]] -name = "cw-utils" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c80e93d1deccb8588db03945016a292c3c631e6325d349ebb35d2db6f4f946f7" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw2", - "schemars", - "semver 1.0.18", - "serde", - "thiserror", -] - -[[package]] -name = "cw2" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ac2dc7a55ad64173ca1e0a46697c31b7a5c51342f55a1e84a724da4eb99908" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "schemars", - "serde", - "thiserror", -] - -[[package]] -name = "cw20" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "011c45920f8200bd5d32d4fe52502506f64f2f75651ab408054d4cfc75ca3a9b" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils", - "schemars", - "serde", -] - -[[package]] -name = "cw3" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171af3d9127de6805a7dd819fb070c7d2f6c3ea85f4193f42cef259f0a7f33d5" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils", - "cw20", - "schemars", - "serde", - "thiserror", -] - -[[package]] -name = "cw4" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a398696307efadaaa2d0850076f865fa706c959d493cb4203314f72be6b77a64" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "schemars", - "serde", -] - -[[package]] -name = "dashmap" -version = "5.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6943ae99c34386c84a470c499d3414f66502a41340aa895406e0d2e4a207b91d" -dependencies = [ - "cfg-if 1.0.0", - "hashbrown 0.14.0", - "lock_api", - "once_cell", - "parking_lot_core 0.9.8", -] - -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "der" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7684a49fb1af197853ef7b2ee694bc1f5b4179556f1e5710e1760c5db6f5e929" - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle 2.4.1", -] - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys 0.3.7", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys 0.4.1", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys", -] - -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dyn-clone" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" - -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - -[[package]] -name = "ecdsa" -version = "0.16.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" -dependencies = [ - "der 0.7.8", - "digest 0.10.7", - "elliptic-curve 0.13.5", - "rfc6979 0.4.0", - "signature 2.1.0", - "spki 0.7.2", -] - -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "serde", - "signature 1.6.4", -] - -[[package]] -name = "ed25519" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60f6d271ca33075c88028be6f04d502853d63a5ece419d269c15315d4fc1cf1d" -dependencies = [ - "pkcs8 0.10.2", - "signature 2.1.0", -] - -[[package]] -name = "ed25519-consensus" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" -dependencies = [ - "curve25519-dalek-ng", - "hex", - "rand_core 0.6.4", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek", - "ed25519 1.5.3", - "rand 0.7.3", - "serde", - "serde_bytes", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "ed25519-zebra" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" -dependencies = [ - "curve25519-dalek", - "hashbrown 0.12.3", - "hex", - "rand_core 0.6.4", - "serde", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.7", - "ff 0.12.1", - "generic-array 0.14.7", - "group 0.12.1", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle 2.4.1", - "zeroize", -] - -[[package]] -name = "elliptic-curve" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" -dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.2", - "digest 0.10.7", - "ff 0.13.0", - "generic-array 0.14.7", - "group 0.13.0", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sec1 0.7.3", - "subtle 2.4.1", - "zeroize", -] - -[[package]] -name = "encoding_rs" -version = "0.8.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "enum-iterator" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a0ac4aeb3a18f92eaf09c6bb9b3ac30ff61ca95514fc58cbead1c9a6bf5401" -dependencies = [ - "enum-iterator-derive", -] - -[[package]] -name = "enum-iterator-derive" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime 1.3.0", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "eyre" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" - -[[package]] -name = "ff" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f40b2dcd8bc322217a5f6559ae5f9e9d1de202a2ecee2e9eafcbece7562a4f" -dependencies = [ - "rand_core 0.6.4", - "subtle 2.4.1", -] - -[[package]] -name = "ff" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "131655483be284720a17d74ff97592b8e76576dc25563148601df2d7c9080924" -dependencies = [ - "rand_core 0.6.4", - "subtle 2.4.1", -] - -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle 2.4.1", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", - "subtle 2.4.1", -] - -[[package]] -name = "flate2" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "flex-error" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" -dependencies = [ - "eyre", - "paste", -] - -[[package]] -name = "flume" -version = "0.10.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" -dependencies = [ - "futures-core", - "futures-sink", - "pin-project", - "spin 0.9.8", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "forward_ref" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604f7a68fbf8103337523b1fadc8ade7361ee3f112f7c680ad179651616aed5" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot 0.11.2", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "serde", - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getset" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45727250e75cc04ff2846a66397da8ef2b3db8e40e0cef4df67950a07621eb9" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ghash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" -dependencies = [ - "opaque-debug 0.3.0", - "polyval", -] - -[[package]] -name = "gimli" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" - -[[package]] -name = "git2" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0155506aab710a86160ddb504a480d2964d7ab5b9e62419be69e0032bc5931c" -dependencies = [ - "bitflags 1.3.2", - "libc", - "libgit2-sys", - "log", - "url", -] - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "group" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" -dependencies = [ - "byteorder", - "ff 0.10.1", - "rand_core 0.6.4", - "subtle 2.4.1", -] - -[[package]] -name = "group" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5ac374b108929de78460075f3dc439fa66df9d8fc77e8f12caa5165fcf0c89" -dependencies = [ - "byteorder", - "ff 0.11.1", - "rand_core 0.6.4", - "subtle 2.4.1", -] - -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle 2.4.1", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff 0.13.0", - "rand_core 0.6.4", - "subtle 2.4.1", -] - -[[package]] -name = "h2" -version = "0.3.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 1.9.3", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "handlebars" -version = "3.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4498fc115fa7d34de968184e473529abb40eeb6be8bc5f7faba3d08c316cb3e3" -dependencies = [ - "log", - "pest", - "pest_derive", - "quick-error 2.0.1", - "serde", - "serde_json", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash 0.7.6", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.6", -] - -[[package]] -name = "hashbrown" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" -dependencies = [ - "ahash 0.8.3", - "allocator-api2", -] - -[[package]] -name = "hashlink" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" -dependencies = [ - "hashbrown 0.11.2", -] - -[[package]] -name = "hashlink" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f" -dependencies = [ - "hashbrown 0.14.0", -] - -[[package]] -name = "headers" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" -dependencies = [ - "base64 0.13.1", - "bitflags 1.3.2", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha1", -] - -[[package]] -name = "headers-core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" -dependencies = [ - "http", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-literal" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" - -[[package]] -name = "hkdf" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01706d578d5c281058480e673ae4086a9f4710d8df1ad80a5b03e39ece5f886b" -dependencies = [ - "digest 0.9.0", - "hmac 0.11.0", -] - -[[package]] -name = "hkdf" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" -dependencies = [ - "hmac 0.12.1", -] - -[[package]] -name = "hmac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" -dependencies = [ - "crypto-mac 0.11.1", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error 1.2.3", -] - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "humantime-serde" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" -dependencies = [ - "humantime 2.1.0", - "serde", -] - -[[package]] -name = "hyper" -version = "0.14.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.4.9", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-proxy" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" -dependencies = [ - "bytes", - "futures", - "headers", - "http", - "hyper", - "hyper-rustls", - "rustls-native-certs", - "tokio", - "tokio-rustls 0.22.0", - "tower-service", - "webpki 0.21.4", -] - -[[package]] -name = "hyper-rustls" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" -dependencies = [ - "ct-logs", - "futures-util", - "hyper", - "log", - "rustls 0.19.1", - "rustls-native-certs", - "tokio", - "tokio-rustls 0.22.0", - "webpki 0.21.4", - "webpki-roots 0.21.1", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "idna" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexed_db_futures" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfbcff6ae46750b15cc594bfd277b188cbddcfdc1817848f97f03f26f8625b9e" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "uuid 1.4.1", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" -dependencies = [ - "equivalent", - "hashbrown 0.14.0", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "input_buffer" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f97967975f448f1a7ddb12b0bc41069d09ed6a1c161a92687e057325db35d413" -dependencies = [ - "bytes", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "ipnet" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" - -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi 0.3.2", - "rustix", - "windows-sys", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "jobserver" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if 1.0.0", - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.7", -] - -[[package]] -name = "k256" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" -dependencies = [ - "cfg-if 1.0.0", - "ecdsa 0.16.8", - "elliptic-curve 0.13.5", - "once_cell", - "sha2 0.10.7", - "signature 2.1.0", -] - -[[package]] -name = "keystream" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33070833c9ee02266356de0c43f723152bd38bd96ddf52c82b3af10c9138b28" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "libgit2-sys" -version = "0.13.5+1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e5ea06c26926f1002dd553fded6cfcdc9784c1f60feeb58368b4d9b07b6dba" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - -[[package]] -name = "libm" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" - -[[package]] -name = "libsqlite3-sys" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "libz-sys" -version = "1.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" - -[[package]] -name = "lioness" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae926706ba42c425c9457121178330d75e273df2e82e28b758faf3de3a9acb9" -dependencies = [ - "arrayref", - "blake2 0.8.1", - "chacha", - "keystream", -] - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memory_units" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", -] - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num-traits" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.2", - "libc", -] - -[[package]] -name = "nym-api-requests" -version = "0.1.0" -dependencies = [ - "bs58 0.4.0", - "cosmrs", - "cosmwasm-std", - "getset", - "nym-coconut-interface", - "nym-mixnet-contract-common", - "schemars", - "serde", -] - -[[package]] -name = "nym-bandwidth-controller" -version = "0.1.0" -dependencies = [ - "bip39", - "nym-coconut-interface", - "nym-credential-storage", - "nym-credentials", - "nym-crypto", - "nym-network-defaults", - "nym-validator-client", - "rand 0.7.3", - "thiserror", - "url", -] - -[[package]] -name = "nym-bin-common" -version = "0.6.0" -dependencies = [ - "atty", - "clap", - "clap_complete", - "clap_complete_fig", - "log", - "pretty_env_logger", - "semver 0.11.0", - "serde", - "vergen", -] - -[[package]] -name = "nym-client-core" -version = "1.1.15" -dependencies = [ - "async-trait", - "base64 0.21.2", - "cfg-if 1.0.0", - "dashmap", - "dirs 4.0.0", - "futures", - "gloo-timers", - "humantime-serde", - "log", - "nym-bandwidth-controller", - "nym-config", - "nym-credential-storage", - "nym-crypto", - "nym-explorer-client", - "nym-gateway-client", - "nym-gateway-requests", - "nym-network-defaults", - "nym-nonexhaustive-delayqueue", - "nym-pemstore", - "nym-sphinx", - "nym-task", - "nym-topology", - "nym-validator-client", - "rand 0.7.3", - "reqwest", - "serde", - "serde_json", - "sha2 0.10.7", - "sqlx 0.6.3", - "tap", - "thiserror", - "time", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tungstenite", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-utils", - "wasmtimer", - "zeroize", -] - -[[package]] -name = "nym-client-wasm" -version = "1.1.1" -dependencies = [ - "anyhow", - "async-trait", - "bs58 0.4.0", - "console_error_panic_hook", - "futures", - "js-sys", - "nym-bandwidth-controller", - "nym-client-core", - "nym-coconut-interface", - "nym-credential-storage", - "nym-credentials", - "nym-crypto", - "nym-gateway-client", - "nym-node-tester-utils", - "nym-sphinx", - "nym-sphinx-acknowledgements", - "nym-task", - "nym-topology", - "nym-validator-client", - "rand 0.7.3", - "serde", - "serde-wasm-bindgen", - "serde_json", - "thiserror", - "tokio", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-test", - "wasm-utils", - "wasmtimer", - "wee_alloc", - "zeroize", -] - -[[package]] -name = "nym-coconut" -version = "0.5.0" -dependencies = [ - "bls12_381 0.6.0", - "bs58 0.4.0", - "digest 0.9.0", - "ff 0.11.1", - "getrandom 0.2.10", - "group 0.11.0", - "itertools", - "nym-dkg", - "nym-pemstore", - "rand 0.8.5", - "serde", - "serde_derive", - "sha2 0.9.9", - "thiserror", -] - -[[package]] -name = "nym-coconut-bandwidth-contract-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "nym-multisig-contract-common", -] - -[[package]] -name = "nym-coconut-dkg-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils", - "nym-contracts-common", - "nym-multisig-contract-common", -] - -[[package]] -name = "nym-coconut-interface" -version = "0.1.0" -dependencies = [ - "bs58 0.4.0", - "getset", - "nym-coconut", - "serde", - "thiserror", -] - -[[package]] -name = "nym-config" -version = "0.1.0" -dependencies = [ - "dirs 5.0.1", - "handlebars", - "log", - "nym-network-defaults", - "serde", - "toml 0.7.6", - "url", -] - -[[package]] -name = "nym-contracts-common" -version = "0.5.0" -dependencies = [ - "bs58 0.4.0", - "cosmwasm-schema", - "cosmwasm-std", - "schemars", - "serde", - "thiserror", -] - -[[package]] -name = "nym-credential-storage" -version = "0.1.0" -dependencies = [ - "async-trait", - "log", - "sqlx 0.5.13", - "thiserror", - "tokio", -] - -[[package]] -name = "nym-credentials" -version = "0.1.0" -dependencies = [ - "bls12_381 0.5.0", - "cosmrs", - "log", - "nym-api-requests", - "nym-coconut-interface", - "nym-crypto", - "nym-validator-client", - "thiserror", -] - -[[package]] -name = "nym-crypto" -version = "0.4.0" -dependencies = [ - "aes 0.8.3", - "blake3", - "bs58 0.4.0", - "cipher 0.4.4", - "ctr 0.9.2", - "digest 0.10.7", - "ed25519-dalek", - "generic-array 0.14.7", - "hkdf 0.12.3", - "hmac 0.12.1", - "nym-pemstore", - "nym-sphinx-types", - "rand 0.7.3", - "serde", - "serde_bytes", - "subtle-encoding", - "thiserror", - "x25519-dalek", - "zeroize", -] - -[[package]] -name = "nym-dkg" -version = "0.1.0" -dependencies = [ - "bitvec", - "bls12_381 0.6.0", - "bs58 0.4.0", - "ff 0.11.1", - "group 0.11.0", - "lazy_static", - "nym-pemstore", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "serde", - "serde_derive", - "sha2 0.9.9", - "thiserror", - "zeroize", -] - -[[package]] -name = "nym-ephemera-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils", - "nym-contracts-common", -] - -[[package]] -name = "nym-explorer-api-requests" -version = "0.1.0" -dependencies = [ - "nym-api-requests", - "nym-contracts-common", - "nym-mixnet-contract-common", - "schemars", - "serde", -] - -[[package]] -name = "nym-explorer-client" -version = "0.1.0" -dependencies = [ - "log", - "nym-explorer-api-requests", - "reqwest", - "serde", - "thiserror", - "url", -] - -[[package]] -name = "nym-gateway-client" -version = "0.1.0" -dependencies = [ - "futures", - "getrandom 0.2.10", - "log", - "nym-bandwidth-controller", - "nym-coconut-interface", - "nym-credential-storage", - "nym-crypto", - "nym-gateway-requests", - "nym-network-defaults", - "nym-pemstore", - "nym-sphinx", - "nym-task", - "nym-validator-client", - "rand 0.7.3", - "serde", - "thiserror", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tungstenite", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-utils", - "wasmtimer", -] - -[[package]] -name = "nym-gateway-requests" -version = "0.1.0" -dependencies = [ - "bs58 0.4.0", - "futures", - "generic-array 0.14.7", - "log", - "nym-coconut-interface", - "nym-credentials", - "nym-crypto", - "nym-pemstore", - "nym-sphinx", - "rand 0.7.3", - "serde", - "serde_json", - "thiserror", - "tungstenite", - "zeroize", -] - -[[package]] -name = "nym-group-contract-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cw-controllers", - "cw4", - "schemars", - "serde", -] - -[[package]] -name = "nym-mixnet-contract-common" -version = "0.6.0" -dependencies = [ - "bs58 0.4.0", - "cosmwasm-schema", - "cosmwasm-std", - "humantime-serde", - "log", - "nym-contracts-common", - "schemars", - "serde", - "serde-json-wasm", - "serde_repr", - "thiserror", - "time", -] - -[[package]] -name = "nym-multisig-contract-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "cw-utils", - "cw3", - "cw4", - "schemars", - "serde", - "thiserror", -] - -[[package]] -name = "nym-name-service-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "nym-contracts-common", - "serde", - "thiserror", -] - -[[package]] -name = "nym-network-defaults" -version = "0.1.0" -dependencies = [ - "cfg-if 1.0.0", - "dotenvy", - "hex-literal", - "once_cell", - "schemars", - "serde", - "thiserror", - "url", -] - -[[package]] -name = "nym-node-tester-utils" -version = "0.1.0" -dependencies = [ - "futures", - "log", - "nym-crypto", - "nym-sphinx", - "nym-sphinx-params", - "nym-task", - "nym-topology", - "rand 0.7.3", - "serde", - "serde_json", - "thiserror", - "tokio", - "wasm-utils", -] - -[[package]] -name = "nym-nonexhaustive-delayqueue" -version = "0.1.0" -dependencies = [ - "tokio", - "tokio-stream", - "tokio-util", - "wasmtimer", -] - -[[package]] -name = "nym-outfox" -version = "0.1.0" -dependencies = [ - "blake3", - "chacha20", - "chacha20poly1305", - "curve25519-dalek", - "getrandom 0.2.10", - "log", - "rand 0.7.3", - "rayon", - "sphinx-packet", - "thiserror", - "zeroize", -] - -[[package]] -name = "nym-pemstore" -version = "0.3.0" -dependencies = [ - "pem", -] - -[[package]] -name = "nym-service-provider-directory-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "nym-contracts-common", - "thiserror", -] - -[[package]] -name = "nym-sphinx" -version = "0.1.0" -dependencies = [ - "log", - "nym-crypto", - "nym-sphinx-acknowledgements", - "nym-sphinx-addressing", - "nym-sphinx-anonymous-replies", - "nym-sphinx-chunking", - "nym-sphinx-cover", - "nym-sphinx-forwarding", - "nym-sphinx-framing", - "nym-sphinx-params", - "nym-sphinx-routing", - "nym-sphinx-types", - "nym-topology", - "rand 0.7.3", - "rand_distr", - "thiserror", - "tokio", -] - -[[package]] -name = "nym-sphinx-acknowledgements" -version = "0.1.0" -dependencies = [ - "generic-array 0.14.7", - "nym-crypto", - "nym-pemstore", - "nym-sphinx-addressing", - "nym-sphinx-params", - "nym-sphinx-routing", - "nym-sphinx-types", - "nym-topology", - "rand 0.7.3", - "serde", - "thiserror", - "zeroize", -] - -[[package]] -name = "nym-sphinx-addressing" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nym-sphinx-types", - "serde", - "thiserror", -] - -[[package]] -name = "nym-sphinx-anonymous-replies" -version = "0.1.0" -dependencies = [ - "bs58 0.4.0", - "nym-crypto", - "nym-sphinx-addressing", - "nym-sphinx-params", - "nym-sphinx-routing", - "nym-sphinx-types", - "nym-topology", - "rand 0.7.3", - "serde", - "thiserror", - "wasm-bindgen", -] - -[[package]] -name = "nym-sphinx-chunking" -version = "0.1.0" -dependencies = [ - "log", - "nym-sphinx-addressing", - "nym-sphinx-params", - "nym-sphinx-types", - "rand 0.7.3", - "thiserror", -] - -[[package]] -name = "nym-sphinx-cover" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nym-sphinx-acknowledgements", - "nym-sphinx-addressing", - "nym-sphinx-chunking", - "nym-sphinx-forwarding", - "nym-sphinx-params", - "nym-sphinx-routing", - "nym-sphinx-types", - "nym-topology", - "rand 0.7.3", - "thiserror", -] - -[[package]] -name = "nym-sphinx-forwarding" -version = "0.1.0" -dependencies = [ - "nym-outfox", - "nym-sphinx-addressing", - "nym-sphinx-params", - "nym-sphinx-types", - "thiserror", -] - -[[package]] -name = "nym-sphinx-framing" -version = "0.1.0" -dependencies = [ - "bytes", - "nym-sphinx-params", - "nym-sphinx-types", - "thiserror", - "tokio-util", -] - -[[package]] -name = "nym-sphinx-params" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nym-sphinx-types", - "serde", - "thiserror", -] - -[[package]] -name = "nym-sphinx-routing" -version = "0.1.0" -dependencies = [ - "nym-sphinx-addressing", - "nym-sphinx-types", - "thiserror", -] - -[[package]] -name = "nym-sphinx-types" -version = "0.2.0" -dependencies = [ - "nym-outfox", - "sphinx-packet", - "thiserror", -] - -[[package]] -name = "nym-store-cipher" -version = "0.1.0" -dependencies = [ - "aes-gcm", - "argon2", - "generic-array 0.14.7", - "getrandom 0.2.10", - "rand 0.8.5", - "serde", - "serde_json", - "thiserror", - "zeroize", -] - -[[package]] -name = "nym-task" -version = "0.1.0" -dependencies = [ - "futures", - "log", - "thiserror", - "tokio", - "wasm-bindgen", - "wasm-bindgen-futures", -] - -[[package]] -name = "nym-topology" -version = "0.1.0" -dependencies = [ - "async-trait", - "bs58 0.4.0", - "log", - "nym-bin-common", - "nym-crypto", - "nym-mixnet-contract-common", - "nym-sphinx-addressing", - "nym-sphinx-routing", - "nym-sphinx-types", - "rand 0.7.3", - "thiserror", -] - -[[package]] -name = "nym-validator-client" -version = "0.1.0" -dependencies = [ - "async-trait", - "base64 0.13.1", - "bip39", - "colored", - "cosmrs", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "cw2", - "cw3", - "cw4", - "eyre", - "flate2", - "futures", - "itertools", - "log", - "nym-api-requests", - "nym-coconut-bandwidth-contract-common", - "nym-coconut-dkg-common", - "nym-coconut-interface", - "nym-config", - "nym-contracts-common", - "nym-ephemera-common", - "nym-group-contract-common", - "nym-mixnet-contract-common", - "nym-multisig-contract-common", - "nym-name-service-common", - "nym-network-defaults", - "nym-service-provider-directory-common", - "nym-vesting-contract-common", - "openssl", - "prost", - "reqwest", - "serde", - "serde_json", - "sha2 0.9.9", - "tendermint-rpc", - "thiserror", - "tokio", - "url", - "wasmtimer", - "zeroize", -] - -[[package]] -name = "nym-vesting-contract-common" -version = "0.7.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "nym-contracts-common", - "nym-mixnet-contract-common", - "serde", - "thiserror", -] - -[[package]] -name = "object" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "openssl" -version = "0.10.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729b745ad4a5575dd06a3e1af1414bd330ee561c01b3899eb584baeaa8def17e" -dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-src" -version = "111.27.0+1.1.1v" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e8f197c82d7511c5b014030c9b1efeda40d7d5f99d23b4ceed3524a5e63f02" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" -dependencies = [ - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "pairing" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de9d09263c9966e8196fe0380c9dbbc7ea114b5cf371ba29004bc1f9c6db7f3" -dependencies = [ - "group 0.10.0", -] - -[[package]] -name = "pairing" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2e415e349a3006dd7d9482cdab1c980a845bed1377777d768cb693a44540b42" -dependencies = [ - "group 0.11.0", -] - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core 0.9.8", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall 0.3.5", - "smallvec", - "windows-targets", -] - -[[package]] -name = "password-hash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle 2.4.1", -] - -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest 0.10.7", - "hmac 0.12.1", -] - -[[package]] -name = "peg" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a" -dependencies = [ - "peg-macros", - "peg-runtime", -] - -[[package]] -name = "peg-macros" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aa52829b8decbef693af90202711348ab001456803ba2a98eb4ec8fb70844c" -dependencies = [ - "peg-runtime", - "proc-macro2", - "quote", -] - -[[package]] -name = "peg-runtime" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" - -[[package]] -name = "pem" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd56cbd21fea48d0c440b41cd69c589faacade08c992d9a54e471b79d0fd13eb" -dependencies = [ - "base64 0.13.1", - "once_cell", - "regex", -] - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pest" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1acb4a4365a13f749a93f1a094a7805e5cfa0955373a9de860d962eaa3a5fe5a" -dependencies = [ - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666d00490d4ac815001da55838c500eafb0320019bbaa44444137c48b443a853" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ca01446f50dbda87c1786af8770d535423fa8a53aec03b8f4e3d7eb10e0929" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "pest_meta" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56af0a30af74d0445c0bf6d9d051c979b516a1a5af790d251daee76005420a48" -dependencies = [ - "once_cell", - "pest", - "sha2 0.10.7", -] - -[[package]] -name = "pin-project" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der 0.7.8", - "spki 0.7.2", -] - -[[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] -name = "poly1305" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" -dependencies = [ - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash", -] - -[[package]] -name = "polyval" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "pretty_env_logger" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" -dependencies = [ - "env_logger", - "log", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "prost" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "prost-types" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" -dependencies = [ - "prost", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - -[[package]] -name = "quote" -version = "1.0.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.10", -] - -[[package]] -name = "rand_distr" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9532ada3929fb8b2e9dbe28d1e06c9b2cc65813f074fcb6bd5fbefeff9d56" -dependencies = [ - "num-traits", - "rand 0.7.3", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rayon" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "num_cpus", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom 0.2.10", - "redox_syscall 0.2.16", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" - -[[package]] -name = "reqwest" -version = "0.11.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" -dependencies = [ - "base64 0.21.2", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac 0.12.1", - "zeroize", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac 0.12.1", - "subtle 2.4.1", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver 1.0.18", -] - -[[package]] -name = "rustix" -version = "0.38.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" -dependencies = [ - "base64 0.13.1", - "log", - "ring", - "sct 0.6.1", - "webpki 0.21.4", -] - -[[package]] -name = "rustls" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" -dependencies = [ - "log", - "ring", - "sct 0.7.0", - "webpki 0.22.0", -] - -[[package]] -name = "rustls-native-certs" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" -dependencies = [ - "openssl-probe", - "rustls 0.19.1", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" -dependencies = [ - "base64 0.21.2", -] - -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "schemars" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" -dependencies = [ - "dyn-clone", - "indexmap 1.9.3", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 1.0.109", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array 0.14.7", - "pkcs8 0.9.0", - "subtle 2.4.1", - "zeroize", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct 0.2.0", - "der 0.7.8", - "generic-array 0.14.7", - "pkcs8 0.10.2", - "subtle 2.4.1", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - -[[package]] -name = "serde" -version = "1.0.183" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-json-wasm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" -dependencies = [ - "serde", -] - -[[package]] -name = "serde-wasm-bindgen" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" -dependencies = [ - "js-sys", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "serde_bytes" -version = "0.11.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.183" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "serde_derive_internals" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "serde_json" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "serde_spanned" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha-1" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "sha2" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "signature" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "slab" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "sphinx-packet" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc43eda802856ee82a7555c7b75ceb9e07451741c7a2f5f23d036020e01189d4" -dependencies = [ - "aes 0.7.5", - "arrayref", - "blake2 0.8.1", - "bs58 0.4.0", - "byteorder", - "chacha", - "curve25519-dalek", - "digest 0.9.0", - "hkdf 0.11.0", - "hmac 0.11.0", - "lioness", - "log", - "rand 0.7.3", - "rand_distr", - "sha2 0.9.9", - "subtle 2.4.1", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] - -[[package]] -name = "spki" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" -dependencies = [ - "base64ct", - "der 0.7.8", -] - -[[package]] -name = "sqlformat" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" -dependencies = [ - "itertools", - "nom", - "unicode_categories", -] - -[[package]] -name = "sqlformat" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" -dependencies = [ - "itertools", - "nom", - "unicode_categories", -] - -[[package]] -name = "sqlx" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551873805652ba0d912fec5bbb0f8b4cdd96baf8e2ebf5970e5671092966019b" -dependencies = [ - "sqlx-core 0.5.13", - "sqlx-macros 0.5.13", -] - -[[package]] -name = "sqlx" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8de3b03a925878ed54a954f621e64bf55a3c1bd29652d0d1a17830405350188" -dependencies = [ - "sqlx-core 0.6.3", - "sqlx-macros 0.6.3", -] - -[[package]] -name = "sqlx-core" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48c61941ccf5ddcada342cd59e3e5173b007c509e1e8e990dafc830294d9dc5" -dependencies = [ - "ahash 0.7.6", - "atoi 0.4.0", - "bitflags 1.3.2", - "byteorder", - "bytes", - "crc 2.1.0", - "crossbeam-queue", - "either", - "event-listener", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "hashlink 0.7.0", - "hex", - "indexmap 1.9.3", - "itoa", - "libc", - "libsqlite3-sys", - "log", - "memchr", - "once_cell", - "paste", - "percent-encoding", - "rustls 0.19.1", - "sha2 0.10.7", - "smallvec", - "sqlformat 0.1.8", - "sqlx-rt 0.5.13", - "stringprep", - "thiserror", - "tokio-stream", - "url", - "webpki 0.21.4", - "webpki-roots 0.21.1", -] - -[[package]] -name = "sqlx-core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8241483a83a3f33aa5fff7e7d9def398ff9990b2752b6c6112b83c6d246029" -dependencies = [ - "ahash 0.7.6", - "atoi 1.0.0", - "bitflags 1.3.2", - "byteorder", - "bytes", - "crc 3.0.1", - "crossbeam-queue", - "dotenvy", - "either", - "event-listener", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "hashlink 0.8.3", - "hex", - "indexmap 1.9.3", - "itoa", - "libc", - "libsqlite3-sys", - "log", - "memchr", - "once_cell", - "paste", - "percent-encoding", - "rustls 0.20.8", - "rustls-pemfile", - "sha2 0.10.7", - "smallvec", - "sqlformat 0.2.1", - "sqlx-rt 0.6.3", - "stringprep", - "thiserror", - "tokio-stream", - "url", - "webpki-roots 0.22.6", -] - -[[package]] -name = "sqlx-macros" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0fba2b0cae21fc00fe6046f8baa4c7fcb49e379f0f592b04696607f69ed2e1" -dependencies = [ - "dotenv", - "either", - "heck", - "once_cell", - "proc-macro2", - "quote", - "sha2 0.10.7", - "sqlx-core 0.5.13", - "sqlx-rt 0.5.13", - "syn 1.0.109", - "url", -] - -[[package]] -name = "sqlx-macros" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9966e64ae989e7e575b19d7265cb79d7fc3cbbdf179835cb0d716f294c2049c9" -dependencies = [ - "dotenvy", - "either", - "heck", - "once_cell", - "proc-macro2", - "quote", - "sha2 0.10.7", - "sqlx-core 0.6.3", - "sqlx-rt 0.6.3", - "syn 1.0.109", - "url", -] - -[[package]] -name = "sqlx-rt" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4db708cd3e459078f85f39f96a00960bd841f66ee2a669e90bf36907f5a79aae" -dependencies = [ - "once_cell", - "tokio", - "tokio-rustls 0.22.0", -] - -[[package]] -name = "sqlx-rt" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804d3f245f894e61b1e6263c84b23ca675d96753b5abfd5cc8597d86806e8024" -dependencies = [ - "once_cell", - "tokio", - "tokio-rustls 0.23.4", -] - -[[package]] -name = "stringprep" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3737bde7edce97102e0e2b15365bf7a20bfdb5f60f4f9e8d7004258a51a8da" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "subtle" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "subtle-encoding" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" -dependencies = [ - "zeroize", -] - -[[package]] -name = "subtle-ng" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651" -dependencies = [ - "cfg-if 1.0.0", - "fastrand", - "redox_syscall 0.3.5", - "rustix", - "windows-sys", -] - -[[package]] -name = "tendermint" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f0a7d05cf78524782337f8edd55cbc578d159a16ad4affe2135c92f7dbac7f0" -dependencies = [ - "bytes", - "digest 0.10.7", - "ed25519 2.2.2", - "ed25519-consensus", - "flex-error", - "futures", - "k256 0.13.1", - "num-traits", - "once_cell", - "prost", - "prost-types", - "ripemd", - "serde", - "serde_bytes", - "serde_json", - "serde_repr", - "sha2 0.10.7", - "signature 2.1.0", - "subtle 2.4.1", - "subtle-encoding", - "tendermint-proto", - "time", - "zeroize", -] - -[[package]] -name = "tendermint-config" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71a72dbbea6dde12045d261f2c70c0de039125675e8a026c8d5ad34522756372" -dependencies = [ - "flex-error", - "serde", - "serde_json", - "tendermint", - "toml 0.5.11", - "url", -] - -[[package]] -name = "tendermint-proto" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cec054567d16d85e8c3f6a3139963d1a66d9d3051ed545d31562550e9bcc3d" -dependencies = [ - "bytes", - "flex-error", - "num-derive", - "num-traits", - "prost", - "prost-types", - "serde", - "serde_bytes", - "subtle-encoding", - "time", -] - -[[package]] -name = "tendermint-rpc" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d119d83a130537fc4a98c3c9eb6899ebe857fea4860400a61675bfb5f0b35129" -dependencies = [ - "async-trait", - "bytes", - "flex-error", - "futures", - "getrandom 0.2.10", - "http", - "hyper", - "hyper-proxy", - "hyper-rustls", - "peg", - "pin-project", - "semver 1.0.18", - "serde", - "serde_bytes", - "serde_json", - "subtle 2.4.1", - "subtle-encoding", - "tendermint", - "tendermint-config", - "tendermint-proto", - "thiserror", - "time", - "tokio", - "tracing", - "url", - "uuid 0.8.2", - "walkdir", -] - -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "time" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fdd63d58b18d663fbdf70e049f00a22c8e42be082203be7f26589213cd75ea" -dependencies = [ - "deranged", - "itoa", - "js-sys", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb71511c991639bb078fd5bf97757e03914361c48100d52878b8e52b46fb92cd" -dependencies = [ - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40de3a2ba249dcb097e01be5e67a5ff53cf250397715a071a81543e8a832a920" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "pin-project-lite", - "signal-hook-registry", - "socket2 0.5.3", - "tokio-macros", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" -dependencies = [ - "rustls 0.19.1", - "tokio", - "webpki 0.21.4", -] - -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.8", - "tokio", - "webpki 0.22.0", -] - -[[package]] -name = "tokio-stream" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e96bb520beab540ab664bd5a9cfeaa1fcd846fa68c830b42e2c8963071251d2" -dependencies = [ - "futures-util", - "log", - "pin-project", - "tokio", - "tungstenite", -] - -[[package]] -name = "tokio-util" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "slab", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.19.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" -dependencies = [ - "indexmap 2.0.0", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if 1.0.0", - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "tungstenite" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe8dada8c1a3aeca77d6b51a4f1314e0f4b8e438b7b1b71e3ddaca8080e4093" -dependencies = [ - "base64 0.13.1", - "byteorder", - "bytes", - "http", - "httparse", - "input_buffer", - "log", - "rand 0.8.5", - "sha-1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" - -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-ident" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" - -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle 2.4.1", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "url" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" - -[[package]] -name = "uuid" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" -dependencies = [ - "getrandom 0.2.10", - "wasm-bindgen", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "vergen" -version = "7.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447f9238a4553957277b3ee09d80babeae0811f1b3baefb093de1c0448437a37" -dependencies = [ - "anyhow", - "cfg-if 1.0.0", - "enum-iterator", - "getset", - "git2", - "rustc_version", - "rustversion", - "thiserror", - "time", -] - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" -dependencies = [ - "cfg-if 1.0.0", - "serde", - "serde_json", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 1.0.109", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" - -[[package]] -name = "wasm-bindgen-test" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d2fff962180c3fadf677438054b1db62bee4aa32af26a45388af07d1287e1d" -dependencies = [ - "console_error_panic_hook", - "js-sys", - "scoped-tls", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-test-macro", -] - -[[package]] -name = "wasm-bindgen-test-macro" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4683da3dfc016f704c9f82cf401520c4f1cb3ee440f7f52b3d6ac29506a49ca7" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "wasm-utils" -version = "0.1.0" -dependencies = [ - "futures", - "getrandom 0.2.10", - "indexed_db_futures", - "js-sys", - "nym-store-cipher", - "serde", - "serde-wasm-bindgen", - "thiserror", - "tungstenite", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasmtimer" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f656cd8858a5164932d8a90f936700860976ec21eb00e0fe2aa8cab13f6b4cf" -dependencies = [ - "futures", - "js-sys", - "parking_lot 0.12.1", - "pin-utils", - "slab", - "wasm-bindgen", -] - -[[package]] -name = "web-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" -dependencies = [ - "webpki 0.21.4", -] - -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki 0.22.0", -] - -[[package]] -name = "wee_alloc" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb3b5a6b2bb17cb6ad44a2e68a43e8d2722c997da10e928665c72ec6c0a0b8e" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "memory_units", - "winapi", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" - -[[package]] -name = "winnow" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5504cc7644f4b593cbc05c4a55bf9bd4e94b867c3c0bd440934174d50482427d" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "x25519-dalek" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" -dependencies = [ - "curve25519-dalek", - "rand_core 0.5.1", - "serde", - "zeroize", -] - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] diff --git a/clients/webassembly/Cargo.toml b/clients/webassembly/Cargo.toml deleted file mode 100644 index d68b5d37f6..0000000000 --- a/clients/webassembly/Cargo.toml +++ /dev/null @@ -1,74 +0,0 @@ -[package] -name = "nym-client-wasm" -authors = ["Dave Hrycyszyn ", "Jedrzej Stuczynski "] -version = "1.1.1" -edition = "2021" -keywords = ["nym", "sphinx", "wasm", "webassembly", "privacy"] -license = "Apache-2.0" -repository = "https://github.com/nymtech/nym" -description = "A webassembly client which can be used to interact with the the Nym privacy platform. Wasm is used for Sphinx packet generation." -rust-version = "1.56" - -[lib] -crate-type = ["cdylib", "rlib"] - -[features] -default = ["console_error_panic_hook"] -offline-test = [] - -[dependencies] -async-trait = "0.1.68" -bs58 = "0.4.0" -futures = "0.3" -js-sys = "0.3" -rand = { version = "0.7.3", features = ["wasm-bindgen"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -anyhow = "1.0" -serde-wasm-bindgen = "0.5" -tokio = { version = "1.24.1", features = ["sync"] } -url = "2.2" -wasm-bindgen = { version = "=0.2.83", features = ["serde-serialize"] } -wasm-bindgen-futures = "0.4" -thiserror = "1.0.40" -zeroize = "1.6.0" - -wasmtimer = { version = "0.2.0", features = ["tokio"] } - -# internal -nym-node-tester-utils = { path = "../../common/node-tester-utils" } -nym-client-core = { path = "../../common/client-core", default-features = false, features = ["wasm"] } -nym-bandwidth-controller = { path = "../../common/bandwidth-controller" } -nym-coconut-interface = { path = "../../common/coconut-interface" } -nym-credentials = { path = "../../common/credentials" } -nym-credential-storage = { path = "../../common/credential-storage" } -nym-crypto = { path = "../../common/crypto", features = ["asymmetric", "serde"] } -nym-sphinx = { path = "../../common/nymsphinx" } -nym-sphinx-acknowledgements = { path = "../../common/nymsphinx/acknowledgements", features = ["serde"]} -nym-topology = { path = "../../common/topology" } -nym-gateway-client = { path = "../../common/client-libs/gateway-client", default-features = false, features = ["wasm"] } -nym-validator-client = { path = "../../common/client-libs/validator-client", default-features = false } -nym-task = { path = "../../common/task" } -wasm-utils = { path = "../../common/wasm-utils", features = ["storage"], default-features = false } -# The `console_error_panic_hook` crate provides better debugging of panics by -# logging them with `console.error`. This is great for development, but requires -# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for -# code size when deploying. -console_error_panic_hook = { version = "0.1", optional = true } - -# `wee_alloc` is a tiny allocator for wasm that is only ~1K in code size -# compared to the default allocator's ~10K. It is slower than the default -# allocator, however. -# -# Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now. -wee_alloc = { version = "0.4", optional = true } - -[dev-dependencies] -wasm-bindgen-test = "0.3" - -[package.metadata.wasm-pack.profile.release] -wasm-opt = false - -[profile.release] -lto = true -opt-level = 'z' diff --git a/clients/webassembly/LICENSE_APACHE b/clients/webassembly/LICENSE_APACHE deleted file mode 100644 index 1b5ec8b78e..0000000000 --- a/clients/webassembly/LICENSE_APACHE +++ /dev/null @@ -1,176 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS diff --git a/clients/webassembly/Makefile b/clients/webassembly/Makefile deleted file mode 100644 index 23d5b7eea6..0000000000 --- a/clients/webassembly/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -clippy: - cargo clippy --all-features --target wasm32-unknown-unknown -- -D warnings - -test: - wasm-pack test --node - -wasm-build: - wasm-pack build \ No newline at end of file diff --git a/clients/webassembly/internal-dev/worker.js b/clients/webassembly/internal-dev/worker.js deleted file mode 100644 index fe15532596..0000000000 --- a/clients/webassembly/internal-dev/worker.js +++ /dev/null @@ -1,382 +0,0 @@ -// Copyright 2020-2023 Nym Technologies SA -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -importScripts("nym_client_wasm.js"); - -console.log("Initializing worker"); - -// wasm_bindgen creates a global variable (with the exports attached) that is in scope after `importScripts` -const { - NymNodeTester, - WasmGateway, - WasmMixNode, - WasmNymTopology, - default_debug, - NymClientBuilder, - NymClient, - set_panic_hook, - Config, - GatewayEndpointConfig, - ClientStorage, - current_network_topology, - make_key, - make_key2, -} = wasm_bindgen; - -let client = null; -let tester = null; - -const preferredGateway = "336yuXAeGEgedRfqTJZsG2YV7P13QH1bHv1SjCZYarc9"; - -function dummyTopology() { - const l1Mixnode = new WasmMixNode( - 1, - "n1fzv4jc7fanl9s0qj02ge2ezk3kts545kjtek47", - "178.79.143.65", - 1789, - "4Yr4qmEHd9sgsuQ83191FR2hD88RfsbMmB4tzhhZWriz", - "8ndjk5oZ6HxUZNScLJJ7hk39XtUqGexdKgW7hSX6kpWG", - 1, - "1.10.0" - ); - const l2Mixnode = new WasmMixNode( - 2, - "n1z93z44vf8ssvdhujjvxcj4rd5e3lz0l60wdk70", - "109.74.197.180", - 1789, - "7sVjiMrPYZrDWRujku9QLxgE8noT7NTgBAqizCsu7AoK", - "GepXwRnKZDd8x2nBWAajGGBVvF3mrpVMQBkgfrGuqRCN", - 2, - "1.10.0" - ); - const l3Mixnode = new WasmMixNode( - 3, - "n1ptg680vnmef2cd8l0s9uyc4f0hgf3x8sed6w77", - "176.58.101.80", - 1789, - "FoM5Mx9Pxk1g3zEqkS3APgtBeTtTo3M8k7Yu4bV6kK1R", - "DeYjrDC2AcQRVFshiKnbUo6bRvPyZ33QGYR2DLeFJ9qD", - 3, - "1.10.0" - ); - - const gateway = new WasmGateway( - "n16evnn8glr0sham3matj8rg2s24m6x56ayk87ts", - "85.159.212.96", - 1789, - 9000, - "336yuXAeGEgedRfqTJZsG2YV7P13QH1bHv1SjCZYarc9", - "BtYjoWihiuFihGKQypmpSspbhmWDPxzqeTVSd8ciCpWL", - "1.10.1" - ); - - const mixnodes = new Map(); - mixnodes.set(1, [l1Mixnode]); - mixnodes.set(2, [l2Mixnode]); - mixnodes.set(3, [l3Mixnode]); - - const gateways = [gateway]; - - return new WasmNymTopology(mixnodes, gateways); -} - -function printAndDisplayTestResult(result) { - result.log_details(); - - self.postMessage({ - kind: "DisplayTesterResults", - args: { - score: result.score(), - sentPackets: result.sent_packets, - receivedPackets: result.received_packets, - receivedAcks: result.received_acks, - duplicatePackets: result.duplicate_packets, - duplicateAcks: result.duplicate_acks, - }, - }); -} - -async function testWithTester() { - // A) construct with hardcoded topology - const topology = dummyTopology(); - const nodeTester = await new NymNodeTester(topology, preferredGateway); - - // B) first get topology directly from nym-api - // const validator = 'https://qwerty-validator-api.qa.nymte.ch/api'; - // const topology = await current_network_topology(validator) - // const nodeTester = await new NymNodeTester(topology, preferredGateway); - // - // C) use nym-api in the constructor (note: it does no filtering for 'good' nodes on other layers) - // const validator = 'https://qwerty-validator-api.qa.nymte.ch/api'; - // const nodeTester = await NymNodeTester.new_with_api(validator, preferredGateway) - - // B) first get topology directly from nym-api - // const validator = 'https://qwerty-validator-api.qa.nymte.ch/api'; - // const topology = await current_network_topology(validator) - // const nodeTester = await new NymNodeTester(topology, undefined, preferredGateway); - // - // C) use nym-api in the constructor (note: it does no filtering for 'good' nodes on other layers) - // const validator = 'https://qwerty-validator-api.qa.nymte.ch/api'; - // const nodeTester = await NymNodeTester.new_with_api(validator, undefined, preferredGateway) - // D, E, F) you also don't have to specify the gateway. if you don't, a random one (from your topology) will be used - // const topology = dummyTopology() - // const nodeTester = await new NymNodeTester(topology); - - self.onmessage = async (event) => { - if (event.data && event.data.kind) { - switch (event.data.kind) { - case "TestPacket": { - const { mixnodeIdentity } = event.data.args; - console.log("starting node test..."); - - let result = await nodeTester.test_node(mixnodeIdentity); - printAndDisplayTestResult(result); - } - } - } - }; -} - -async function testerReconnection() { - const validator = "https://qwerty-validator-api.qa.nymte.ch/api"; - const nodeTester = await NymNodeTester.new_with_api(validator); - - self.onmessage = async (event) => { - if (event.data && event.data.kind) { - switch (event.data.kind) { - case "TestPacket": { - const { mixnodeIdentity } = event.data.args; - console.log("starting node test..."); - - let result1 = await nodeTester.test_node(mixnodeIdentity); - console.log("sleeping for 5s"); - await new Promise((r) => setTimeout(r, 5000)); - await nodeTester.disconnect_from_gateway(); - - console.log("sleeping for 5s"); - await new Promise((r) => setTimeout(r, 5000)); - - await nodeTester.reconnect_to_gateway(); - let result2 = await nodeTester.test_node(mixnodeIdentity); - - printAndDisplayTestResult(result1); - printAndDisplayTestResult(result2); - } - } - } - }; -} - -async function testWithNymClient() { - const topology = dummyTopology(); - - let received = 0; - - const onMessageHandler = (message) => { - received += 1; - self.postMessage({ - kind: "ReceiveMessage", - args: { - message, - senderTag: undefined, - isTestPacket: true, - }, - }); - - // it's really up to the user to create proper callback here... - console.log(`received ${received} packets so far`); - }; - - console.log("Instantiating WASM client..."); - - let clientBuilder = NymClientBuilder.new_tester( - topology, - onMessageHandler, - preferredGateway - ); - - console.log("Web worker creating WASM client..."); - let local_client = await clientBuilder.start_client(); - console.log("WASM client running!"); - - const selfAddress = local_client.self_address(); - - // set the global (I guess we don't have to anymore?) - client = local_client; - - console.log(`Client address is ${selfAddress}`); - self.postMessage({ - kind: "Ready", - args: { - selfAddress, - }, - }); - - // Set callback to handle messages passed to the worker. - self.onmessage = async (event) => { - console.log(event); - if (event.data && event.data.kind) { - switch (event.data.kind) { - case "SendMessage": { - const { message, recipient } = event.data.args; - let uint8Array = new TextEncoder().encode(message); - await client.send_regular_message(uint8Array, recipient); - break; - } - case "TestPacket": { - const { mixnodeIdentity } = event.data.args; - const req = await client.try_construct_test_packet_request( - mixnodeIdentity - ); - await client.change_hardcoded_topology(req.injectable_topology()); - await client.try_send_test_packets(req); - break; - } - } - } - }; -} - -async function normalNymClientUsage() { - self.postMessage({ kind: "DisableMagicTestButton" }); - - // only really useful if you want to adjust some settings like traffic rate - // (if not needed you can just pass a null) - const debug = default_debug(); - - debug.disable_main_poisson_packet_distribution = true; - debug.disable_loop_cover_traffic_stream = true; - debug.use_extended_packet_size = false; - // debug.average_packet_delay_ms = BigInt(10); - // debug.average_ack_delay_ms = BigInt(10); - // debug.ack_wait_addition_ms = BigInt(3000); - // debug.ack_wait_multiplier = 10; - - debug.topology_refresh_rate_ms = BigInt(60000); - - const preferredGateway = "336yuXAeGEgedRfqTJZsG2YV7P13QH1bHv1SjCZYarc9"; - const validator = "https://qwerty-validator-api.qa.nymte.ch/api"; - - const config = new Config("my-awesome-wasm-client", validator, debug); - - const onMessageHandler = (message) => { - console.log(message); - self.postMessage({ - kind: "ReceiveMessage", - args: { - message, - }, - }); - }; - - console.log("Instantiating WASM client..."); - - let localClient = await new NymClient(config, onMessageHandler); - console.log("WASM client running!"); - - const selfAddress = localClient.self_address(); - - // set the global (I guess we don't have to anymore?) - client = localClient; - - console.log(`Client address is ${selfAddress}`); - self.postMessage({ - kind: "Ready", - args: { - selfAddress, - }, - }); - - // Set callback to handle messages passed to the worker. - self.onmessage = async (event) => { - console.log(event); - if (event.data && event.data.kind) { - switch (event.data.kind) { - case "SendMessage": { - const { message, recipient } = event.data.args; - let uint8Array = new TextEncoder().encode(message); - await client.send_regular_message(uint8Array, recipient); - break; - } - } - } - }; -} - -async function messWithStorage() { - self.onmessage = async (event) => { - if (event.data && event.data.kind) { - switch (event.data.kind) { - case "TestPacket": { - const { mixnodeIdentity } = event.data.args; - console.log("button clicked...", mixnodeIdentity); - - let id1 = "one"; - let id2 = "two"; - - console.log("making store1 NO-ENC"); - let _storage1 = await ClientStorage.new_unencrypted(id1); - - console.log("making store2 ENC"); - let _storage2 = await new ClientStorage(id2, "my-secret-password"); - // - // - // - // console.log("attempting to use store1 WITH PASSWORD") - // let _storage1_alt = await new ClientStorage(id1, "password"); - // - // - // - // console.log("attempting to use store2 WITHOUT PASSWORD") - // let _storage2_alt = await ClientStorage.new_unencrypted(id2); - // - // - // - // console.log("attempting to use store2 with WRONG PASSWORD") - // let _storage2_bad = await new ClientStorage(id2, "bad-password") - - // - // console.log("read1: ", await storage1.read()); - // console.log("read2: ", await storage2.read()); - // - // console.log("store1: ", await storage1.store("FOOMP")); - // - // console.log("read1: ", await storage1.read()); - // console.log("read2: ", await storage2.read()); - } - } - } - }; -} - -async function main() { - // load WASM package - await wasm_bindgen("nym_client_wasm_bg.wasm"); - console.log("Loaded WASM"); - - // sets up better stack traces in case of in-rust panics - set_panic_hook(); - - // show reconnection capabilities - // await testerReconnection() - - // run test on simplified and dedicated tester: - await testWithTester(); - - // 'Normal' client setup (to send 'normal' messages) - // await normalNymClientUsage() -} - -// Let's get started! -main(); diff --git a/clients/webassembly/src/constants.rs b/clients/webassembly/src/constants.rs deleted file mode 100644 index db2481de34..0000000000 --- a/clients/webassembly/src/constants.rs +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -pub(crate) const NODE_TESTER_ID: &str = "_nym-node-tester"; -pub(crate) const NODE_TESTER_CLIENT_ID: &str = "_nym-node-tester-client"; diff --git a/clients/webassembly/src/gateway_selector.rs b/clients/webassembly/src/gateway_selector.rs deleted file mode 100644 index 65cf0775ae..0000000000 --- a/clients/webassembly/src/gateway_selector.rs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2022 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use nym_client_core::config::GatewayEndpointConfig; -use wasm_bindgen::prelude::*; - -#[wasm_bindgen] -pub async fn get_gateway(api_server: String, preferred: Option) -> GatewayEndpointConfig { - let validator_client = - nym_validator_client::client::NymApiClient::new(api_server.parse().unwrap()); - - let gateways = match validator_client.get_cached_gateways().await { - Err(err) => panic!("failed to obtain list of all gateways - {err}"), - Ok(gateways) => gateways, - }; - - if let Some(preferred) = preferred { - if let Some(details) = gateways - .iter() - .find(|g| g.gateway.identity_key == preferred) - { - return GatewayEndpointConfig { - gateway_id: details.gateway.identity_key.clone(), - gateway_owner: details.owner.to_string(), - gateway_listener: format!( - "ws://{}:{}", - details.gateway.host, details.gateway.clients_port - ), - }; - } - } - - let details = gateways - .first() - .expect("current topology holds no gateways"); - - GatewayEndpointConfig { - gateway_id: details.gateway.identity_key.clone(), - gateway_owner: details.owner.to_string(), - gateway_listener: format!( - "ws://{}:{}", - details.gateway.host, details.gateway.clients_port - ), - } -} diff --git a/clients/webassembly/src/lib.rs b/clients/webassembly/src/lib.rs deleted file mode 100644 index a4d3aeaad4..0000000000 --- a/clients/webassembly/src/lib.rs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021-2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -// After reading https://github.com/rust-lang/rust-clippy/issues/11382 -// I suspect we *maybe* have hit a false positive, but I'm not sure. -#![allow(clippy::arc_with_non_send_sync)] - -use wasm_bindgen::prelude::*; - -#[cfg(target_arch = "wasm32")] -mod client; -#[cfg(target_arch = "wasm32")] -pub mod encoded_payload_helper; -#[cfg(target_arch = "wasm32")] -pub mod error; -#[cfg(target_arch = "wasm32")] -pub mod gateway_selector; -#[cfg(target_arch = "wasm32")] -pub mod storage; -#[cfg(target_arch = "wasm32")] -pub mod tester; -#[cfg(target_arch = "wasm32")] -pub mod topology; -#[cfg(target_arch = "wasm32")] -pub mod validation; - -#[cfg(target_arch = "wasm32")] -mod helpers; - -mod constants; - -#[wasm_bindgen] -pub fn set_panic_hook() { - // When the `console_error_panic_hook` feature is enabled, we can call the - // `set_panic_hook` function at least once during initialization, and then - // we will get better error messages if our code ever panics. - // - // For more details see - // https://github.com/rustwasm/console_error_panic_hook#readme - #[cfg(feature = "console_error_panic_hook")] - console_error_panic_hook::set_once(); -} diff --git a/clients/webassembly/src/storage/error.rs b/clients/webassembly/src/storage/error.rs deleted file mode 100644 index fcb6db5ad1..0000000000 --- a/clients/webassembly/src/storage/error.rs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use thiserror::Error; -use wasm_bindgen::JsValue; -use wasm_utils::simple_js_error; -use wasm_utils::storage::error::StorageError; - -#[derive(Debug, Error)] -pub enum ClientStorageError { - #[error("failed to use the storage: {source}")] - StorageError { - #[from] - source: StorageError, - }, - - #[error("{typ} cryptographic key is not available in storage")] - CryptoKeyNotInStorage { typ: String }, - - #[error("the prior gateway details are not available in the storage")] - GatewayDetailsNotInStorage, -} - -impl From for JsValue { - fn from(value: ClientStorageError) -> Self { - simple_js_error(value.to_string()) - } -} diff --git a/clients/webassembly/src/storage/mod.rs b/clients/webassembly/src/storage/mod.rs deleted file mode 100644 index f4ab912657..0000000000 --- a/clients/webassembly/src/storage/mod.rs +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::client::config::Config; -use crate::storage::error::ClientStorageError; -use js_sys::Promise; -use nym_client_core::client::base_client::storage::gateway_details::PersistedGatewayDetails; -use nym_crypto::asymmetric::{encryption, identity}; -use nym_gateway_client::SharedKeys; -use nym_sphinx::acknowledgements::AckKey; -use std::sync::Arc; -use wasm_bindgen::prelude::*; -use wasm_bindgen_futures::future_to_promise; -use wasm_utils::storage::{IdbVersionChangeEvent, WasmStorage}; -use wasm_utils::PromisableResult; -use zeroize::Zeroizing; - -pub(crate) mod error; -pub(crate) mod traits; - -const STORAGE_NAME_PREFIX: &str = "wasm-client-storage"; -const STORAGE_VERSION: u32 = 1; - -// v1 tables -mod v1 { - // stores - pub const KEYS_STORE: &str = "keys"; - pub const CORE_STORE: &str = "core"; - - // keys - pub const CONFIG: &str = "config"; - pub const GATEWAY_DETAILS: &str = "gateway_details"; - - pub const ED25519_IDENTITY_KEYPAIR: &str = "ed25519_identity_keypair"; - pub const X25519_ENCRYPTION_KEYPAIR: &str = "x25519_encryption_keypair"; - - // TODO: for those we could actually use the subtle crypto storage - pub const AES128CTR_ACK_KEY: &str = "aes128ctr_ack_key"; - pub const AES128CTR_BLAKE3_HMAC_GATEWAY_KEYS: &str = "aes128ctr_blake3_hmac_gateway_keys"; -} - -#[wasm_bindgen] -pub struct ClientStorage { - #[allow(dead_code)] - pub(crate) name: String, - pub(crate) inner: Arc, -} - -#[wasm_bindgen] -impl ClientStorage { - fn db_name(client_id: &str) -> String { - format!("{STORAGE_NAME_PREFIX}-{client_id}") - } - - pub(crate) async fn new_async( - client_id: &str, - passphrase: Option, - ) -> Result { - let name = Self::db_name(client_id); - - // make sure the password is zeroized when no longer used, especially if we error out. - // special care must be taken on JS side to ensure it's correctly used there. - let passphrase = Zeroizing::new(passphrase); - - let migrate_fn = Some(|evt: &IdbVersionChangeEvent| -> Result<(), JsValue> { - // Even if the web-sys bindings expose the version as a f64, the IndexedDB API - // works with an unsigned integer. - // See - let old_version = evt.old_version() as u32; - - if old_version < 1 { - // migrating to version 1 - let db = evt.db(); - - db.create_object_store(v1::KEYS_STORE)?; - db.create_object_store(v1::CORE_STORE)?; - } - - Ok(()) - }); - - let inner = WasmStorage::new( - &name, - STORAGE_VERSION, - migrate_fn, - passphrase.as_ref().map(|p| p.as_bytes()), - ) - .await?; - - Ok(ClientStorage { - inner: Arc::new(inner), - name, - }) - } - - #[wasm_bindgen(constructor)] - #[allow(clippy::new_ret_no_self)] - pub fn new(client_id: String, passphrase: String) -> Promise { - future_to_promise(async move { - Self::new_async(&client_id, Some(passphrase)) - .await - .into_promise_result() - }) - } - - pub fn new_unencrypted(client_id: String) -> Promise { - future_to_promise(async move { - Self::new_async(&client_id, None) - .await - .into_promise_result() - }) - } - - // TODO: persist client's config - #[allow(dead_code)] - pub(crate) async fn read_config(&self) -> Result, ClientStorageError> { - self.inner - .read_value(v1::CORE_STORE, JsValue::from_str(v1::CONFIG)) - .await - .map_err(Into::into) - } - - pub(crate) async fn may_read_gateway_details( - &self, - ) -> Result, ClientStorageError> { - self.inner - .read_value(v1::CORE_STORE, JsValue::from_str(v1::GATEWAY_DETAILS)) - .await - .map_err(Into::into) - } - - pub(crate) async fn must_read_gateway_details( - &self, - ) -> Result { - self.may_read_gateway_details() - .await? - .ok_or(ClientStorageError::GatewayDetailsNotInStorage) - } - - async fn may_read_identity_keypair( - &self, - ) -> Result, ClientStorageError> { - self.inner - .read_value( - v1::KEYS_STORE, - JsValue::from_str(v1::ED25519_IDENTITY_KEYPAIR), - ) - .await - .map_err(Into::into) - } - - async fn may_read_encryption_keypair( - &self, - ) -> Result, ClientStorageError> { - self.inner - .read_value( - v1::KEYS_STORE, - JsValue::from_str(v1::X25519_ENCRYPTION_KEYPAIR), - ) - .await - .map_err(Into::into) - } - - async fn may_read_ack_key(&self) -> Result, ClientStorageError> { - self.inner - .read_value(v1::KEYS_STORE, JsValue::from_str(v1::AES128CTR_ACK_KEY)) - .await - .map_err(Into::into) - } - - async fn may_read_gateway_shared_key(&self) -> Result, ClientStorageError> { - self.inner - .read_value( - v1::KEYS_STORE, - JsValue::from_str(v1::AES128CTR_BLAKE3_HMAC_GATEWAY_KEYS), - ) - .await - .map_err(Into::into) - } - - async fn must_read_identity_keypair(&self) -> Result { - self.may_read_identity_keypair() - .await? - .ok_or(ClientStorageError::CryptoKeyNotInStorage { - typ: v1::ED25519_IDENTITY_KEYPAIR.to_string(), - }) - } - - async fn must_read_encryption_keypair( - &self, - ) -> Result { - self.may_read_encryption_keypair() - .await? - .ok_or(ClientStorageError::CryptoKeyNotInStorage { - typ: v1::X25519_ENCRYPTION_KEYPAIR.to_string(), - }) - } - - async fn must_read_ack_key(&self) -> Result { - self.may_read_ack_key() - .await? - .ok_or(ClientStorageError::CryptoKeyNotInStorage { - typ: v1::AES128CTR_ACK_KEY.to_string(), - }) - } - - async fn must_read_gateway_shared_key(&self) -> Result { - self.may_read_gateway_shared_key() - .await? - .ok_or(ClientStorageError::CryptoKeyNotInStorage { - typ: v1::AES128CTR_BLAKE3_HMAC_GATEWAY_KEYS.to_string(), - }) - } - - async fn store_identity_keypair( - &self, - keypair: &identity::KeyPair, - ) -> Result<(), ClientStorageError> { - self.inner - .store_value( - v1::KEYS_STORE, - JsValue::from_str(v1::ED25519_IDENTITY_KEYPAIR), - keypair, - ) - .await - .map_err(Into::into) - } - - async fn store_encryption_keypair( - &self, - keypair: &encryption::KeyPair, - ) -> Result<(), ClientStorageError> { - self.inner - .store_value( - v1::KEYS_STORE, - JsValue::from_str(v1::X25519_ENCRYPTION_KEYPAIR), - keypair, - ) - .await - .map_err(Into::into) - } - - async fn store_ack_key(&self, key: &AckKey) -> Result<(), ClientStorageError> { - self.inner - .store_value( - v1::KEYS_STORE, - JsValue::from_str(v1::AES128CTR_ACK_KEY), - key, - ) - .await - .map_err(Into::into) - } - - async fn store_gateway_shared_key(&self, key: &SharedKeys) -> Result<(), ClientStorageError> { - self.inner - .store_value( - v1::KEYS_STORE, - JsValue::from_str(v1::AES128CTR_BLAKE3_HMAC_GATEWAY_KEYS), - key, - ) - .await - .map_err(Into::into) - } - - pub(crate) async fn store_gateway_details( - &self, - gateway_endpoint: &PersistedGatewayDetails, - ) -> Result<(), ClientStorageError> { - self.inner - .store_value( - v1::CORE_STORE, - JsValue::from_str(v1::GATEWAY_DETAILS), - gateway_endpoint, - ) - .await - .map_err(Into::into) - } - - // TODO: persist client's config - #[allow(dead_code)] - pub(crate) async fn store_config(&self, config: &Config) -> Result<(), ClientStorageError> { - self.inner - .store_value(v1::CORE_STORE, JsValue::from_str(v1::CONFIG), config) - .await - .map_err(Into::into) - } - - pub(crate) async fn has_full_gateway_info(&self) -> Result { - let has_keys = self.may_read_gateway_shared_key().await?.is_some(); - let has_details = self.may_read_gateway_details().await?.is_some(); - - Ok(has_keys && has_details) - } -} diff --git a/clients/webassembly/src/topology.rs b/clients/webassembly/src/topology.rs deleted file mode 100644 index a706c3293b..0000000000 --- a/clients/webassembly/src/topology.rs +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use nym_client_core::config::GatewayEndpointConfig; -use nym_crypto::asymmetric::{encryption, identity}; -use nym_topology::gateway::GatewayConversionError; -use nym_topology::mix::{Layer, MixnodeConversionError}; -use nym_topology::{gateway, mix, MixLayer, NymTopology}; -use nym_validator_client::client::{IdentityKeyRef, MixId}; -use serde::{Deserialize, Serialize}; -use std::collections::BTreeMap; -use thiserror::Error; -use wasm_bindgen::prelude::wasm_bindgen; -use wasm_bindgen::JsValue; -use wasm_utils::{console_log, simple_js_error}; - -#[derive(Debug, Error)] -pub enum WasmTopologyError { - #[error("got invalid mix layer {value}. Expected 1, 2 or 3.")] - InvalidMixLayer { value: u8 }, - - #[error(transparent)] - GatewayConversion(#[from] GatewayConversionError), - - #[error(transparent)] - MixnodeConversion(#[from] MixnodeConversionError), - - #[error("The provided mixnode map was malformed: {source}")] - MalformedMixnodeMap { source: serde_wasm_bindgen::Error }, - - #[error("The provided gateway list was malformed: {source}")] - MalformedGatewayList { source: serde_wasm_bindgen::Error }, -} - -impl From for JsValue { - fn from(value: WasmTopologyError) -> Self { - simple_js_error(value.to_string()) - } -} - -#[wasm_bindgen] -#[derive(Debug)] -pub struct WasmNymTopology { - inner: NymTopology, -} - -#[wasm_bindgen] -impl WasmNymTopology { - #[wasm_bindgen(constructor)] - pub fn new( - // expected: BTreeMap>, - // HashMap> will also work because it has the same json representation - mixnodes: JsValue, - // expected: Vec - gateways: JsValue, - ) -> Result { - let mixnodes: BTreeMap> = - serde_wasm_bindgen::from_value(mixnodes) - .map_err(|source| WasmTopologyError::MalformedMixnodeMap { source })?; - - let gateways: Vec = serde_wasm_bindgen::from_value(gateways) - .map_err(|source| WasmTopologyError::MalformedGatewayList { source })?; - - let mut converted_mixes = BTreeMap::new(); - - for (layer, nodes) in mixnodes { - let layer_nodes = nodes - .into_iter() - .map(TryInto::try_into) - .collect::>()?; - - converted_mixes.insert(layer, layer_nodes); - } - - let gateways = gateways - .into_iter() - .map(TryInto::try_into) - .collect::>()?; - - Ok(WasmNymTopology { - inner: NymTopology::new(converted_mixes, gateways), - }) - } - - #[allow(dead_code)] - pub(crate) fn ensure_contains(&self, gateway_config: &GatewayEndpointConfig) -> bool { - self.ensure_contains_gateway_id(&gateway_config.gateway_id) - } - - pub(crate) fn ensure_contains_gateway_id(&self, gateway_id: IdentityKeyRef) -> bool { - self.inner - .gateways() - .iter() - .any(|g| g.identity_key.to_base58_string() == gateway_id) - } - - pub fn print(&self) { - if !self.inner.mixes().is_empty() { - console_log!("mixnodes:"); - for (layer, nodes) in self.inner.mixes() { - console_log!("\tlayer {layer}:"); - for node in nodes { - console_log!("\t\t{} - {}", node.mix_id, node.identity_key) - } - } - } else { - console_log!("NO MIXNODES") - } - - if !self.inner.gateways().is_empty() { - console_log!("gateways:"); - for gateway in self.inner.gateways() { - console_log!("\t{}", gateway.identity_key) - } - } else { - console_log!("NO GATEWAYS") - } - } -} - -impl From for NymTopology { - fn from(value: WasmNymTopology) -> Self { - value.inner - } -} - -impl From for WasmNymTopology { - fn from(value: NymTopology) -> Self { - WasmNymTopology { inner: value } - } -} - -#[wasm_bindgen] -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct WasmMixNode { - pub mix_id: MixId, - #[wasm_bindgen(getter_with_clone)] - pub owner: String, - #[wasm_bindgen(getter_with_clone)] - pub host: String, - pub mix_port: u16, - #[wasm_bindgen(getter_with_clone)] - pub identity_key: String, - #[wasm_bindgen(getter_with_clone)] - pub sphinx_key: String, - pub layer: MixLayer, - #[wasm_bindgen(getter_with_clone)] - pub version: String, -} - -#[wasm_bindgen] -impl WasmMixNode { - #[wasm_bindgen(constructor)] - #[allow(clippy::too_many_arguments)] - pub fn new( - mix_id: MixId, - owner: String, - host: String, - mix_port: u16, - identity_key: String, - sphinx_key: String, - layer: MixLayer, - version: String, - ) -> Self { - Self { - mix_id, - owner, - host, - mix_port, - identity_key, - sphinx_key, - layer, - version, - } - } -} - -impl TryFrom for mix::Node { - type Error = WasmTopologyError; - - fn try_from(value: WasmMixNode) -> Result { - let host = mix::Node::parse_host(&value.host)?; - - // try to completely resolve the host in the mix situation to avoid doing it every - // single time we want to construct a path - let mix_host = mix::Node::extract_mix_host(&host, value.mix_port)?; - - Ok(mix::Node { - mix_id: value.mix_id, - owner: value.owner, - host, - mix_host, - identity_key: identity::PublicKey::from_base58_string(&value.identity_key) - .map_err(MixnodeConversionError::from)?, - sphinx_key: encryption::PublicKey::from_base58_string(&value.sphinx_key) - .map_err(MixnodeConversionError::from)?, - layer: Layer::try_from(value.layer) - .map_err(|_| WasmTopologyError::InvalidMixLayer { value: value.layer })?, - version: value.version, - }) - } -} - -#[wasm_bindgen] -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct WasmGateway { - #[wasm_bindgen(getter_with_clone)] - pub owner: String, - #[wasm_bindgen(getter_with_clone)] - pub host: String, - pub mix_port: u16, - pub clients_port: u16, - #[wasm_bindgen(getter_with_clone)] - pub identity_key: String, - #[wasm_bindgen(getter_with_clone)] - pub sphinx_key: String, - #[wasm_bindgen(getter_with_clone)] - pub version: String, -} - -#[wasm_bindgen] -impl WasmGateway { - #[wasm_bindgen(constructor)] - pub fn new( - owner: String, - host: String, - mix_port: u16, - clients_port: u16, - identity_key: String, - sphinx_key: String, - version: String, - ) -> Self { - Self { - owner, - host, - mix_port, - clients_port, - identity_key, - sphinx_key, - version, - } - } -} - -impl TryFrom for gateway::Node { - type Error = WasmTopologyError; - - fn try_from(value: WasmGateway) -> Result { - let host = gateway::Node::parse_host(&value.host)?; - - // try to completely resolve the host in the mix situation to avoid doing it every - // single time we want to construct a path - let mix_host = gateway::Node::extract_mix_host(&host, value.mix_port)?; - - Ok(gateway::Node { - owner: value.owner, - host, - mix_host, - clients_port: value.clients_port, - identity_key: identity::PublicKey::from_base58_string(&value.identity_key) - .map_err(GatewayConversionError::from)?, - sphinx_key: encryption::PublicKey::from_base58_string(&value.sphinx_key) - .map_err(GatewayConversionError::from)?, - version: value.version, - }) - } -} diff --git a/clients/webassembly/src/validation.rs b/clients/webassembly/src/validation.rs deleted file mode 100644 index 830a3d789a..0000000000 --- a/clients/webassembly/src/validation.rs +++ /dev/null @@ -1,35 +0,0 @@ -use nym_sphinx::addressing::clients::Recipient; -use wasm_bindgen::prelude::*; - -#[wasm_bindgen] -pub fn validate_recipient(recipient: String) -> Result<(), JsError> { - match Recipient::try_from_base58_string(recipient) { - Ok(_) => Ok(()), - Err(e) => Err(JsError::new(format!("{}", e).as_str())), - } -} - -#[cfg(test)] -mod tests { - use super::validate_recipient; - use wasm_bindgen_test::*; - - #[wasm_bindgen_test] - fn test_recipient_validation_ok() { - let res = validate_recipient("DyQmXnst5NGGjzUZxRC5Bjs5bd7CBF3xMpsSmbRiizr2.GH6YTBP2NXU3AVqd8WjiTMVyeMjunXMEsp7gVCMEJqpD@336yuXAeGEgedRfqTJZsG2YV7P13QH1bHv1SjCZYarc9".to_string()); - assert!(res.is_ok()) - } - - #[wasm_bindgen_test] - fn test_recipient_validation_fails() { - assert!(validate_recipient(" DyQmXnst5NGGjzUZxRC5Bjs5bd7CBF3xMpsSmbRiizr2.GH6YTBP2NXU3AVqd8WjiTMVyeMjunXMEsp7gVCMEJqpD@336yuXAeGEgedRfqTJZsG2YV7P13QH1bHv1SjCZYarc9".to_string()).is_err()); - assert!(validate_recipient( - "DyQmXnst5NGGjzUZxRC5BjbRiizr2.GH6YTBP2NXU3AVqd8WD@336yuXAeGEgedRfqTJZQH1bHv1SjCZYarc9" - .to_string() - ) - .is_err()); - assert!(validate_recipient("🙀🙀🙀🙀".to_string()).is_err()); - assert!(validate_recipient("".to_string()).is_err()); - assert!(validate_recipient(" ".to_string()).is_err()); - } -} diff --git a/clients/webassembly/tests/web.rs b/clients/webassembly/tests/web.rs deleted file mode 100644 index de5c1dafef..0000000000 --- a/clients/webassembly/tests/web.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Test suite for the Web and headless browsers. - -#![cfg(target_arch = "wasm32")] - -extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - -wasm_bindgen_test_configure!(run_in_browser); - -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); -} diff --git a/common/client-core/Cargo.toml b/common/client-core/Cargo.toml index 1c5c40a6e1..14761acf01 100644 --- a/common/client-core/Cargo.toml +++ b/common/client-core/Cargo.toml @@ -22,11 +22,11 @@ serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } sha2 = "0.10.6" tap = "1.0.1" -thiserror = "1.0.34" -time = "0.3.17" -tokio = { version = "1.24.1", features = ["macros"]} -tungstenite = { version = "0.13.0", default-features = false } +thiserror = { workspace = true } url = { workspace = true, features = ["serde"] } +tungstenite = { version = "0.13.0", default-features = false } +tokio = { workspace = true, features = ["macros"]} +time = "0.3.17" zeroize = { workspace = true } # internal @@ -51,7 +51,7 @@ version = "0.1.11" features = ["time"] [target."cfg(not(target_arch = \"wasm32\"))".dependencies.tokio] -version = "1.24.1" +workspace = true features = ["time"] [target."cfg(not(target_arch = \"wasm32\"))".dependencies.tokio-tungstenite] @@ -63,10 +63,10 @@ features = ["runtime-tokio-rustls", "sqlite", "macros", "migrate"] optional = true [target."cfg(target_arch = \"wasm32\")".dependencies.wasm-bindgen-futures] -version = "0.4" +workspace = true [target."cfg(target_arch = \"wasm32\")".dependencies.wasm-bindgen] -version = "0.2.83" +workspace = true [target."cfg(target_arch = \"wasm32\")".dependencies.wasmtimer] workspace = true @@ -77,7 +77,7 @@ version = "0.2.4" features = ["futures"] [target."cfg(target_arch = \"wasm32\")".dependencies.wasm-utils] -path = "../wasm-utils" +path = "../wasm/utils" features = ["websocket"] [target."cfg(target_arch = \"wasm32\")".dependencies.time] @@ -88,7 +88,7 @@ features = ["wasm-bindgen"] tempfile = "3.1.0" [build-dependencies] -tokio = { version = "1.24.1", features = ["rt-multi-thread", "macros"] } +tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } sqlx = { version = "0.6.2", features = ["runtime-tokio-rustls", "sqlite", "macros", "migrate"] } [features] diff --git a/common/client-core/src/client/replies/reply_storage/backend/mod.rs b/common/client-core/src/client/replies/reply_storage/backend/mod.rs index 72efa4b67f..557346a2da 100644 --- a/common/client-core/src/client/replies/reply_storage/backend/mod.rs +++ b/common/client-core/src/client/replies/reply_storage/backend/mod.rs @@ -6,7 +6,7 @@ use async_trait::async_trait; use std::error::Error; use thiserror::Error; -#[cfg(target_arch = "wasm32")] +// TODO: this should now live inside our wasm/client-core pub mod browser_backend; #[cfg(all(not(target_arch = "wasm32"), feature = "fs-surb-storage"))] diff --git a/common/client-core/src/config/mod.rs b/common/client-core/src/config/mod.rs index c1d5b9d3cb..e11f523276 100644 --- a/common/client-core/src/config/mod.rs +++ b/common/client-core/src/config/mod.rs @@ -69,7 +69,11 @@ pub struct Config { } impl Config { - pub fn new>(id: S, version: S) -> Self { + pub fn new(id: S1, version: S2) -> Self + where + S1: Into, + S2: Into, + { Config { client: Client::new_default(id, version), debug: Default::default(), @@ -287,7 +291,11 @@ pub struct Client { } impl Client { - pub fn new_default>(id: S, version: S) -> Self { + pub fn new_default(id: S1, version: S2) -> Self + where + S1: Into, + S2: Into, + { let network = NymNetworkDetails::new_mainnet(); let nyxd_urls = network .endpoints diff --git a/common/client-libs/gateway-client/Cargo.toml b/common/client-libs/gateway-client/Cargo.toml index 3f8f4ac0e4..f859b648d2 100644 --- a/common/client-libs/gateway-client/Cargo.toml +++ b/common/client-libs/gateway-client/Cargo.toml @@ -36,7 +36,7 @@ default-features = false # non-wasm-only dependencies [target."cfg(not(target_arch = \"wasm32\"))".dependencies.tokio] -version = "1.24.1" +workspace = true features = ["macros", "rt", "net", "sync", "time"] [target."cfg(not(target_arch = \"wasm32\"))".dependencies.tokio-stream] @@ -48,15 +48,18 @@ version = "0.14" # wasm-only dependencies [target."cfg(target_arch = \"wasm32\")".dependencies.wasm-bindgen] -version = "0.2" +workspace = true [target."cfg(target_arch = \"wasm32\")".dependencies.wasm-bindgen-futures] -version = "0.4" +workspace = true [target."cfg(target_arch = \"wasm32\")".dependencies.wasm-utils] -path = "../../wasm-utils" +path = "../../wasm/utils" features = ["websocket"] +[target."cfg(target_arch = \"wasm32\")".dependencies.gloo-utils] +workspace = true + # only import it in wasm. Prefer proper tokio timer in non-wasm [target."cfg(target_arch = \"wasm32\")".dependencies.wasmtimer] workspace = true @@ -68,7 +71,7 @@ features = ["tokio"] # containing javascript (such as a web browser or node.js). # refer to https://docs.rs/getrandom/0.2.2/getrandom/#webassembly-support for more information [target."cfg(target_arch = \"wasm32\")".dependencies.getrandom] -version = "0.2" +workspace = true features = ["js"] [dev-dependencies] diff --git a/common/client-libs/gateway-client/src/client.rs b/common/client-libs/gateway-client/src/client.rs index 188d84e2c9..31cafe37de 100644 --- a/common/client-libs/gateway-client/src/client.rs +++ b/common/client-libs/gateway-client/src/client.rs @@ -141,8 +141,8 @@ impl GatewayClient { #[cfg(target_arch = "wasm32")] async fn _close_connection(&mut self) -> Result<(), GatewayClientError> { match std::mem::replace(&mut self.connection, SocketState::NotConnected) { - SocketState::Available(mut socket) => { - (*socket).close(None).await; + SocketState::Available(socket) => { + (*socket).close(None, None).await?; Ok(()) } SocketState::PartiallyDelegated(_) => { diff --git a/common/client-libs/gateway-client/src/error.rs b/common/client-libs/gateway-client/src/error.rs index 64414bcf99..8ac387b43f 100644 --- a/common/client-libs/gateway-client/src/error.rs +++ b/common/client-libs/gateway-client/src/error.rs @@ -1,12 +1,12 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +#[cfg(target_arch = "wasm32")] +use gloo_utils::errors::JsError; use nym_gateway_requests::registration::handshake::error::HandshakeError; use std::io; use thiserror::Error; use tungstenite::Error as WsError; -#[cfg(target_arch = "wasm32")] -use wasm_bindgen::JsValue; #[derive(Debug, Error)] pub enum GatewayClientError { @@ -19,10 +19,9 @@ pub enum GatewayClientError { #[error("There was a network error - {0}")] NetworkError(#[from] WsError), - // TODO: see if `JsValue` is a reasonable type for this #[cfg(target_arch = "wasm32")] #[error("There was a network error")] - NetworkErrorWasm(JsValue), + NetworkErrorWasm(#[from] JsError), #[error("Invalid URL - {0}")] InvalidURL(String), diff --git a/common/credential-storage/src/ephemeral_storage.rs b/common/credential-storage/src/ephemeral_storage.rs index 261f88cb63..577a2de8c5 100644 --- a/common/credential-storage/src/ephemeral_storage.rs +++ b/common/credential-storage/src/ephemeral_storage.rs @@ -5,9 +5,10 @@ use crate::backends::memory::CoconutCredentialManager; use crate::error::StorageError; use crate::models::CoconutCredential; use crate::storage::Storage; - use async_trait::async_trait; +pub type EphemeralCredentialStorage = EphemeralStorage; + // note that clone here is fine as upon cloning the same underlying pool will be used #[derive(Clone)] pub struct EphemeralStorage { diff --git a/common/http-requests/Cargo.toml b/common/http-requests/Cargo.toml new file mode 100644 index 0000000000..6245eeedf4 --- /dev/null +++ b/common/http-requests/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "nym-http-requests" +version = "0.1.0" +description = "Helper library for sending HTTP requesters over the Nym mixnet" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } + +[dependencies] +nym-socks5-requests = { path = "../socks5/requests" } +nym-ordered-buffer = { path = "../socks5/ordered-buffer" } +nym-service-providers-common = { path = "../../service-providers/common" } +bytecodec = "0.4.15" +httpcodec = "0.2.3" +bytes = "1" +http = "0.2.9" +thiserror = "1" +url = "2" diff --git a/common/http-requests/src/error.rs b/common/http-requests/src/error.rs new file mode 100644 index 0000000000..180a4fd44a --- /dev/null +++ b/common/http-requests/src/error.rs @@ -0,0 +1,23 @@ +use std::io; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum MixHttpRequestError { + #[error("invalid Socks5 response")] + InvalidSocks5Response, + + #[error("the received Socks5 response was empty")] + EmptySocks5Response, + + #[error("bytecodec Error: {0}")] + ByteCodecError(#[from] bytecodec::Error), + + #[error("Url parse error: {0}")] + UrlParseError(#[from] url::ParseError), + + #[error("could not resolve socket address from the provided URL")] + SocketAddrResolveError { + #[source] + source: io::Error, + }, +} diff --git a/common/http-requests/src/lib.rs b/common/http-requests/src/lib.rs new file mode 100644 index 0000000000..1905396279 --- /dev/null +++ b/common/http-requests/src/lib.rs @@ -0,0 +1,63 @@ +// Copyright 2021 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use bytecodec::bytes::BytesEncoder; +use bytecodec::io::IoEncodeExt; +use bytecodec::Encode; +use httpcodec::{BodyEncoder, Request, RequestEncoder}; + +pub mod error; +pub mod socks; + +pub fn encode_http_request_as_string( + request: Request>, +) -> Result { + // Encode HTTP request as bytes + let mut encoder = RequestEncoder::new(BodyEncoder::new(BytesEncoder::new())); + encoder.start_encoding(request)?; + let mut buf = Vec::new(); + encoder.encode_all(&mut buf)?; + + Ok(String::from_utf8_lossy(&buf).to_string()) +} + +#[cfg(test)] +mod http_requests_tests { + use super::*; + use httpcodec::{HeaderField, HttpVersion, Method, RequestTarget}; + + fn create_http_get_request() -> Request> { + let mut request = Request::new( + Method::new("GET").unwrap(), + RequestTarget::new("/.wellknown/wallet/validators.json").unwrap(), + HttpVersion::V1_1, + b"".to_vec(), + ); + let mut headers = request.header_mut(); + headers.add_field(HeaderField::new("Host", "nymtech.net").unwrap()); + + request + } + + #[test] + fn http_request_ok() { + // Encode HTTP request as bytes + let request = create_http_get_request(); + let mut encoder = RequestEncoder::new(BodyEncoder::new(BytesEncoder::new())); + encoder.start_encoding(request).unwrap(); + let mut buf = Vec::new(); + encoder.encode_all(&mut buf).unwrap(); + + let body_as_string = String::from_utf8(buf).unwrap(); + + // replace newlines with \r\n + let expected = r"GET /.wellknown/wallet/validators.json HTTP/1.1 +Host: nymtech.net +Content-Length: 0 + +" + .replace('\n', "\r\n"); + + assert_eq!(expected, body_as_string); + } +} diff --git a/common/http-requests/src/socks.rs b/common/http-requests/src/socks.rs new file mode 100644 index 0000000000..952ff1fc52 --- /dev/null +++ b/common/http-requests/src/socks.rs @@ -0,0 +1,214 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::error; +use bytecodec::bytes::BytesEncoder; +use bytecodec::bytes::RemainingBytesDecoder; +use bytecodec::io::IoEncodeExt; +use bytecodec::{DecodeExt, Encode}; +use httpcodec::{BodyDecoder, ResponseDecoder}; +use httpcodec::{BodyEncoder, Request, RequestEncoder}; +use nym_service_providers_common::interface::ProviderInterfaceVersion; +use nym_socks5_requests::{SocketData, Socks5ProtocolVersion, Socks5ProviderRequest}; + +pub fn encode_http_request_as_socks_send_request( + provider_interface: ProviderInterfaceVersion, + socks5_protocol: Socks5ProtocolVersion, + conn_id: u64, + request: Request>, + seq: Option, + local_closed: bool, +) -> Result { + // Encode HTTP request as bytes + let mut encoder = RequestEncoder::new(BodyEncoder::new(BytesEncoder::new())); + encoder.start_encoding(request)?; + let mut buf = Vec::new(); + encoder.encode_all(&mut buf)?; + + // Wrap it as SOCKS send request + let request_content = nym_socks5_requests::request::Socks5Request::new_send( + socks5_protocol, + SocketData::new(seq.unwrap_or_default(), conn_id, local_closed, buf), + ); + + // and wrap it in provider request + Ok(Socks5ProviderRequest::new_provider_data( + provider_interface, + request_content, + )) +} + +#[derive(Debug)] +pub struct MixHttpResponse { + // pub connection_id: u64, + // #[deprecated] + // pub is_closed: bool, + pub http_response: httpcodec::Response>, + // #[deprecated] + // pub seq: u64, +} + +impl MixHttpResponse { + pub fn try_from_bytes(b: &[u8]) -> Result { + if b.is_empty() { + Err(error::MixHttpRequestError::EmptySocks5Response) + } else { + let mut decoder = ResponseDecoder::>::default(); + let http_response = decoder.decode_from_bytes(b)?; + + Ok(MixHttpResponse { http_response }) + } + } +} + +// impl TryFrom for MixHttpResponse { +// type Error = error::MixHttpRequestError; +// +// fn try_from(value: Socks5Response) -> Result { +// if let Socks5ResponseContent::NetworkData { content } = value.content { +// content.try_into() +// } else { +// Err(error::MixHttpRequestError::InvalidSocks5Response) +// } +// } +// } +// +// impl TryFrom for MixHttpResponse { +// type Error = error::MixHttpRequestError; +// +// fn try_from(value: SocketData) -> Result { +// if value.data.is_empty() { +// Err(error::MixHttpRequestError::EmptySocks5Response) +// } else { +// let mut decoder = ResponseDecoder::>::default(); +// let http_response = decoder.decode_from_bytes(value.data.as_ref())?; +// +// Ok(MixHttpResponse { +// connection_id: value.header.connection_id, +// is_closed: value.header.local_socket_closed, +// http_response, +// seq: value.header.seq, +// }) +// } +// } +// } + +// pub fn decode_socks_response_as_http_response( +// socks5_response: Socks5Response, +// ) -> Result { +// socks5_response.try_into() +// } +// +// #[cfg(test)] +// mod http_requests_tests { +// use super::*; +// use httpcodec::{HeaderField, HttpVersion, Method, RequestTarget}; +// use nym_service_providers_common::interface::Serializable; +// use nym_socks5_requests::Socks5Response; +// +// fn create_http_get_request() -> Request> { +// let mut request = Request::new( +// Method::new("GET").unwrap(), +// RequestTarget::new("/.wellknown/wallet/validators.json").unwrap(), +// HttpVersion::V1_1, +// b"".to_vec(), +// ); +// let mut headers = request.header_mut(); +// headers.add_field(HeaderField::new("Host", "nymtech.net").unwrap()); +// +// request +// } +// +// fn create_socks5_request_buffer() -> Vec { +// let request = create_http_get_request(); +// let socks5_request = encode_http_request_as_socks_send_request( +// ProviderInterfaceVersion::new_current(), +// Socks5ProtocolVersion::new_current(), +// 99u64, +// request, +// Some(42u64), +// true, +// ) +// .unwrap(); +// socks5_request.into_bytes() +// } +// +// #[test] +// fn request_http_request_content_ok() { +// let buffer = create_socks5_request_buffer(); +// +// // HTTP request string content is as expected +// assert_eq!( +// [71u8, 69u8, 84u8, 32u8, 47u8, 46u8, 119u8, 101u8], +// buffer[19..27] +// ); +// } +// +// /// This test will fail if the framing of the request buffer changes, e.g. when OrderedMessage +// /// changes to have the `index` value as a field, instead of packed with the `data` +// #[test] +// fn request_size_as_expected_ok() { +// let buffer = create_socks5_request_buffer(); +// // println!("{:?}", buffer) // uncomment and run `cargo test -- --nocapture` to view +// +// assert_eq!(108, buffer.len()); // version set to SOCKS5 +// } +// +// #[test] +// fn request_socks5_headers_ok() { +// let buffer = create_socks5_request_buffer(); +// +// assert_eq!(5u8, buffer[0]); // version set to SOCKS5 +// assert_eq!(1u8, buffer[1]); // type is SEND +// assert_eq!(99u8, buffer[9]); // ConnectionId is correct +// assert_eq!(1u8, buffer[10]); // local_closed is true +// } +// +// #[test] +// fn request_ordered_message_ok() { +// let buffer = create_socks5_request_buffer(); +// +// // OrderedMessage index is correct +// assert_eq!(42u8, buffer[18]); +// } +// +// fn create_socks_response() -> Socks5Response { +// // HTTP response is just a string +// let http_response_string = "HTTP/1.1 200 OK\r\nServer: foo/0.0.1\r\n\r\n"; +// +// let data = http_response_string.as_bytes().to_vec(); +// +// // wrap in `NetworkData`, then Socks5Response +// Socks5Response::new( +// Socks5ProtocolVersion::new_current(), +// Socks5ResponseContent::NetworkData { +// content: SocketData::new(42, 99u64, false, data), +// }, +// ) +// } +// +// /// This test will fail is anything in the framing of the socks5_response byte +// /// representation changes +// #[test] +// fn response_byte_size_is_as_expected() { +// let socks5_response = create_socks_response(); +// let buf = socks5_response.into_bytes(); +// +// assert_eq!(57, buf.len()); +// } +// +// #[test] +// fn response_parses() { +// unimplemented!() +// // let socks5_response = create_socks_response(); +// // let response = decode_socks_response_as_http_response(socks5_response).unwrap(); +// // +// // assert_eq!(42u64, response.seq); // OrderedMessage index as expected +// // assert_eq!(HttpVersion::V1_1, response.http_response.http_version()); +// // assert_eq!(200u16, response.http_response.status_code().as_u16()); +// // assert_eq!( +// // "foo/0.0.1", +// // response.http_response.header().get_field("Server").unwrap() +// // ); +// } +// } diff --git a/common/node-tester-utils/Cargo.toml b/common/node-tester-utils/Cargo.toml index 32ec845723..d3e7c1cdf1 100644 --- a/common/node-tester-utils/Cargo.toml +++ b/common/node-tester-utils/Cargo.toml @@ -27,4 +27,4 @@ workspace = true ## wasm-only dependencies [target."cfg(target_arch = \"wasm32\")".dependencies.wasm-utils] -path = "../wasm-utils" +path = "../wasm/utils" diff --git a/common/node-tester-utils/src/lib.rs b/common/node-tester-utils/src/lib.rs index a5e304c584..91d2c7c03f 100644 --- a/common/node-tester-utils/src/lib.rs +++ b/common/node-tester-utils/src/lib.rs @@ -9,6 +9,9 @@ pub mod receiver; pub mod tester; pub use message::{Empty, TestMessage}; +pub use nym_sphinx::{ + chunking::fragment::FragmentIdentifier, params::PacketSize, preparer::PreparedFragment, +}; pub use tester::NodeTester; // it feels wrong to redefine it, but I don't want to import the whole of contract commons just for this one type diff --git a/common/nymsphinx/addressing/Cargo.toml b/common/nymsphinx/addressing/Cargo.toml index c6bc2856e3..4420d7f258 100644 --- a/common/nymsphinx/addressing/Cargo.toml +++ b/common/nymsphinx/addressing/Cargo.toml @@ -15,3 +15,4 @@ thiserror = "1.0.37" [dev-dependencies] rand = "0.7" +nym-crypto = { path = "../../crypto", features = ["rand"] } \ No newline at end of file diff --git a/common/nymsphinx/addressing/src/clients.rs b/common/nymsphinx/addressing/src/clients.rs index a37f15a5fa..a739e7369e 100644 --- a/common/nymsphinx/addressing/src/clients.rs +++ b/common/nymsphinx/addressing/src/clients.rs @@ -39,7 +39,7 @@ pub enum RecipientFormattingError { } // TODO: this should a different home... somewhere, but where? -#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[derive(Clone, Copy, PartialEq, Eq)] pub struct Recipient { client_identity: ClientIdentity, client_encryption_key: ClientEncryptionKey, @@ -226,6 +226,13 @@ impl std::fmt::Display for Recipient { } } +impl std::fmt::Debug for Recipient { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + // use the Display implementation + ::fmt(self, f) + } +} + impl FromStr for Recipient { type Err = RecipientFormattingError; diff --git a/common/nymsphinx/src/receiver.rs b/common/nymsphinx/src/receiver.rs index 631ee5eef0..a756d6b1ba 100644 --- a/common/nymsphinx/src/receiver.rs +++ b/common/nymsphinx/src/receiver.rs @@ -243,7 +243,7 @@ mod message_receiver { ) .unwrap(), layer: Layer::One, - version: "0.8.0-dev".to_string(), + version: "0.8.0-dev".into(), }], ); @@ -263,7 +263,7 @@ mod message_receiver { ) .unwrap(), layer: Layer::Two, - version: "0.8.0-dev".to_string(), + version: "0.8.0-dev".into(), }], ); @@ -283,7 +283,7 @@ mod message_receiver { ) .unwrap(), layer: Layer::Three, - version: "0.8.0-dev".to_string(), + version: "0.8.0-dev".into(), }], ); @@ -303,7 +303,7 @@ mod message_receiver { "EB42xvMFMD5rUCstE2CDazgQQJ22zLv8SPm1Luxni44c", ) .unwrap(), - version: "0.8.0-dev".to_string(), + version: "0.8.0-dev".into(), }], ) } diff --git a/common/socks5/ordered-buffer/src/buffer.rs b/common/socks5/ordered-buffer/src/buffer.rs index 1b7b281727..23bcd13c80 100644 --- a/common/socks5/ordered-buffer/src/buffer.rs +++ b/common/socks5/ordered-buffer/src/buffer.rs @@ -78,6 +78,16 @@ impl OrderedMessageBuffer { Ok(()) } + /// Checks whether the buffer contains enough contiguous regions to read until the specified target sequence. + pub fn can_read_until(&self, target: u64) -> bool { + for seq in self.next_sequence..=target { + if !self.messages.contains_key(&seq) { + return false; + } + } + true + } + /// Returns `Option>` where it's `Some(bytes)` if there is gapless /// ordered data in the buffer, and `None` if the buffer is empty or has /// gaps in the contained data. @@ -110,7 +120,7 @@ impl OrderedMessageBuffer { ); Some(ReadContiguousData { data: contiguous_messages, - last_sequence: seq, + last_sequence: self.next_sequence - 1, }) } } diff --git a/common/socks5/proxy-helpers/src/connection_controller.rs b/common/socks5/proxy-helpers/src/connection_controller.rs index 0d93009626..416b88770f 100644 --- a/common/socks5/proxy-helpers/src/connection_controller.rs +++ b/common/socks5/proxy-helpers/src/connection_controller.rs @@ -171,7 +171,7 @@ impl Controller { if let Some(payload) = active_connection.read_from_buf() { if let Some(closed_at_index) = active_connection.closed_at_index { - if payload.last_sequence > closed_at_index { + if payload.last_sequence >= closed_at_index { active_connection.is_closed = true; } } diff --git a/common/socks5/requests/src/request.rs b/common/socks5/requests/src/request.rs index 530d27e11f..bca0bc25a5 100644 --- a/common/socks5/requests/src/request.rs +++ b/common/socks5/requests/src/request.rs @@ -9,6 +9,7 @@ use nym_service_providers_common::interface::{Serializable, ServiceProviderReque use nym_sphinx_addressing::clients::{Recipient, RecipientFormattingError}; use serde::{Deserialize, Serialize}; use std::convert::TryFrom; +use std::fmt::{Debug, Formatter}; use tap::TapFallible; use thiserror::Error; @@ -75,7 +76,7 @@ impl RequestDeserializationError { } } -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Clone, PartialEq, Eq)] pub struct ConnectRequest { // TODO: is connection_id redundant now? pub conn_id: ConnectionId, @@ -83,6 +84,19 @@ pub struct ConnectRequest { pub return_address: Option, } +impl Debug for ConnectRequest { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("ConnectRequest") + .field("conn_id", &self.conn_id) + .field("remote_addr", &self.remote_addr) + .field( + "return_address", + &self.return_address.map(|r| r.to_string()), + ) + .finish() + } +} + #[derive(Debug, Clone, PartialEq, Eq)] pub struct SendRequest { pub data: SocketData, diff --git a/common/socks5/requests/src/response.rs b/common/socks5/requests/src/response.rs index 0415035ac5..e7ea358479 100644 --- a/common/socks5/requests/src/response.rs +++ b/common/socks5/requests/src/response.rs @@ -64,7 +64,7 @@ pub enum ResponseDeserializationError { }, } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Socks5Response { pub protocol_version: Socks5ProtocolVersion, pub content: Socks5ResponseContent, diff --git a/common/task/src/manager.rs b/common/task/src/manager.rs index 96210776f9..e9147776b7 100644 --- a/common/task/src/manager.rs +++ b/common/task/src/manager.rs @@ -403,6 +403,7 @@ impl TaskClient { pub async fn recv_timeout(&mut self) { if self.mode.is_dummy() { + #[cfg_attr(target_arch = "wasm32", allow(clippy::needless_return))] return pending().await; } #[cfg(not(target_arch = "wasm32"))] diff --git a/common/topology/Cargo.toml b/common/topology/Cargo.toml index bfe2c98573..e6d35a509c 100644 --- a/common/topology/Cargo.toml +++ b/common/topology/Cargo.toml @@ -17,6 +17,7 @@ log = { workspace = true } rand = { version = "0.7.3", features = ["wasm-bindgen"] } thiserror = "1.0.37" async-trait = { workspace = true, optional = true } +semver = "0.11" ## internal nym-crypto = { path = "../crypto", features = ["sphinx", "outfox"] } diff --git a/common/topology/src/gateway.rs b/common/topology/src/gateway.rs index 9602043e42..04e7d6f45a 100644 --- a/common/topology/src/gateway.rs +++ b/common/topology/src/gateway.rs @@ -1,7 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::{filter, NetworkAddress}; +use crate::{filter, NetworkAddress, NodeVersion}; use nym_crypto::asymmetric::{encryption, identity}; use nym_mixnet_contract_common::GatewayBond; use nym_sphinx_addressing::nodes::{NodeIdentity, NymNodeRoutingAddress}; @@ -38,7 +38,7 @@ pub struct Node { pub clients_port: u16, pub identity_key: identity::PublicKey, pub sphinx_key: encryption::PublicKey, // TODO: or nymsphinx::PublicKey? both are x25519 - pub version: String, + pub version: NodeVersion, } impl Node { @@ -83,7 +83,8 @@ impl fmt::Display for Node { impl filter::Versioned for Node { fn version(&self) -> String { - self.version.clone() + // TODO: return semver instead + self.version.to_string() } } @@ -114,7 +115,7 @@ impl<'a> TryFrom<&'a GatewayBond> for Node { clients_port: bond.gateway.clients_port, identity_key: identity::PublicKey::from_base58_string(&bond.gateway.identity_key)?, sphinx_key: encryption::PublicKey::from_base58_string(&bond.gateway.sphinx_key)?, - version: bond.gateway.version.clone(), + version: bond.gateway.version.as_str().into(), }) } } diff --git a/common/topology/src/lib.rs b/common/topology/src/lib.rs index 428efd1056..8c2a06cbfa 100644 --- a/common/topology/src/lib.rs +++ b/common/topology/src/lib.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::filter::VersionFilterable; +pub use error::NymTopologyError; use log::warn; use nym_mixnet_contract_common::mixnode::MixNodeDetails; use nym_mixnet_contract_common::{GatewayBond, IdentityKeyRef, MixId}; @@ -25,7 +26,38 @@ pub mod random_route_provider; #[cfg(feature = "provider-trait")] pub mod provider_trait; -pub use error::NymTopologyError; +#[cfg(feature = "provider-trait")] +pub use provider_trait::{HardcodedTopologyProvider, TopologyProvider}; + +#[derive(Debug, Default, Clone)] +pub enum NodeVersion { + Explicit(semver::Version), + + #[default] + Unknown, +} + +// this is only implemented for backwards compatibility so we wouldn't need to change everything at once +// (also I intentionally implemented `ToString` as opposed to `Display`) +impl ToString for NodeVersion { + fn to_string(&self) -> String { + match self { + NodeVersion::Explicit(semver) => semver.to_string(), + NodeVersion::Unknown => String::new(), + } + } +} + +// this is also for backwards compat. +impl<'a> From<&'a str> for NodeVersion { + fn from(value: &'a str) -> Self { + if let Ok(semver) = value.parse() { + NodeVersion::Explicit(semver) + } else { + NodeVersion::Unknown + } + } +} #[derive(Debug, Clone)] pub enum NetworkAddress { @@ -390,7 +422,7 @@ mod converting_mixes_to_vec { ) .unwrap(), layer: Layer::One, - version: "0.x.0".to_string(), + version: "0.2.0".into(), }; let node2 = mix::Node { diff --git a/common/topology/src/mix.rs b/common/topology/src/mix.rs index 732999d7e9..bfc4b90344 100644 --- a/common/topology/src/mix.rs +++ b/common/topology/src/mix.rs @@ -1,7 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::{filter, NetworkAddress}; +use crate::{filter, NetworkAddress, NodeVersion}; use nym_crypto::asymmetric::{encryption, identity}; pub use nym_mixnet_contract_common::Layer; use nym_mixnet_contract_common::{MixId, MixNodeBond}; @@ -39,7 +39,7 @@ pub struct Node { pub identity_key: identity::PublicKey, pub sphinx_key: encryption::PublicKey, // TODO: or nymsphinx::PublicKey? both are x25519 pub layer: Layer, - pub version: String, + pub version: NodeVersion, } impl Node { @@ -66,7 +66,8 @@ impl Node { impl filter::Versioned for Node { fn version(&self) -> String { - self.version.clone() + // TODO: return semver instead + self.version.to_string() } } @@ -98,7 +99,7 @@ impl<'a> TryFrom<&'a MixNodeBond> for Node { identity_key: identity::PublicKey::from_base58_string(&bond.mix_node.identity_key)?, sphinx_key: encryption::PublicKey::from_base58_string(&bond.mix_node.sphinx_key)?, layer: bond.layer, - version: bond.mix_node.version.clone(), + version: bond.mix_node.version.as_str().into(), }) } } diff --git a/common/wasm-utils/Cargo.toml b/common/wasm-utils/Cargo.toml deleted file mode 100644 index fb4b25c5d8..0000000000 --- a/common/wasm-utils/Cargo.toml +++ /dev/null @@ -1,63 +0,0 @@ -[package] -name = "wasm-utils" -version = "0.1.0" -authors = ["Jedrzej Stuczynski "] -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -futures = { workspace = true } -js-sys = "^0.3.51" -wasm-bindgen = "=0.2.83" -wasm-bindgen-futures = "0.4" -serde = { workspace = true, features = ["derive"], optional = true } -serde-wasm-bindgen = { version = "0.5.0", optional = true } -getrandom = { version="0.2", features=["js"], optional = true } -indexed_db_futures = { version = " 0.3.0", optional = true } -thiserror = { workspace = true, optional = true } - -nym-store-cipher = { path = "../store-cipher", features = ["json"], optional = true } - -# we don't want entire tokio-tungstenite, tungstenite itself is just fine - we just want message and error enums -[dependencies.tungstenite] -version = "0.13" -default-features = false -optional = true - -[dependencies.web-sys] -version = "0.3" -optional = true - -[features] -default = ["sleep"] -sleep = ["web-sys", "web-sys/Window"] -websocket = [ - "getrandom", - "tungstenite", - "web-sys", - "web-sys/BinaryType", - "web-sys/Blob", - "web-sys/CloseEvent", - "web-sys/ErrorEvent", - "web-sys/FileReader", - "web-sys/MessageEvent", - "web-sys/ProgressEvent", - "web-sys/WebSocket", -] -crypto = [ - "web-sys", - "web-sys/Crypto", - "web-sys/CryptoKey", - "web-sys/CryptoKeyPair", - "web-sys/SubtleCrypto", - "web-sys/Window", - "web-sys/WorkerGlobalScope", -] -storage = [ - "indexed_db_futures", - "nym-store-cipher", - "serde", - "serde-wasm-bindgen", - "thiserror" -] diff --git a/common/wasm-utils/src/websocket/mod.rs b/common/wasm-utils/src/websocket/mod.rs deleted file mode 100644 index 08e16217f5..0000000000 --- a/common/wasm-utils/src/websocket/mod.rs +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright 2021 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::websocket::state::State; -use crate::{console_error, console_log}; -use futures::{Sink, Stream}; -use std::cell::RefCell; -use std::collections::VecDeque; -use std::io; -use std::pin::Pin; -use std::rc::Rc; -use std::task::{Context, Poll, Waker}; -use tungstenite::{Error as WsError, Message as WsMessage}; // use tungstenite Message and Error types for easier compatibility with `ClientHandshake` -use wasm_bindgen::closure::Closure; -use wasm_bindgen::JsCast; -use wasm_bindgen::JsValue; -use web_sys::{CloseEvent, ErrorEvent, MessageEvent, WebSocket}; - -mod state; - -// Unfortunately this can't be cleanly done with TryFrom/TryInto traits as both are foreign types -fn try_message_event_into_ws_message(msg_event: MessageEvent) -> Result { - match msg_event.data() { - buf if buf.is_instance_of::() => { - let array = js_sys::Uint8Array::new(&buf); - Ok(WsMessage::Binary(array.to_vec())) - } - blob if blob.is_instance_of::() => { - console_error!("received a blob on the websocket - ignoring it!"); - // we really don't want to bother dealing with Blobs, because it requires juggling filereaders, - // having event handlers to see when they're done, etc. - // + we shouldn't even get one [a blob] to begin with - // considering that our binary mode is (should be) set to array buffer. - Err(WsError::Io(io::Error::from(io::ErrorKind::InvalidInput))) - } - text if text.is_string() => match text.as_string() { - Some(text) => Ok(WsMessage::Text(text)), - None => Err(WsError::Utf8), - }, - // "received a websocket message that is neither a String, ArrayBuffer or a Blob" - _ => Err(WsError::Io(io::Error::from(io::ErrorKind::InvalidInput))), - } -} - -// Safety: when compiled to wasm32 everything is going to be running on a single thread and so there -// is no shared memory right now. -// -// Eventually it should be made `Send` properly. Wakers should probably be replaced with AtomicWaker -// and the item queue put behind an Arc>. -// It might also be worth looking at what https://crates.io/crates/send_wrapper could provide. -// Because I'm not sure Mutex would solve the `Closure` issue. It's the problem for later. -// -// ************************************ -// SUPER IMPORTANT TODO: ONCE WASM IN RUST MATURES AND BECOMES MULTI-THREADED THIS MIGHT -// LEAD TO RUNTIME MEMORY CORRUPTION!! -// ************************************ -// -unsafe impl Send for JSWebsocket {} - -#[derive(Debug)] -#[allow(clippy::upper_case_acronyms)] -pub struct JSWebsocket { - socket: web_sys::WebSocket, - - message_queue: Rc>>>, - - /// Waker of a task wanting to read incoming messages. - stream_waker: Rc>>, - - /// Waker of a task wanting to write to the sink. - sink_waker: Rc>>, - - /// Waker of a sink wanting to close the connection. - close_waker: Rc>>, - - // The callback closures. We need to store them as they will invalidate their - // corresponding JS callback whenever they are dropped, so if we were to - // normally return from `new` then our registered closures will - // raise an exception when invoked. - _on_open: Closure, - _on_error: Closure, - _on_close: Closure, - _on_message: Closure, -} - -impl JSWebsocket { - pub fn new(url: &str) -> Result { - let ws = WebSocket::new(url)?; - // we don't want to ever have to deal with blobs - ws.set_binary_type(web_sys::BinaryType::Arraybuffer); - - let message_queue = Rc::new(RefCell::new(VecDeque::new())); - let message_queue_clone = Rc::clone(&message_queue); - - let stream_waker: Rc>> = Rc::new(RefCell::new(None)); - let stream_waker_clone = Rc::clone(&stream_waker); - let stream_waker_clone2 = Rc::clone(&stream_waker); - - let sink_waker: Rc>> = Rc::new(RefCell::new(None)); - let sink_waker_clone = Rc::clone(&sink_waker); - let sink_waker_clone2 = Rc::clone(&sink_waker); - - let close_waker: Rc>> = Rc::new(RefCell::new(None)); - let close_waker_clone = Rc::clone(&close_waker); - - let on_message = Closure::wrap(Box::new(move |msg_event| { - let ws_message = try_message_event_into_ws_message(msg_event); - message_queue_clone.borrow_mut().push_back(ws_message); - - // if there is a task waiting for messages - wake the executor! - if let Some(waker) = stream_waker_clone.borrow_mut().take() { - waker.wake() - } - }) as Box); - - let url_clone = url.to_string(); - let on_open = Closure::wrap(Box::new(move |_| { - // in case there was a sink send request made before connection was fully established - console_log!("Websocket to {:?} is now open!", url_clone); - - // if there is a task waiting to write messages - wake the executor! - if let Some(waker) = sink_waker_clone.borrow_mut().take() { - waker.wake() - } - - // no need to wake the stream_waker because we won't have any message to send - // immediately anyway. It only makes sense to wake it during on_message (if any) - }) as Box); - - let on_error = Closure::wrap(Box::new(move |e: ErrorEvent| { - console_error!("Websocket error event: {:?}", e); - }) as Box); - - let on_close = Closure::wrap(Box::new(move |e: CloseEvent| { - console_log!("Websocket close event: {:?}", e); - // something was waiting for the close event! - if let Some(waker) = close_waker_clone.borrow_mut().take() { - waker.wake() - } - - // TODO: are waking those sufficient to prevent memory leaks? - if let Some(waker) = stream_waker_clone2.borrow_mut().take() { - waker.wake() - } - - if let Some(waker) = sink_waker_clone2.borrow_mut().take() { - waker.wake() - } - }) as Box); - - ws.set_onmessage(Some(on_message.as_ref().unchecked_ref())); - ws.set_onerror(Some(on_error.as_ref().unchecked_ref())); - ws.set_onopen(Some(on_open.as_ref().unchecked_ref())); - ws.set_onclose(Some(on_close.as_ref().unchecked_ref())); - - Ok(JSWebsocket { - socket: ws, - message_queue, - stream_waker, - sink_waker, - close_waker, - - _on_open: on_open, - _on_error: on_error, - _on_close: on_close, - _on_message: on_message, - }) - } - - pub async fn close(&mut self, code: Option) { - if let Some(code) = code { - self.socket - .close_with_code(code) - .expect("failed to close the socket!"); - } else { - self.socket.close().expect("failed to close the socket!"); - } - } - - fn state(&self) -> State { - self.socket.ready_state().into() - } -} - -impl Drop for JSWebsocket { - fn drop(&mut self) { - match self.state() { - State::Closed | State::Closing => {} // no need to do anything here - _ => self - .socket - .close() - .expect("failed to close WebSocket during drop!"), - } - - self.socket.set_onmessage(None); - self.socket.set_onerror(None); - self.socket.set_onopen(None); - self.socket.set_onclose(None); - } -} - -impl Stream for JSWebsocket { - type Item = Result; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - // if there's anything in the internal queue, keep returning that - let ws_message = self.message_queue.borrow_mut().pop_front(); - match ws_message { - Some(message) => Poll::Ready(Some(message)), - None => { - // if connection is closed or closing it means no more useful messages will ever arrive - // and hence we should signal this. - match self.state() { - State::Closing | State::Closed => Poll::Ready(None), - State::Open | State::Connecting => { - // clone the waker to be able to notify the executor once we get a new message - *self.stream_waker.borrow_mut() = Some(cx.waker().clone()); - Poll::Pending - } - } - } - } - } -} - -impl Sink for JSWebsocket { - type Error = WsError; - - fn poll_ready(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - match self.state() { - State::Connecting => { - // clone the waker to be able to notify the executor once we get connected - *self.sink_waker.borrow_mut() = Some(cx.waker().clone()); - Poll::Pending - } - - State::Open => Poll::Ready(Ok(())), - State::Closing | State::Closed => Poll::Ready(Err(WsError::AlreadyClosed)), - } - } - - fn start_send(self: Pin<&mut Self>, item: WsMessage) -> Result<(), Self::Error> { - // the only possible errors, per https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send - - // are `INVALID_STATE_ERR` which is when connection is not in open state - - // and `SYNTAX_ERR` which is when data is a string that has unpaired surrogates. This one - // is essentially impossible to happen in rust (assuming wasm_bindgen has done its jobs - // correctly, but even if not, there's nothing we can do ourselves. - - // hence we can map all errors to not open - - match self.state() { - State::Open => match item { - WsMessage::Binary(data) => self.socket.send_with_u8_array(&data), - WsMessage::Text(text) => self.socket.send_with_str(&text), - _ => unreachable!("those are not even exposed by the web_sys API"), - } - .map_err(|_| WsError::Io(io::Error::from(io::ErrorKind::NotConnected))), - - State::Closing | State::Closed => Err(WsError::AlreadyClosed), - State::Connecting => Err(WsError::Io(io::Error::from(io::ErrorKind::NotConnected))), - } - } - - fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - // TODO: can we/should we do anything more here? - Poll::Ready(Ok(())) - } - - fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - match self.state() { - State::Open | State::Connecting => { - // TODO: do we need to wait for closing event here? - *self.close_waker.borrow_mut() = Some(cx.waker().clone()); - - // close inner socket - Poll::Ready(self.socket.close().map_err(|_| todo!())) - } - // if we're already closed, nothing left to do! - State::Closed => Poll::Ready(Ok(())), - State::Closing => { - *self.close_waker.borrow_mut() = Some(cx.waker().clone()); - // wait for the close event... - Poll::Pending - } - } - } -} diff --git a/common/wasm-utils/src/websocket/state.rs b/common/wasm-utils/src/websocket/state.rs deleted file mode 100644 index aee1525141..0000000000 --- a/common/wasm-utils/src/websocket/state.rs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use web_sys::WebSocket; - -// convenience wrapper for state values provided by [`web_sys::WebSocket`] -/// The state values correspond to the `readyState` API of the `WebSocket`. -/// See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/readyState) for more details. -#[repr(u16)] -pub(crate) enum State { - Connecting = 0, - Open = 1, - Closing = 2, - Closed = 3, -} - -impl From for State { - fn from(state: u16) -> Self { - match state { - WebSocket::CONNECTING => State::Connecting, - WebSocket::OPEN => State::Open, - WebSocket::CLOSING => State::Closing, - WebSocket::CLOSED => State::Closed, - n => panic!("{n} is not a valid WebSocket state!"), // should we panic here or change it into `TryFrom` instead? - } - } -} diff --git a/common/wasm/client-core/Cargo.toml b/common/wasm/client-core/Cargo.toml new file mode 100644 index 0000000000..82f03573ba --- /dev/null +++ b/common/wasm/client-core/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "wasm-client-core" +authors = ["Jedrzej Stuczynski "] +version = "0.1.0" +edition = "2021" +license = "Apache-2.0" +repository = "https://github.com/nymtech/nym" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = { workspace = true } +js-sys = { workspace = true } +rand = { version = "0.7.3", features = ["wasm-bindgen"] } +serde = { workspace = true, features = ["derive"] } +serde-wasm-bindgen = { workspace = true } +thiserror = { workspace = true } +tsify = { workspace = true, features = ["js"] } +url = { workspace = true } +wasm-bindgen = { workspace = true } +wasm-bindgen-futures = { workspace = true } +zeroize = { workspace = true } + +nym-bandwidth-controller = { path = "../../bandwidth-controller" } +nym-client-core = { path = "../../client-core", default-features = false, features = ["wasm"] } +nym-config = { path = "../../config" } +nym-credential-storage = { path = "../../credential-storage" } +nym-crypto = { path = "../../crypto", features = ["asymmetric", "serde"] } +nym-gateway-client = { path = "../../client-libs/gateway-client", default-features = false, features = ["wasm"] } +nym-sphinx = { path = "../../nymsphinx" } +nym-sphinx-acknowledgements = { path = "../../nymsphinx/acknowledgements", features = ["serde"]} +nym-task = { path = "../../task" } +nym-topology = { path = "../../topology" } +nym-validator-client = { path = "../../client-libs/validator-client", default-features = false } +wasm-utils = { path = "../utils" } +wasm-storage = { path = "../storage" } + + +# The `console_error_panic_hook` crate provides better debugging of panics by +# logging them with `console.error`. This is great for development, but requires +# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for +# code size when deploying. +console_error_panic_hook = { version = "0.1", optional = true } + +[features] +default = ["console_error_panic_hook"] \ No newline at end of file diff --git a/clients/webassembly/src/client/config.rs b/common/wasm/client-core/src/config/mod.rs similarity index 72% rename from clients/webassembly/src/client/config.rs rename to common/wasm/client-core/src/config/mod.rs index f63d1456ac..429fae6400 100644 --- a/clients/webassembly/src/client/config.rs +++ b/common/wasm/client-core/src/config/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2022-2023 - Nym Technologies SA +// Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 // due to expansion of #[wasm_bindgen] macro on `Debug` Config struct @@ -6,342 +6,90 @@ // another issue due to #[wasm_bindgen] and `Copy` trait #![allow(dropping_copy_types)] -use nym_client_core::config::{ - Acknowledgements as ConfigAcknowledgements, Config as BaseClientConfig, - CoverTraffic as ConfigCoverTraffic, DebugConfig as ConfigDebug, - GatewayConnection as ConfigGatewayConnection, ReplySurbs as ConfigReplySurbs, - Topology as ConfigTopology, Traffic as ConfigTraffic, -}; +use crate::error::WasmCoreError; +use nym_config::helpers::OptionalSet; use nym_sphinx::params::{PacketSize, PacketType}; use serde::{Deserialize, Serialize}; use std::time::Duration; use wasm_bindgen::prelude::*; -#[wasm_bindgen] -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct Config { - pub(crate) base: BaseClientConfig, +pub mod r#override; + +pub use nym_client_core::config::{ + Acknowledgements as ConfigAcknowledgements, Config as BaseClientConfig, + CoverTraffic as ConfigCoverTraffic, DebugConfig as ConfigDebug, + GatewayConnection as ConfigGatewayConnection, ReplySurbs as ConfigReplySurbs, + Topology as ConfigTopology, Traffic as ConfigTraffic, +}; + +pub fn new_base_client_config( + id: String, + version: String, + nym_api: Option, + nyxd: Option, + debug: Option, +) -> Result { + let nym_api_url = match nym_api { + Some(raw) => Some( + raw.parse() + .map_err(|source| WasmCoreError::MalformedUrl { raw, source })?, + ), + None => None, + }; + + let nyxd_url = match nyxd { + Some(raw) => Some( + raw.parse() + .map_err(|source| WasmCoreError::MalformedUrl { raw, source })?, + ), + None => None, + }; + + Ok(BaseClientConfig::new(id, version) + .with_optional( + BaseClientConfig::with_custom_nym_apis, + nym_api_url.map(|u| vec![u]), + ) + .with_optional( + BaseClientConfig::with_custom_nyxd, + nyxd_url.map(|u| vec![u]), + ) + .with_debug_config(debug.map(Into::into).unwrap_or_default())) } #[wasm_bindgen] -impl Config { - #[wasm_bindgen(constructor)] - pub fn new(id: String, validator_server: String, debug: Option) -> Self { - Config { - base: BaseClientConfig::new(id, env!("CARGO_PKG_VERSION").to_string()) - .with_custom_nyxd(vec![validator_server - .parse() - .expect("provided url was malformed")]) - .with_debug_config(debug.map(Into::into).unwrap_or_default()), - } - } - - pub(crate) fn new_tester_config>(id: S) -> Self { - Config { - base: BaseClientConfig::new(id.into(), env!("CARGO_PKG_VERSION").to_string()) - .with_disabled_credentials(true) - .with_disabled_cover_traffic(true) - .with_disabled_topology_refresh(true), - } - } +pub fn default_debug() -> DebugWasm { + ConfigDebug::default().into() } +#[wasm_bindgen(js_name = defaultDebug)] +pub fn default_debug_obj() -> JsValue { + let dbg = default_debug(); + serde_wasm_bindgen::to_value(&dbg) + .expect("our 'DebugWasm' struct should have had a correctly defined serde implementation") +} + +/// A client configuration in which no cover traffic will be sent, +/// in either the main distribution or the secondary traffic stream. #[wasm_bindgen] -#[derive(Debug, Copy, Clone)] -pub struct TrafficWasm { - /// The parameter of Poisson distribution determining how long, on average, - /// sent packet is going to be delayed at any given mix node. - /// So for a packet going through three mix nodes, on average, it will take three times this value - /// until the packet reaches its destination. - pub average_packet_delay_ms: u64, - - /// The parameter of Poisson distribution determining how long, on average, - /// it is going to take another 'real traffic stream' message to be sent. - /// If no real packets are available and cover traffic is enabled, - /// a loop cover message is sent instead in order to preserve the rate. - pub message_sending_average_delay_ms: u64, - - /// Controls whether the main packet stream constantly produces packets according to the predefined - /// poisson distribution. - pub disable_main_poisson_packet_distribution: bool, - - /// Controls whether the sent sphinx packet use the NON-DEFAULT bigger size. - pub use_extended_packet_size: bool, - - /// Controls whether the sent packets should use outfox as opposed to the default sphinx. - pub use_outfox: bool, +pub fn no_cover_debug() -> DebugWasm { + let mut cfg = ConfigDebug::default(); + cfg.traffic.disable_main_poisson_packet_distribution = true; + cfg.cover_traffic.disable_loop_cover_traffic_stream = true; + cfg.into() } -impl From for ConfigTraffic { - fn from(traffic: TrafficWasm) -> Self { - let use_extended_packet_size = traffic - .use_extended_packet_size - .then(|| PacketSize::ExtendedPacket32); - - let packet_type = if traffic.use_outfox { - PacketType::Outfox - } else { - PacketType::Mix - }; - - ConfigTraffic { - average_packet_delay: Duration::from_millis(traffic.average_packet_delay_ms), - message_sending_average_delay: Duration::from_millis( - traffic.message_sending_average_delay_ms, - ), - disable_main_poisson_packet_distribution: traffic - .disable_main_poisson_packet_distribution, - primary_packet_size: PacketSize::RegularPacket, - secondary_packet_size: use_extended_packet_size, - packet_type, - } - } -} - -impl From for TrafficWasm { - fn from(traffic: ConfigTraffic) -> Self { - TrafficWasm { - average_packet_delay_ms: traffic.average_packet_delay.as_millis() as u64, - message_sending_average_delay_ms: traffic.message_sending_average_delay.as_millis() - as u64, - disable_main_poisson_packet_distribution: traffic - .disable_main_poisson_packet_distribution, - use_extended_packet_size: traffic.secondary_packet_size.is_some(), - use_outfox: traffic.packet_type == PacketType::Outfox, - } - } -} - -#[wasm_bindgen] -#[derive(Debug, Copy, Clone)] -pub struct CoverTrafficWasm { - /// The parameter of Poisson distribution determining how long, on average, - /// it is going to take for another loop cover traffic message to be sent. - pub loop_cover_traffic_average_delay_ms: u64, - - /// Specifies the ratio of `primary_packet_size` to `secondary_packet_size` used in cover traffic. - /// Only applicable if `secondary_packet_size` is enabled. - pub cover_traffic_primary_size_ratio: f64, - - /// Controls whether the dedicated loop cover traffic stream should be enabled. - /// (and sending packets, on average, every [Self::loop_cover_traffic_average_delay]) - pub disable_loop_cover_traffic_stream: bool, -} - -impl From for ConfigCoverTraffic { - fn from(cover_traffic: CoverTrafficWasm) -> Self { - ConfigCoverTraffic { - loop_cover_traffic_average_delay: Duration::from_millis( - cover_traffic.loop_cover_traffic_average_delay_ms, - ), - cover_traffic_primary_size_ratio: cover_traffic.cover_traffic_primary_size_ratio, - disable_loop_cover_traffic_stream: cover_traffic.disable_loop_cover_traffic_stream, - } - } -} - -impl From for CoverTrafficWasm { - fn from(cover_traffic: ConfigCoverTraffic) -> Self { - CoverTrafficWasm { - loop_cover_traffic_average_delay_ms: cover_traffic - .loop_cover_traffic_average_delay - .as_millis() as u64, - cover_traffic_primary_size_ratio: cover_traffic.cover_traffic_primary_size_ratio, - disable_loop_cover_traffic_stream: cover_traffic.disable_loop_cover_traffic_stream, - } - } -} - -#[wasm_bindgen] -#[derive(Debug, Copy, Clone)] -pub struct GatewayConnectionWasm { - /// How long we're willing to wait for a response to a message sent to the gateway, - /// before giving up on it. - pub gateway_response_timeout_ms: u64, -} - -impl From for ConfigGatewayConnection { - fn from(gateway_connection: GatewayConnectionWasm) -> Self { - ConfigGatewayConnection { - gateway_response_timeout: Duration::from_millis( - gateway_connection.gateway_response_timeout_ms, - ), - } - } -} - -impl From for GatewayConnectionWasm { - fn from(gateway_connection: ConfigGatewayConnection) -> Self { - GatewayConnectionWasm { - gateway_response_timeout_ms: gateway_connection.gateway_response_timeout.as_millis() - as u64, - } - } -} - -#[wasm_bindgen] -#[derive(Debug, Copy, Clone)] -pub struct AcknowledgementsWasm { - /// The parameter of Poisson distribution determining how long, on average, - /// sent acknowledgement is going to be delayed at any given mix node. - /// So for an ack going through three mix nodes, on average, it will take three times this value - /// until the packet reaches its destination. - pub average_ack_delay_ms: u64, - - /// Value multiplied with the expected round trip time of an acknowledgement packet before - /// it is assumed it was lost and retransmission of the data packet happens. - /// In an ideal network with 0 latency, this value would have been 1. - pub ack_wait_multiplier: f64, - - /// Value added to the expected round trip time of an acknowledgement packet before - /// it is assumed it was lost and retransmission of the data packet happens. - /// In an ideal network with 0 latency, this value would have been 0. - pub ack_wait_addition_ms: u64, -} - -impl From for ConfigAcknowledgements { - fn from(acknowledgements: AcknowledgementsWasm) -> Self { - ConfigAcknowledgements { - average_ack_delay: Duration::from_millis(acknowledgements.average_ack_delay_ms), - ack_wait_multiplier: acknowledgements.ack_wait_multiplier, - ack_wait_addition: Duration::from_millis(acknowledgements.ack_wait_addition_ms), - } - } -} - -impl From for AcknowledgementsWasm { - fn from(acknowledgements: ConfigAcknowledgements) -> Self { - AcknowledgementsWasm { - average_ack_delay_ms: acknowledgements.average_ack_delay.as_millis() as u64, - ack_wait_multiplier: acknowledgements.ack_wait_multiplier, - ack_wait_addition_ms: acknowledgements.ack_wait_addition.as_millis() as u64, - } - } -} - -#[wasm_bindgen] -#[derive(Debug, Copy, Clone)] -pub struct TopologyWasm { - /// The uniform delay every which clients are querying the directory server - /// to try to obtain a compatible network topology to send sphinx packets through. - pub topology_refresh_rate_ms: u64, - - /// During topology refresh, test packets are sent through every single possible network - /// path. This timeout determines waiting period until it is decided that the packet - /// did not reach its destination. - pub topology_resolution_timeout_ms: u64, - - /// Specifies whether the client should not refresh the network topology after obtaining - /// the first valid instance. - /// Supersedes `topology_refresh_rate_ms`. - pub disable_refreshing: bool, -} - -impl From for ConfigTopology { - fn from(topology: TopologyWasm) -> Self { - ConfigTopology { - topology_refresh_rate: Duration::from_millis(topology.topology_refresh_rate_ms), - topology_resolution_timeout: Duration::from_millis( - topology.topology_resolution_timeout_ms, - ), - disable_refreshing: topology.disable_refreshing, - topology_structure: Default::default(), - } - } -} - -impl From for TopologyWasm { - fn from(topology: ConfigTopology) -> Self { - TopologyWasm { - topology_refresh_rate_ms: topology.topology_refresh_rate.as_millis() as u64, - topology_resolution_timeout_ms: topology.topology_resolution_timeout.as_millis() as u64, - disable_refreshing: topology.disable_refreshing, - } - } -} - -#[wasm_bindgen] -#[derive(Debug, Copy, Clone)] -pub struct ReplySurbsWasm { - /// Defines the minimum number of reply surbs the client wants to keep in its storage at all times. - /// It can only allow to go below that value if its to request additional reply surbs. - pub minimum_reply_surb_storage_threshold: usize, - - /// Defines the maximum number of reply surbs the client wants to keep in its storage at any times. - pub maximum_reply_surb_storage_threshold: usize, - - /// Defines the minimum number of reply surbs the client would request. - pub minimum_reply_surb_request_size: u32, - - /// Defines the maximum number of reply surbs the client would request. - pub maximum_reply_surb_request_size: u32, - - /// Defines the maximum number of reply surbs a remote party is allowed to request from this client at once. - pub maximum_allowed_reply_surb_request_size: u32, - - /// Defines maximum amount of time the client is going to wait for reply surbs before explicitly asking - /// for more even though in theory they wouldn't need to. - pub maximum_reply_surb_rerequest_waiting_period_ms: u64, - - /// Defines maximum amount of time the client is going to wait for reply surbs before - /// deciding it's never going to get them and would drop all pending messages - pub maximum_reply_surb_drop_waiting_period_ms: u64, - - /// Defines maximum amount of time given reply surb is going to be valid for. - /// This is going to be superseded by key rotation once implemented. - pub maximum_reply_surb_age_ms: u64, - - /// Defines maximum amount of time given reply key is going to be valid for. - /// This is going to be superseded by key rotation once implemented. - pub maximum_reply_key_age_ms: u64, -} - -impl From for ConfigReplySurbs { - fn from(reply_surbs: ReplySurbsWasm) -> Self { - ConfigReplySurbs { - minimum_reply_surb_storage_threshold: reply_surbs.minimum_reply_surb_storage_threshold, - maximum_reply_surb_storage_threshold: reply_surbs.maximum_reply_surb_storage_threshold, - minimum_reply_surb_request_size: reply_surbs.minimum_reply_surb_request_size, - maximum_reply_surb_request_size: reply_surbs.maximum_reply_surb_request_size, - maximum_allowed_reply_surb_request_size: reply_surbs - .maximum_allowed_reply_surb_request_size, - maximum_reply_surb_rerequest_waiting_period: Duration::from_millis( - reply_surbs.maximum_reply_surb_rerequest_waiting_period_ms, - ), - maximum_reply_surb_drop_waiting_period: Duration::from_millis( - reply_surbs.maximum_reply_surb_drop_waiting_period_ms, - ), - maximum_reply_surb_age: Duration::from_millis(reply_surbs.maximum_reply_surb_age_ms), - maximum_reply_key_age: Duration::from_millis(reply_surbs.maximum_reply_key_age_ms), - } - } -} - -impl From for ReplySurbsWasm { - fn from(reply_surbs: ConfigReplySurbs) -> Self { - ReplySurbsWasm { - minimum_reply_surb_storage_threshold: reply_surbs.minimum_reply_surb_storage_threshold, - maximum_reply_surb_storage_threshold: reply_surbs.maximum_reply_surb_storage_threshold, - minimum_reply_surb_request_size: reply_surbs.minimum_reply_surb_request_size, - maximum_reply_surb_request_size: reply_surbs.maximum_reply_surb_request_size, - maximum_allowed_reply_surb_request_size: reply_surbs - .maximum_allowed_reply_surb_request_size, - maximum_reply_surb_rerequest_waiting_period_ms: reply_surbs - .maximum_reply_surb_rerequest_waiting_period - .as_millis() as u64, - maximum_reply_surb_drop_waiting_period_ms: reply_surbs - .maximum_reply_surb_drop_waiting_period - .as_millis() as u64, - maximum_reply_surb_age_ms: reply_surbs.maximum_reply_surb_age.as_millis() as u64, - maximum_reply_key_age_ms: reply_surbs.maximum_reply_key_age.as_millis() as u64, - } - } +#[wasm_bindgen(js_name = noCoverDebug)] +pub fn no_cover_debug_obj() -> JsValue { + let dbg = no_cover_debug(); + serde_wasm_bindgen::to_value(&dbg) + .expect("our 'DebugWasm' struct should have had a correctly defined serde implementation") } // just a helper structure to more easily pass through the JS boundary -#[wasm_bindgen] -#[derive(Debug, Copy, Clone)] +#[wasm_bindgen(inspectable)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct DebugWasm { /// Defines all configuration options related to traffic streams. pub traffic: TrafficWasm, @@ -362,6 +110,12 @@ pub struct DebugWasm { pub reply_surbs: ReplySurbsWasm, } +impl Default for DebugWasm { + fn default() -> Self { + ConfigDebug::default().into() + } +} + impl From for ConfigDebug { fn from(debug: DebugWasm) -> Self { ConfigDebug { @@ -388,7 +142,340 @@ impl From for DebugWasm { } } -#[wasm_bindgen] -pub fn default_debug() -> DebugWasm { - ConfigDebug::default().into() +#[wasm_bindgen(inspectable)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct TrafficWasm { + /// The parameter of Poisson distribution determining how long, on average, + /// sent packet is going to be delayed at any given mix node. + /// So for a packet going through three mix nodes, on average, it will take three times this value + /// until the packet reaches its destination. + pub average_packet_delay_ms: u32, + + /// The parameter of Poisson distribution determining how long, on average, + /// it is going to take another 'real traffic stream' message to be sent. + /// If no real packets are available and cover traffic is enabled, + /// a loop cover message is sent instead in order to preserve the rate. + pub message_sending_average_delay_ms: u32, + + /// Controls whether the main packet stream constantly produces packets according to the predefined + /// poisson distribution. + pub disable_main_poisson_packet_distribution: bool, + + /// Controls whether the sent sphinx packet use the NON-DEFAULT bigger size. + pub use_extended_packet_size: bool, + + /// Controls whether the sent packets should use outfox as opposed to the default sphinx. + pub use_outfox: bool, +} + +impl Default for TrafficWasm { + fn default() -> Self { + ConfigTraffic::default().into() + } +} + +impl From for ConfigTraffic { + fn from(traffic: TrafficWasm) -> Self { + let use_extended_packet_size = traffic + .use_extended_packet_size + .then_some(PacketSize::ExtendedPacket32); + + let packet_type = if traffic.use_outfox { + PacketType::Outfox + } else { + PacketType::Mix + }; + + ConfigTraffic { + average_packet_delay: Duration::from_millis(traffic.average_packet_delay_ms as u64), + message_sending_average_delay: Duration::from_millis( + traffic.message_sending_average_delay_ms as u64, + ), + disable_main_poisson_packet_distribution: traffic + .disable_main_poisson_packet_distribution, + primary_packet_size: PacketSize::RegularPacket, + secondary_packet_size: use_extended_packet_size, + packet_type, + } + } +} + +impl From for TrafficWasm { + fn from(traffic: ConfigTraffic) -> Self { + TrafficWasm { + average_packet_delay_ms: traffic.average_packet_delay.as_millis() as u32, + message_sending_average_delay_ms: traffic.message_sending_average_delay.as_millis() + as u32, + disable_main_poisson_packet_distribution: traffic + .disable_main_poisson_packet_distribution, + use_extended_packet_size: traffic.secondary_packet_size.is_some(), + use_outfox: traffic.packet_type == PacketType::Outfox, + } + } +} + +#[wasm_bindgen(inspectable)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct CoverTrafficWasm { + /// The parameter of Poisson distribution determining how long, on average, + /// it is going to take for another loop cover traffic message to be sent. + pub loop_cover_traffic_average_delay_ms: u32, + + /// Specifies the ratio of `primary_packet_size` to `secondary_packet_size` used in cover traffic. + /// Only applicable if `secondary_packet_size` is enabled. + pub cover_traffic_primary_size_ratio: f64, + + /// Controls whether the dedicated loop cover traffic stream should be enabled. + /// (and sending packets, on average, every [Self::loop_cover_traffic_average_delay]) + pub disable_loop_cover_traffic_stream: bool, +} + +impl Default for CoverTrafficWasm { + fn default() -> Self { + ConfigCoverTraffic::default().into() + } +} + +impl From for ConfigCoverTraffic { + fn from(cover_traffic: CoverTrafficWasm) -> Self { + ConfigCoverTraffic { + loop_cover_traffic_average_delay: Duration::from_millis( + cover_traffic.loop_cover_traffic_average_delay_ms as u64, + ), + cover_traffic_primary_size_ratio: cover_traffic.cover_traffic_primary_size_ratio, + disable_loop_cover_traffic_stream: cover_traffic.disable_loop_cover_traffic_stream, + } + } +} + +impl From for CoverTrafficWasm { + fn from(cover_traffic: ConfigCoverTraffic) -> Self { + CoverTrafficWasm { + loop_cover_traffic_average_delay_ms: cover_traffic + .loop_cover_traffic_average_delay + .as_millis() as u32, + cover_traffic_primary_size_ratio: cover_traffic.cover_traffic_primary_size_ratio, + disable_loop_cover_traffic_stream: cover_traffic.disable_loop_cover_traffic_stream, + } + } +} + +#[wasm_bindgen(inspectable)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct GatewayConnectionWasm { + /// How long we're willing to wait for a response to a message sent to the gateway, + /// before giving up on it. + pub gateway_response_timeout_ms: u32, +} + +impl Default for GatewayConnectionWasm { + fn default() -> Self { + ConfigGatewayConnection::default().into() + } +} + +impl From for ConfigGatewayConnection { + fn from(gateway_connection: GatewayConnectionWasm) -> Self { + ConfigGatewayConnection { + gateway_response_timeout: Duration::from_millis( + gateway_connection.gateway_response_timeout_ms as u64, + ), + } + } +} + +impl From for GatewayConnectionWasm { + fn from(gateway_connection: ConfigGatewayConnection) -> Self { + GatewayConnectionWasm { + gateway_response_timeout_ms: gateway_connection.gateway_response_timeout.as_millis() + as u32, + } + } +} + +#[wasm_bindgen(inspectable)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct AcknowledgementsWasm { + /// The parameter of Poisson distribution determining how long, on average, + /// sent acknowledgement is going to be delayed at any given mix node. + /// So for an ack going through three mix nodes, on average, it will take three times this value + /// until the packet reaches its destination. + pub average_ack_delay_ms: u32, + + /// Value multiplied with the expected round trip time of an acknowledgement packet before + /// it is assumed it was lost and retransmission of the data packet happens. + /// In an ideal network with 0 latency, this value would have been 1. + pub ack_wait_multiplier: f64, + + /// Value added to the expected round trip time of an acknowledgement packet before + /// it is assumed it was lost and retransmission of the data packet happens. + /// In an ideal network with 0 latency, this value would have been 0. + pub ack_wait_addition_ms: u32, +} + +impl Default for AcknowledgementsWasm { + fn default() -> Self { + ConfigAcknowledgements::default().into() + } +} + +impl From for ConfigAcknowledgements { + fn from(acknowledgements: AcknowledgementsWasm) -> Self { + ConfigAcknowledgements { + average_ack_delay: Duration::from_millis(acknowledgements.average_ack_delay_ms as u64), + ack_wait_multiplier: acknowledgements.ack_wait_multiplier, + ack_wait_addition: Duration::from_millis(acknowledgements.ack_wait_addition_ms as u64), + } + } +} + +impl From for AcknowledgementsWasm { + fn from(acknowledgements: ConfigAcknowledgements) -> Self { + AcknowledgementsWasm { + average_ack_delay_ms: acknowledgements.average_ack_delay.as_millis() as u32, + ack_wait_multiplier: acknowledgements.ack_wait_multiplier, + ack_wait_addition_ms: acknowledgements.ack_wait_addition.as_millis() as u32, + } + } +} + +#[wasm_bindgen(inspectable)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct TopologyWasm { + /// The uniform delay every which clients are querying the directory server + /// to try to obtain a compatible network topology to send sphinx packets through. + pub topology_refresh_rate_ms: u32, + + /// During topology refresh, test packets are sent through every single possible network + /// path. This timeout determines waiting period until it is decided that the packet + /// did not reach its destination. + pub topology_resolution_timeout_ms: u32, + + /// Specifies whether the client should not refresh the network topology after obtaining + /// the first valid instance. + /// Supersedes `topology_refresh_rate_ms`. + pub disable_refreshing: bool, +} + +impl Default for TopologyWasm { + fn default() -> Self { + ConfigTopology::default().into() + } +} + +impl From for ConfigTopology { + fn from(topology: TopologyWasm) -> Self { + ConfigTopology { + topology_refresh_rate: Duration::from_millis(topology.topology_refresh_rate_ms as u64), + topology_resolution_timeout: Duration::from_millis( + topology.topology_resolution_timeout_ms as u64, + ), + disable_refreshing: topology.disable_refreshing, + topology_structure: Default::default(), + } + } +} + +impl From for TopologyWasm { + fn from(topology: ConfigTopology) -> Self { + TopologyWasm { + topology_refresh_rate_ms: topology.topology_refresh_rate.as_millis() as u32, + topology_resolution_timeout_ms: topology.topology_resolution_timeout.as_millis() as u32, + disable_refreshing: topology.disable_refreshing, + } + } +} + +#[wasm_bindgen(inspectable)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct ReplySurbsWasm { + /// Defines the minimum number of reply surbs the client wants to keep in its storage at all times. + /// It can only allow to go below that value if its to request additional reply surbs. + pub minimum_reply_surb_storage_threshold: usize, + + /// Defines the maximum number of reply surbs the client wants to keep in its storage at any times. + pub maximum_reply_surb_storage_threshold: usize, + + /// Defines the minimum number of reply surbs the client would request. + pub minimum_reply_surb_request_size: u32, + + /// Defines the maximum number of reply surbs the client would request. + pub maximum_reply_surb_request_size: u32, + + /// Defines the maximum number of reply surbs a remote party is allowed to request from this client at once. + pub maximum_allowed_reply_surb_request_size: u32, + + /// Defines maximum amount of time the client is going to wait for reply surbs before explicitly asking + /// for more even though in theory they wouldn't need to. + pub maximum_reply_surb_rerequest_waiting_period_ms: u32, + + /// Defines maximum amount of time the client is going to wait for reply surbs before + /// deciding it's never going to get them and would drop all pending messages + pub maximum_reply_surb_drop_waiting_period_ms: u32, + + /// Defines maximum amount of time given reply surb is going to be valid for. + /// This is going to be superseded by key rotation once implemented. + pub maximum_reply_surb_age_ms: u32, + + /// Defines maximum amount of time given reply key is going to be valid for. + /// This is going to be superseded by key rotation once implemented. + pub maximum_reply_key_age_ms: u32, +} + +impl Default for ReplySurbsWasm { + fn default() -> Self { + ConfigReplySurbs::default().into() + } +} + +impl From for ConfigReplySurbs { + fn from(reply_surbs: ReplySurbsWasm) -> Self { + ConfigReplySurbs { + minimum_reply_surb_storage_threshold: reply_surbs.minimum_reply_surb_storage_threshold, + maximum_reply_surb_storage_threshold: reply_surbs.maximum_reply_surb_storage_threshold, + minimum_reply_surb_request_size: reply_surbs.minimum_reply_surb_request_size, + maximum_reply_surb_request_size: reply_surbs.maximum_reply_surb_request_size, + maximum_allowed_reply_surb_request_size: reply_surbs + .maximum_allowed_reply_surb_request_size, + maximum_reply_surb_rerequest_waiting_period: Duration::from_millis( + reply_surbs.maximum_reply_surb_rerequest_waiting_period_ms as u64, + ), + maximum_reply_surb_drop_waiting_period: Duration::from_millis( + reply_surbs.maximum_reply_surb_drop_waiting_period_ms as u64, + ), + maximum_reply_surb_age: Duration::from_millis( + reply_surbs.maximum_reply_surb_age_ms as u64, + ), + maximum_reply_key_age: Duration::from_millis( + reply_surbs.maximum_reply_key_age_ms as u64, + ), + } + } +} + +impl From for ReplySurbsWasm { + fn from(reply_surbs: ConfigReplySurbs) -> Self { + ReplySurbsWasm { + minimum_reply_surb_storage_threshold: reply_surbs.minimum_reply_surb_storage_threshold, + maximum_reply_surb_storage_threshold: reply_surbs.maximum_reply_surb_storage_threshold, + minimum_reply_surb_request_size: reply_surbs.minimum_reply_surb_request_size, + maximum_reply_surb_request_size: reply_surbs.maximum_reply_surb_request_size, + maximum_allowed_reply_surb_request_size: reply_surbs + .maximum_allowed_reply_surb_request_size, + maximum_reply_surb_rerequest_waiting_period_ms: reply_surbs + .maximum_reply_surb_rerequest_waiting_period + .as_millis() as u32, + maximum_reply_surb_drop_waiting_period_ms: reply_surbs + .maximum_reply_surb_drop_waiting_period + .as_millis() as u32, + maximum_reply_surb_age_ms: reply_surbs.maximum_reply_surb_age.as_millis() as u32, + maximum_reply_key_age_ms: reply_surbs.maximum_reply_key_age.as_millis() as u32, + } + } } diff --git a/common/wasm/client-core/src/config/override.rs b/common/wasm/client-core/src/config/override.rs new file mode 100644 index 0000000000..20f3f0cf2a --- /dev/null +++ b/common/wasm/client-core/src/config/override.rs @@ -0,0 +1,334 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use super::{ + AcknowledgementsWasm, CoverTrafficWasm, DebugWasm, GatewayConnectionWasm, ReplySurbsWasm, + TopologyWasm, TrafficWasm, +}; +use crate::config::ConfigDebug; +use serde::{Deserialize, Serialize}; +use tsify::Tsify; + +// just a helper structure to more easily pass through the JS boundary +#[derive(Tsify, Debug, Copy, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct DebugWasmOverride { + /// Defines all configuration options related to traffic streams. + #[tsify(optional)] + pub traffic: Option, + + /// Defines all configuration options related to cover traffic stream(s). + #[tsify(optional)] + pub cover_traffic: Option, + + /// Defines all configuration options related to the gateway connection. + #[tsify(optional)] + pub gateway_connection: Option, + + /// Defines all configuration options related to acknowledgements, such as delays or wait timeouts. + #[tsify(optional)] + pub acknowledgements: Option, + + /// Defines all configuration options related topology, such as refresh rates or timeouts. + #[tsify(optional)] + pub topology: Option, + + /// Defines all configuration options related to reply SURBs. + #[tsify(optional)] + pub reply_surbs: Option, +} + +impl From for DebugWasm { + fn from(value: DebugWasmOverride) -> Self { + DebugWasm { + traffic: value.traffic.map(Into::into).unwrap_or_default(), + cover_traffic: value.cover_traffic.map(Into::into).unwrap_or_default(), + gateway_connection: value.gateway_connection.map(Into::into).unwrap_or_default(), + acknowledgements: value.acknowledgements.map(Into::into).unwrap_or_default(), + topology: value.topology.map(Into::into).unwrap_or_default(), + reply_surbs: value.reply_surbs.map(Into::into).unwrap_or_default(), + } + } +} + +impl From for ConfigDebug { + fn from(value: DebugWasmOverride) -> Self { + let debug_wasm: DebugWasm = value.into(); + debug_wasm.into() + } +} + +#[derive(Tsify, Debug, Copy, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct TrafficWasmOverride { + /// The parameter of Poisson distribution determining how long, on average, + /// sent packet is going to be delayed at any given mix node. + /// So for a packet going through three mix nodes, on average, it will take three times this value + /// until the packet reaches its destination. + #[tsify(optional)] + pub average_packet_delay_ms: Option, + + /// The parameter of Poisson distribution determining how long, on average, + /// it is going to take another 'real traffic stream' message to be sent. + /// If no real packets are available and cover traffic is enabled, + /// a loop cover message is sent instead in order to preserve the rate. + #[tsify(optional)] + pub message_sending_average_delay_ms: Option, + + /// Controls whether the main packet stream constantly produces packets according to the predefined + /// poisson distribution. + #[tsify(optional)] + pub disable_main_poisson_packet_distribution: Option, + + /// Controls whether the sent sphinx packet use the NON-DEFAULT bigger size. + #[tsify(optional)] + pub use_extended_packet_size: Option, + + /// Controls whether the sent packets should use outfox as opposed to the default sphinx. + #[tsify(optional)] + pub use_outfox: Option, +} + +impl From for TrafficWasm { + fn from(value: TrafficWasmOverride) -> Self { + let def = TrafficWasm::default(); + + TrafficWasm { + average_packet_delay_ms: value + .average_packet_delay_ms + .unwrap_or(def.average_packet_delay_ms), + message_sending_average_delay_ms: value + .message_sending_average_delay_ms + .unwrap_or(def.message_sending_average_delay_ms), + disable_main_poisson_packet_distribution: value + .disable_main_poisson_packet_distribution + .unwrap_or(def.disable_main_poisson_packet_distribution), + use_extended_packet_size: value + .use_extended_packet_size + .unwrap_or(def.use_extended_packet_size), + use_outfox: value.use_outfox.unwrap_or(def.use_outfox), + } + } +} + +#[derive(Tsify, Debug, Copy, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct CoverTrafficWasmOverride { + /// The parameter of Poisson distribution determining how long, on average, + /// it is going to take for another loop cover traffic message to be sent. + #[tsify(optional)] + pub loop_cover_traffic_average_delay_ms: Option, + + /// Specifies the ratio of `primary_packet_size` to `secondary_packet_size` used in cover traffic. + /// Only applicable if `secondary_packet_size` is enabled. + #[tsify(optional)] + pub cover_traffic_primary_size_ratio: Option, + + /// Controls whether the dedicated loop cover traffic stream should be enabled. + /// (and sending packets, on average, every [Self::loop_cover_traffic_average_delay]) + #[tsify(optional)] + pub disable_loop_cover_traffic_stream: Option, +} + +impl From for CoverTrafficWasm { + fn from(value: CoverTrafficWasmOverride) -> Self { + let def = CoverTrafficWasm::default(); + + CoverTrafficWasm { + loop_cover_traffic_average_delay_ms: value + .loop_cover_traffic_average_delay_ms + .unwrap_or(def.loop_cover_traffic_average_delay_ms), + cover_traffic_primary_size_ratio: value + .cover_traffic_primary_size_ratio + .unwrap_or(def.cover_traffic_primary_size_ratio), + disable_loop_cover_traffic_stream: value + .disable_loop_cover_traffic_stream + .unwrap_or(def.disable_loop_cover_traffic_stream), + } + } +} + +#[derive(Tsify, Debug, Copy, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct GatewayConnectionWasmOverride { + /// How long we're willing to wait for a response to a message sent to the gateway, + /// before giving up on it. + #[tsify(optional)] + pub gateway_response_timeout_ms: Option, +} + +impl From for GatewayConnectionWasm { + fn from(value: GatewayConnectionWasmOverride) -> Self { + let def = GatewayConnectionWasm::default(); + + GatewayConnectionWasm { + gateway_response_timeout_ms: value + .gateway_response_timeout_ms + .unwrap_or(def.gateway_response_timeout_ms), + } + } +} + +#[derive(Tsify, Debug, Copy, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct AcknowledgementsWasmOverride { + /// The parameter of Poisson distribution determining how long, on average, + /// sent acknowledgement is going to be delayed at any given mix node. + /// So for an ack going through three mix nodes, on average, it will take three times this value + /// until the packet reaches its destination. + #[tsify(optional)] + pub average_ack_delay_ms: Option, + + /// Value multiplied with the expected round trip time of an acknowledgement packet before + /// it is assumed it was lost and retransmission of the data packet happens. + /// In an ideal network with 0 latency, this value would have been 1. + #[tsify(optional)] + pub ack_wait_multiplier: Option, + + /// Value added to the expected round trip time of an acknowledgement packet before + /// it is assumed it was lost and retransmission of the data packet happens. + /// In an ideal network with 0 latency, this value would have been 0. + #[tsify(optional)] + pub ack_wait_addition_ms: Option, +} + +impl From for AcknowledgementsWasm { + fn from(value: AcknowledgementsWasmOverride) -> Self { + let def = AcknowledgementsWasm::default(); + + AcknowledgementsWasm { + average_ack_delay_ms: value + .average_ack_delay_ms + .unwrap_or(def.average_ack_delay_ms), + ack_wait_multiplier: value.ack_wait_multiplier.unwrap_or(def.ack_wait_multiplier), + ack_wait_addition_ms: value + .ack_wait_addition_ms + .unwrap_or(def.ack_wait_addition_ms), + } + } +} + +#[derive(Tsify, Debug, Copy, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct TopologyWasmOverride { + /// The uniform delay every which clients are querying the directory server + /// to try to obtain a compatible network topology to send sphinx packets through. + #[tsify(optional)] + pub topology_refresh_rate_ms: Option, + + /// During topology refresh, test packets are sent through every single possible network + /// path. This timeout determines waiting period until it is decided that the packet + /// did not reach its destination. + #[tsify(optional)] + pub topology_resolution_timeout_ms: Option, + + /// Specifies whether the client should not refresh the network topology after obtaining + /// the first valid instance. + /// Supersedes `topology_refresh_rate_ms`. + #[tsify(optional)] + pub disable_refreshing: Option, +} + +impl From for TopologyWasm { + fn from(value: TopologyWasmOverride) -> Self { + let def = TopologyWasm::default(); + + TopologyWasm { + topology_refresh_rate_ms: value + .topology_refresh_rate_ms + .unwrap_or(def.topology_refresh_rate_ms), + topology_resolution_timeout_ms: value + .topology_resolution_timeout_ms + .unwrap_or(def.topology_resolution_timeout_ms), + disable_refreshing: value.disable_refreshing.unwrap_or(def.disable_refreshing), + } + } +} + +#[derive(Tsify, Debug, Copy, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct ReplySurbsWasmOverride { + /// Defines the minimum number of reply surbs the client wants to keep in its storage at all times. + /// It can only allow to go below that value if its to request additional reply surbs. + #[tsify(optional)] + pub minimum_reply_surb_storage_threshold: Option, + + /// Defines the maximum number of reply surbs the client wants to keep in its storage at any times. + #[tsify(optional)] + pub maximum_reply_surb_storage_threshold: Option, + + /// Defines the minimum number of reply surbs the client would request. + #[tsify(optional)] + pub minimum_reply_surb_request_size: Option, + + /// Defines the maximum number of reply surbs the client would request. + #[tsify(optional)] + pub maximum_reply_surb_request_size: Option, + + /// Defines the maximum number of reply surbs a remote party is allowed to request from this client at once. + #[tsify(optional)] + pub maximum_allowed_reply_surb_request_size: Option, + + /// Defines maximum amount of time the client is going to wait for reply surbs before explicitly asking + /// for more even though in theory they wouldn't need to. + #[tsify(optional)] + pub maximum_reply_surb_rerequest_waiting_period_ms: Option, + + /// Defines maximum amount of time the client is going to wait for reply surbs before + /// deciding it's never going to get them and would drop all pending messages + #[tsify(optional)] + pub maximum_reply_surb_drop_waiting_period_ms: Option, + + /// Defines maximum amount of time given reply surb is going to be valid for. + /// This is going to be superseded by key rotation once implemented. + #[tsify(optional)] + pub maximum_reply_surb_age_ms: Option, + + /// Defines maximum amount of time given reply key is going to be valid for. + /// This is going to be superseded by key rotation once implemented. + #[tsify(optional)] + pub maximum_reply_key_age_ms: Option, +} + +impl From for ReplySurbsWasm { + fn from(value: ReplySurbsWasmOverride) -> Self { + let def = ReplySurbsWasm::default(); + + ReplySurbsWasm { + minimum_reply_surb_storage_threshold: value + .minimum_reply_surb_storage_threshold + .unwrap_or(def.minimum_reply_surb_storage_threshold), + maximum_reply_surb_storage_threshold: value + .maximum_reply_surb_storage_threshold + .unwrap_or(def.maximum_reply_surb_storage_threshold), + minimum_reply_surb_request_size: value + .minimum_reply_surb_request_size + .unwrap_or(def.minimum_reply_surb_request_size), + maximum_reply_surb_request_size: value + .maximum_reply_surb_request_size + .unwrap_or(def.maximum_reply_surb_request_size), + maximum_allowed_reply_surb_request_size: value + .maximum_allowed_reply_surb_request_size + .unwrap_or(def.maximum_allowed_reply_surb_request_size), + maximum_reply_surb_rerequest_waiting_period_ms: value + .maximum_reply_surb_rerequest_waiting_period_ms + .unwrap_or(def.maximum_reply_surb_rerequest_waiting_period_ms), + maximum_reply_surb_drop_waiting_period_ms: value + .maximum_reply_surb_drop_waiting_period_ms + .unwrap_or(def.maximum_reply_surb_drop_waiting_period_ms), + maximum_reply_surb_age_ms: value + .maximum_reply_surb_age_ms + .unwrap_or(def.maximum_reply_surb_age_ms), + maximum_reply_key_age_ms: value + .maximum_reply_key_age_ms + .unwrap_or(def.maximum_reply_key_age_ms), + } + } +} diff --git a/clients/webassembly/src/error.rs b/common/wasm/client-core/src/error.rs similarity index 73% rename from clients/webassembly/src/error.rs rename to common/wasm/client-core/src/error.rs index 9cf2369994..01cbbcd757 100644 --- a/clients/webassembly/src/error.rs +++ b/common/wasm/client-core/src/error.rs @@ -1,30 +1,22 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::storage::error::ClientStorageError; +use crate::storage::wasm_client_traits::WasmClientStorageError; use crate::topology::WasmTopologyError; use js_sys::Promise; use nym_client_core::config::GatewayEndpointConfig; use nym_client_core::error::ClientCoreError; use nym_crypto::asymmetric::identity::Ed25519RecoveryError; use nym_gateway_client::error::GatewayClientError; -use nym_node_tester_utils::error::NetworkTestingError; use nym_sphinx::addressing::clients::RecipientFormattingError; use nym_sphinx::anonymous_replies::requests::InvalidAnonymousSenderTagRepresentation; use nym_topology::NymTopologyError; use nym_validator_client::ValidatorClientError; use thiserror::Error; -use wasm_bindgen::JsValue; -use wasm_utils::simple_js_error; +use wasm_utils::wasm_error; -// might as well start using well-defined error enum... #[derive(Debug, Error)] -pub enum WasmClientError { - #[error( - "A node test is already in progress. Wait for it to finish before starting another one." - )] - TestInProgress, - +pub enum WasmCoreError { #[error("experienced an issue with internal client components: {source}")] BaseClientError { #[from] @@ -58,12 +50,6 @@ pub enum WasmClientError { source: NymTopologyError, }, - #[error("failed to test the node: {source}")] - NodeTestingFailure { - #[from] - source: NetworkTestingError, - }, - #[error("{raw} is not a valid url: {source}")] MalformedUrl { raw: String, @@ -92,9 +78,15 @@ pub enum WasmClientError { }, #[error(transparent)] - StorageError { + BaseStorageError { #[from] - source: ClientStorageError, + source: wasm_storage::error::StorageError, + }, + + #[error(transparent)] + ClientStorageError { + #[from] + source: WasmClientStorageError, }, #[error("this client has already registered with a gateway: {gateway_config:?}")] @@ -103,20 +95,4 @@ pub enum WasmClientError { }, } -impl WasmClientError { - pub fn into_rejected_promise(self) -> Promise { - self.into() - } -} - -impl From for JsValue { - fn from(value: WasmClientError) -> Self { - simple_js_error(value.to_string()) - } -} - -impl From for Promise { - fn from(value: WasmClientError) -> Self { - Promise::reject(&value.into()) - } -} +wasm_error!(WasmCoreError); diff --git a/clients/webassembly/src/helpers.rs b/common/wasm/client-core/src/helpers.rs similarity index 72% rename from clients/webassembly/src/helpers.rs rename to common/wasm/client-core/src/helpers.rs index 68831dd19b..e6aacfe2b7 100644 --- a/clients/webassembly/src/helpers.rs +++ b/common/wasm/client-core/src/helpers.rs @@ -1,7 +1,8 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::error::WasmClientError; +use crate::error::WasmCoreError; +use crate::storage::wasm_client_traits::WasmClientStorage; use crate::storage::ClientStorage; use crate::topology::WasmNymTopology; use js_sys::Promise; @@ -18,44 +19,44 @@ use rand::thread_rng; use url::Url; use wasm_bindgen::prelude::wasm_bindgen; use wasm_bindgen_futures::future_to_promise; -use wasm_utils::PromisableResult; +use wasm_utils::error::PromisableResult; + +pub use nym_credential_storage::ephemeral_storage::EphemeralStorage as EphemeralCredentialStorage; // don't get too excited about the name, under the hood it's just a big fat placeholder // with no disk_persistence -pub(crate) fn setup_reply_surb_storage_backend( - config: config::ReplySurbs, -) -> browser_backend::Backend { +pub fn setup_reply_surb_storage_backend(config: config::ReplySurbs) -> browser_backend::Backend { browser_backend::Backend::new( config.minimum_reply_surb_storage_threshold, config.maximum_reply_surb_storage_threshold, ) } -pub(crate) fn parse_recipient(recipient: &str) -> Result { +pub fn parse_recipient(recipient: &str) -> Result { Recipient::try_from_base58_string(recipient).map_err(|source| { - WasmClientError::MalformedRecipient { + WasmCoreError::MalformedRecipient { raw: recipient.to_string(), source, } }) } -pub(crate) fn parse_sender_tag(tag: &str) -> Result { +pub fn parse_sender_tag(tag: &str) -> Result { AnonymousSenderTag::try_from_base58_string(tag).map_err(|source| { - WasmClientError::MalformedSenderTag { + WasmCoreError::MalformedSenderTag { raw: tag.to_string(), source, } }) } -pub(crate) async fn current_network_topology_async( +pub async fn current_network_topology_async( nym_api_url: String, -) -> Result { +) -> Result { let url: Url = match nym_api_url.parse() { Ok(url) => url, Err(source) => { - return Err(WasmClientError::MalformedUrl { + return Err(WasmCoreError::MalformedUrl { raw: nym_api_url, source, }) @@ -69,11 +70,13 @@ pub(crate) async fn current_network_topology_async( Ok(NymTopology::from_detailed(mixnodes, gateways).into()) } -#[wasm_bindgen] +#[wasm_bindgen(js_name = "currentNetworkTopology")] pub fn current_network_topology(nym_api_url: String) -> Promise { + // blame js for that serde conversion future_to_promise(async move { current_network_topology_async(nym_api_url) .await + .map(|topology| serde_wasm_bindgen::to_value(&topology).unwrap()) .into_promise_result() }) } @@ -82,7 +85,7 @@ async fn setup_gateway( client_store: &ClientStorage, chosen_gateway: Option, gateways: &[gateway::Node], -) -> Result { +) -> Result { let setup = if client_store.has_full_gateway_info().await? { GatewaySetup::MustLoad } else { @@ -94,21 +97,21 @@ async fn setup_gateway( .map_err(Into::into) } -pub(crate) async fn setup_gateway_from_api( +pub async fn setup_gateway_from_api( client_store: &ClientStorage, chosen_gateway: Option, nym_apis: &[Url], -) -> Result { +) -> Result { let mut rng = thread_rng(); let gateways = current_gateways(&mut rng, nym_apis).await?; setup_gateway(client_store, chosen_gateway, &gateways).await } -pub(crate) async fn setup_from_topology( +pub async fn setup_from_topology( explicit_gateway: Option, topology: &NymTopology, client_store: &ClientStorage, -) -> Result { +) -> Result { let gateways = topology.gateways(); setup_gateway(client_store, explicit_gateway, gateways).await } diff --git a/common/wasm/client-core/src/lib.rs b/common/wasm/client-core/src/lib.rs new file mode 100644 index 0000000000..3ca34fd2a1 --- /dev/null +++ b/common/wasm/client-core/src/lib.rs @@ -0,0 +1,55 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +// that's so stupid... +#[cfg(target_arch = "wasm32")] +pub mod config; + +#[cfg(target_arch = "wasm32")] +pub mod error; + +#[cfg(target_arch = "wasm32")] +pub mod helpers; + +#[cfg(target_arch = "wasm32")] +pub mod storage; + +#[cfg(target_arch = "wasm32")] +pub mod topology; + +// re-export types for ease of use +pub use nym_bandwidth_controller::BandwidthController; +pub use nym_client_core::*; +pub use nym_client_core::{ + client::key_manager::ManagedKeys, + error::ClientCoreError, + init::{InitialisationDetails, InitialisationResult}, +}; +pub use nym_gateway_client::{error::GatewayClientError, GatewayClient}; +pub use nym_sphinx::{ + addressing::{clients::Recipient, nodes::NodeIdentity}, + params::PacketType, + receiver::ReconstructedMessage, +}; +pub use nym_task; +pub use nym_topology::{HardcodedTopologyProvider, MixLayer, NymTopology, TopologyProvider}; +pub use nym_validator_client::nym_api::Client as ApiClient; +pub use nym_validator_client::{DirectSigningReqwestRpcNyxdClient, QueryReqwestRpcNyxdClient}; +// TODO: that's a very nasty import path. it should come from contracts instead! +pub use nym_validator_client::client::IdentityKey; + +#[cfg(target_arch = "wasm32")] +use wasm_bindgen::prelude::*; + +#[cfg(target_arch = "wasm32")] +#[wasm_bindgen] +pub fn set_panic_hook() { + // When the `console_error_panic_hook` feature is enabled, we can call the + // `set_panic_hook` function at least once during initialization, and then + // we will get better error messages if our code ever panics. + // + // For more details see + // https://github.com/rustwasm/console_error_panic_hook#readme + #[cfg(feature = "console_error_panic_hook")] + console_error_panic_hook::set_once(); +} diff --git a/clients/webassembly/src/storage/traits.rs b/common/wasm/client-core/src/storage/core_client_traits.rs similarity index 80% rename from clients/webassembly/src/storage/traits.rs rename to common/wasm/client-core/src/storage/core_client_traits.rs index f4a4c35742..0a0114d55c 100644 --- a/clients/webassembly/src/storage/traits.rs +++ b/common/wasm/client-core/src/storage/core_client_traits.rs @@ -1,7 +1,10 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::storage::error::ClientStorageError; +use crate::config::BaseClientConfig; +use crate::error::WasmCoreError; +use crate::helpers::setup_reply_surb_storage_backend; +use crate::storage::wasm_client_traits::WasmClientStorage; use crate::storage::ClientStorage; use async_trait::async_trait; use nym_client_core::client::base_client::storage::gateway_details::{ @@ -22,6 +25,17 @@ pub struct FullWasmClientStorage { pub(crate) credential_storage: EphemeralCredentialStorage, } +impl FullWasmClientStorage { + // TODO: I dont like that base_config type, it should be something wasm-specific. + pub fn new(base_config: &BaseClientConfig, base_storage: ClientStorage) -> Self { + FullWasmClientStorage { + keys_and_gateway_store: base_storage, + reply_storage: setup_reply_surb_storage_backend(base_config.debug.reply_surbs), + credential_storage: EphemeralCredentialStorage::default(), + } + } +} + impl MixnetClientStorage for FullWasmClientStorage { type KeyStore = ClientStorage; type ReplyStore = browser_backend::Backend; @@ -52,7 +66,7 @@ impl MixnetClientStorage for FullWasmClientStorage { #[async_trait(?Send)] impl KeyStore for ClientStorage { - type StorageError = ClientStorageError; + type StorageError = WasmCoreError; async fn load_keys(&self) -> Result { console_log!("attempting to load cryptographic keys..."); @@ -86,7 +100,7 @@ impl KeyStore for ClientStorage { #[async_trait(?Send)] impl GatewayDetailsStore for ClientStorage { - type StorageError = ClientStorageError; + type StorageError = WasmCoreError; async fn load_gateway_details(&self) -> Result { self.must_read_gateway_details().await @@ -96,6 +110,6 @@ impl GatewayDetailsStore for ClientStorage { &self, details: &PersistedGatewayDetails, ) -> Result<(), Self::StorageError> { - self.store_gateway_details(details).await + ::store_gateway_details(self, details).await } } diff --git a/common/wasm/client-core/src/storage/mod.rs b/common/wasm/client-core/src/storage/mod.rs new file mode 100644 index 0000000000..c94e8fc599 --- /dev/null +++ b/common/wasm/client-core/src/storage/mod.rs @@ -0,0 +1,151 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::error::WasmCoreError; +use crate::storage::wasm_client_traits::{v1, WasmClientStorage}; +use async_trait::async_trait; +use js_sys::{Array, Promise}; +use serde::de::DeserializeOwned; +use serde::Serialize; +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::future_to_promise; +use wasm_storage::traits::BaseWasmStorage; +use wasm_storage::{IdbVersionChangeEvent, WasmStorage}; +use wasm_utils::error::PromisableResult; +use zeroize::Zeroizing; + +pub mod core_client_traits; +pub mod wasm_client_traits; + +const STORAGE_NAME_PREFIX: &str = "wasm-client-storage"; +const STORAGE_VERSION: u32 = 1; + +#[wasm_bindgen] +pub struct ClientStorage { + #[allow(dead_code)] + pub(crate) name: String, + pub(crate) inner: WasmStorage, +} + +#[wasm_bindgen] +impl ClientStorage { + fn db_name(client_id: &str) -> String { + format!("{STORAGE_NAME_PREFIX}-{client_id}") + } + + pub async fn new_async( + client_id: &str, + passphrase: Option, + ) -> Result { + let name = Self::db_name(client_id); + + // make sure the password is zeroized when no longer used, especially if we error out. + // special care must be taken on JS side to ensure it's correctly used there. + let passphrase = Zeroizing::new(passphrase); + + let migrate_fn = Some(|evt: &IdbVersionChangeEvent| -> Result<(), JsValue> { + // Even if the web-sys bindings expose the version as a f64, the IndexedDB API + // works with an unsigned integer. + // See + let old_version = evt.old_version() as u32; + + if old_version < 1 { + // migrating to version 1 + let db = evt.db(); + + db.create_object_store(v1::KEYS_STORE)?; + db.create_object_store(v1::CORE_STORE)?; + } + + Ok(()) + }); + + let inner = WasmStorage::new( + &name, + STORAGE_VERSION, + migrate_fn, + passphrase.as_ref().map(|p| p.as_bytes()), + ) + .await?; + + Ok(ClientStorage { inner, name }) + } + + #[wasm_bindgen(constructor)] + #[allow(clippy::new_ret_no_self)] + pub fn new(client_id: String, passphrase: String) -> Promise { + future_to_promise(async move { + Self::new_async(&client_id, Some(passphrase)) + .await + .into_promise_result() + }) + } + + pub fn new_unencrypted(client_id: String) -> Promise { + future_to_promise(async move { + Self::new_async(&client_id, None) + .await + .into_promise_result() + }) + } +} + +#[async_trait(?Send)] +impl BaseWasmStorage for ClientStorage { + type StorageError = WasmCoreError; + + async fn exists(db_name: &str) -> Result { + Ok(WasmStorage::exists(db_name).await?) + } + + async fn read_value(&self, store: &str, key: K) -> Result, Self::StorageError> + where + T: DeserializeOwned, + K: JsCast, + { + Ok(self.inner.read_value(store, key).await?) + } + + async fn store_value( + &self, + store: &str, + key: K, + value: &T, + ) -> Result<(), Self::StorageError> + where + T: Serialize, + K: JsCast, + { + Ok(self.inner.store_value(store, key, value).await?) + } + + async fn remove_value(&self, store: &str, key: K) -> Result<(), Self::StorageError> + where + K: JsCast, + { + Ok(self.inner.remove_value(store, key).await?) + } + + async fn has_value(&self, store: &str, key: K) -> Result + where + K: JsCast, + { + Ok(self.inner.has_value(store, key).await?) + } + + async fn key_count(&self, store: &str, key: K) -> Result + where + K: JsCast, + { + Ok(self.inner.key_count(store, key).await?) + } + + async fn get_all_keys(&self, store: &str) -> Result { + Ok(self.inner.get_all_keys(store).await?) + } +} + +#[async_trait(?Send)] +impl WasmClientStorage for ClientStorage { + type StorageError = WasmCoreError; +} diff --git a/common/wasm/client-core/src/storage/wasm_client_traits.rs b/common/wasm/client-core/src/storage/wasm_client_traits.rs new file mode 100644 index 0000000000..83e0ca1340 --- /dev/null +++ b/common/wasm/client-core/src/storage/wasm_client_traits.rs @@ -0,0 +1,220 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use async_trait::async_trait; +use nym_client_core::client::base_client::storage::gateway_details::PersistedGatewayDetails; +use nym_crypto::asymmetric::{encryption, identity}; +use nym_gateway_client::SharedKeys; +use nym_sphinx_acknowledgements::AckKey; +use std::error::Error; +use thiserror::Error; +use wasm_bindgen::JsValue; +use wasm_storage::traits::BaseWasmStorage; + +// v1 tables +pub(crate) mod v1 { + // stores + pub const KEYS_STORE: &str = "keys"; + pub const CORE_STORE: &str = "core"; + + // keys + // pub const CONFIG: &str = "config"; + pub const GATEWAY_DETAILS: &str = "gateway_details"; + + pub const ED25519_IDENTITY_KEYPAIR: &str = "ed25519_identity_keypair"; + pub const X25519_ENCRYPTION_KEYPAIR: &str = "x25519_encryption_keypair"; + + // TODO: for those we could actually use the subtle crypto storage + pub const AES128CTR_ACK_KEY: &str = "aes128ctr_ack_key"; + pub const AES128CTR_BLAKE3_HMAC_GATEWAY_KEYS: &str = "aes128ctr_blake3_hmac_gateway_keys"; +} + +#[derive(Debug, Error)] +pub enum WasmClientStorageError { + #[error("{typ} cryptographic key is not available in storage")] + CryptoKeyNotInStorage { typ: String }, + + #[error("the prior gateway details are not available in the storage")] + GatewayDetailsNotInStorage, +} + +#[async_trait(?Send)] +pub trait WasmClientStorage: BaseWasmStorage { + type StorageError: Error + + From<::StorageError> + + From; + + async fn may_read_gateway_details( + &self, + ) -> Result, ::StorageError> { + self.read_value(v1::CORE_STORE, JsValue::from_str(v1::GATEWAY_DETAILS)) + .await + .map_err(Into::into) + } + + async fn must_read_gateway_details( + &self, + ) -> Result::StorageError> { + self.may_read_gateway_details() + .await? + .ok_or(WasmClientStorageError::GatewayDetailsNotInStorage) + .map_err(Into::into) + } + + async fn may_read_identity_keypair( + &self, + ) -> Result, ::StorageError> { + self.read_value( + v1::KEYS_STORE, + JsValue::from_str(v1::ED25519_IDENTITY_KEYPAIR), + ) + .await + .map_err(Into::into) + } + + async fn may_read_encryption_keypair( + &self, + ) -> Result, ::StorageError> { + self.read_value( + v1::KEYS_STORE, + JsValue::from_str(v1::X25519_ENCRYPTION_KEYPAIR), + ) + .await + .map_err(Into::into) + } + + async fn may_read_ack_key( + &self, + ) -> Result, ::StorageError> { + self.read_value(v1::KEYS_STORE, JsValue::from_str(v1::AES128CTR_ACK_KEY)) + .await + .map_err(Into::into) + } + + async fn may_read_gateway_shared_key( + &self, + ) -> Result, ::StorageError> { + self.read_value( + v1::KEYS_STORE, + JsValue::from_str(v1::AES128CTR_BLAKE3_HMAC_GATEWAY_KEYS), + ) + .await + .map_err(Into::into) + } + + async fn must_read_identity_keypair( + &self, + ) -> Result::StorageError> { + self.may_read_identity_keypair() + .await? + .ok_or(WasmClientStorageError::CryptoKeyNotInStorage { + typ: v1::ED25519_IDENTITY_KEYPAIR.to_string(), + }) + .map_err(Into::into) + } + + async fn must_read_encryption_keypair( + &self, + ) -> Result::StorageError> { + self.may_read_encryption_keypair() + .await? + .ok_or(WasmClientStorageError::CryptoKeyNotInStorage { + typ: v1::X25519_ENCRYPTION_KEYPAIR.to_string(), + }) + .map_err(Into::into) + } + + async fn must_read_ack_key(&self) -> Result::StorageError> { + self.may_read_ack_key() + .await? + .ok_or(WasmClientStorageError::CryptoKeyNotInStorage { + typ: v1::AES128CTR_ACK_KEY.to_string(), + }) + .map_err(Into::into) + } + + async fn must_read_gateway_shared_key( + &self, + ) -> Result::StorageError> { + self.may_read_gateway_shared_key() + .await? + .ok_or(WasmClientStorageError::CryptoKeyNotInStorage { + typ: v1::AES128CTR_BLAKE3_HMAC_GATEWAY_KEYS.to_string(), + }) + .map_err(Into::into) + } + + async fn store_identity_keypair( + &self, + keypair: &identity::KeyPair, + ) -> Result<(), ::StorageError> { + self.store_value( + v1::KEYS_STORE, + JsValue::from_str(v1::ED25519_IDENTITY_KEYPAIR), + keypair, + ) + .await + .map_err(Into::into) + } + + async fn store_encryption_keypair( + &self, + keypair: &encryption::KeyPair, + ) -> Result<(), ::StorageError> { + self.store_value( + v1::KEYS_STORE, + JsValue::from_str(v1::X25519_ENCRYPTION_KEYPAIR), + keypair, + ) + .await + .map_err(Into::into) + } + + async fn store_ack_key( + &self, + key: &AckKey, + ) -> Result<(), ::StorageError> { + self.store_value( + v1::KEYS_STORE, + JsValue::from_str(v1::AES128CTR_ACK_KEY), + key, + ) + .await + .map_err(Into::into) + } + + async fn store_gateway_shared_key( + &self, + key: &SharedKeys, + ) -> Result<(), ::StorageError> { + self.store_value( + v1::KEYS_STORE, + JsValue::from_str(v1::AES128CTR_BLAKE3_HMAC_GATEWAY_KEYS), + key, + ) + .await + .map_err(Into::into) + } + + async fn store_gateway_details( + &self, + gateway_endpoint: &PersistedGatewayDetails, + ) -> Result<(), ::StorageError> { + self.store_value( + v1::CORE_STORE, + JsValue::from_str(v1::GATEWAY_DETAILS), + gateway_endpoint, + ) + .await + .map_err(Into::into) + } + + async fn has_full_gateway_info( + &self, + ) -> Result::StorageError> { + let has_keys = self.may_read_gateway_shared_key().await?.is_some(); + let has_details = self.may_read_gateway_details().await?.is_some(); + + Ok(has_keys && has_details) + } +} diff --git a/common/wasm/client-core/src/topology.rs b/common/wasm/client-core/src/topology.rs new file mode 100644 index 0000000000..ab6ee353d3 --- /dev/null +++ b/common/wasm/client-core/src/topology.rs @@ -0,0 +1,251 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use nym_client_core::config::GatewayEndpointConfig; +use nym_config::defaults::{DEFAULT_CLIENT_LISTENING_PORT, DEFAULT_MIX_LISTENING_PORT}; +use nym_crypto::asymmetric::{encryption, identity}; +use nym_topology::gateway::GatewayConversionError; +use nym_topology::mix::{Layer, MixnodeConversionError}; +use nym_topology::{gateway, mix, MixLayer, NymTopology}; +use nym_validator_client::client::IdentityKeyRef; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; +use thiserror::Error; +use tsify::Tsify; +use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; +use wasm_utils::console_log; +use wasm_utils::error::simple_js_error; + +#[derive(Debug, Error)] +pub enum WasmTopologyError { + #[error("got invalid mix layer {value}. Expected 1, 2 or 3.")] + InvalidMixLayer { value: u8 }, + + #[error(transparent)] + GatewayConversion(#[from] GatewayConversionError), + + #[error(transparent)] + MixnodeConversion(#[from] MixnodeConversionError), + + #[error("The provided mixnode map was malformed: {msg}")] + MalformedMixnodeMap { msg: String }, + + #[error("The provided gateway list was malformed: {msg}")] + MalformedGatewayList { msg: String }, +} + +impl From for JsValue { + fn from(value: WasmTopologyError) -> Self { + simple_js_error(value.to_string()) + } +} + +// serde helper, not intended to be used directly +#[derive(Tsify, Debug, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct WasmNymTopology { + mixnodes: BTreeMap>, + gateways: Vec, +} + +impl WasmNymTopology { + pub fn print(&self) { + if !self.mixnodes.is_empty() { + console_log!("mixnodes:"); + for (layer, nodes) in &self.mixnodes { + console_log!("\tlayer {layer}:"); + for node in nodes { + // console_log!("\t\t{} - {}", node.mix_id, node.identity_key) + console_log!("\t\t{} - {:?}", node.mix_id, node) + } + } + } else { + console_log!("NO MIXNODES") + } + + if !self.gateways.is_empty() { + console_log!("gateways:"); + for gateway in &self.gateways { + // console_log!("\t{}", gateway.identity_key) + console_log!("\t{:?}", gateway) + } + } else { + console_log!("NO GATEWAYS") + } + } +} + +impl TryFrom for NymTopology { + type Error = WasmTopologyError; + + fn try_from(value: WasmNymTopology) -> Result { + let mut converted_mixes = BTreeMap::new(); + + for (layer, nodes) in value.mixnodes { + let layer_nodes = nodes + .into_iter() + .map(TryInto::try_into) + .collect::>()?; + + converted_mixes.insert(layer, layer_nodes); + } + + let gateways = value + .gateways + .into_iter() + .map(TryInto::try_into) + .collect::>()?; + + Ok(NymTopology::new(converted_mixes, gateways)) + } +} + +impl WasmNymTopology { + pub fn ensure_contains(&self, gateway_config: &GatewayEndpointConfig) -> bool { + self.ensure_contains_gateway_id(&gateway_config.gateway_id) + } + + pub fn ensure_contains_gateway_id(&self, gateway_id: IdentityKeyRef) -> bool { + self.gateways.iter().any(|g| g.identity_key == gateway_id) + } +} + +impl From for WasmNymTopology { + fn from(value: NymTopology) -> Self { + WasmNymTopology { + mixnodes: value + .mixes() + .iter() + .map(|(&l, nodes)| (l, nodes.iter().map(Into::into).collect())) + .collect(), + gateways: value.gateways().iter().map(Into::into).collect(), + } + } +} + +#[derive(Tsify, Debug, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct WasmMixNode { + // this is a `MixId` but due to typescript issue, we're using u32 directly. + pub mix_id: u32, + pub owner: String, + pub host: String, + + #[tsify(optional)] + pub mix_port: Option, + pub identity_key: String, + pub sphinx_key: String, + + // this is a `MixLayer` but due to typescript issue, we're using u8 directly. + pub layer: u8, + + #[tsify(optional)] + pub version: Option, +} + +impl TryFrom for mix::Node { + type Error = WasmTopologyError; + + fn try_from(value: WasmMixNode) -> Result { + let host = mix::Node::parse_host(&value.host)?; + + let mix_port = value.mix_port.unwrap_or(DEFAULT_MIX_LISTENING_PORT); + let version = value.version.map(|v| v.as_str().into()).unwrap_or_default(); + + // try to completely resolve the host in the mix situation to avoid doing it every + // single time we want to construct a path + let mix_host = mix::Node::extract_mix_host(&host, mix_port)?; + + Ok(mix::Node { + mix_id: value.mix_id, + owner: value.owner, + host, + mix_host, + identity_key: identity::PublicKey::from_base58_string(&value.identity_key) + .map_err(MixnodeConversionError::from)?, + sphinx_key: encryption::PublicKey::from_base58_string(&value.sphinx_key) + .map_err(MixnodeConversionError::from)?, + layer: Layer::try_from(value.layer) + .map_err(|_| WasmTopologyError::InvalidMixLayer { value: value.layer })?, + version, + }) + } +} + +impl<'a> From<&'a mix::Node> for WasmMixNode { + fn from(value: &'a mix::Node) -> Self { + WasmMixNode { + mix_id: value.mix_id, + owner: value.owner.clone(), + host: value.host.to_string(), + mix_port: Some(value.mix_host.port()), + identity_key: value.identity_key.to_base58_string(), + sphinx_key: value.sphinx_key.to_base58_string(), + layer: value.layer.into(), + version: Some(value.version.to_string()), + } + } +} + +#[derive(Tsify, Debug, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct WasmGateway { + pub owner: String, + pub host: String, + + #[tsify(optional)] + pub mix_port: Option, + + #[tsify(optional)] + pub clients_port: Option, + pub identity_key: String, + pub sphinx_key: String, + + #[tsify(optional)] + pub version: Option, +} + +impl TryFrom for gateway::Node { + type Error = WasmTopologyError; + + fn try_from(value: WasmGateway) -> Result { + let host = gateway::Node::parse_host(&value.host)?; + + let mix_port = value.mix_port.unwrap_or(DEFAULT_MIX_LISTENING_PORT); + let clients_port = value.clients_port.unwrap_or(DEFAULT_CLIENT_LISTENING_PORT); + let version = value.version.map(|v| v.as_str().into()).unwrap_or_default(); + + // try to completely resolve the host in the mix situation to avoid doing it every + // single time we want to construct a path + let mix_host = gateway::Node::extract_mix_host(&host, mix_port)?; + + Ok(gateway::Node { + owner: value.owner, + host, + mix_host, + clients_port, + identity_key: identity::PublicKey::from_base58_string(&value.identity_key) + .map_err(GatewayConversionError::from)?, + sphinx_key: encryption::PublicKey::from_base58_string(&value.sphinx_key) + .map_err(GatewayConversionError::from)?, + version, + }) + } +} + +impl<'a> From<&'a gateway::Node> for WasmGateway { + fn from(value: &'a gateway::Node) -> Self { + WasmGateway { + owner: value.owner.clone(), + host: value.host.to_string(), + mix_port: Some(value.mix_host.port()), + clients_port: Some(value.clients_port), + identity_key: value.identity_key.to_base58_string(), + sphinx_key: value.sphinx_key.to_base58_string(), + version: Some(value.version.to_string()), + } + } +} diff --git a/common/wasm/storage/Cargo.toml b/common/wasm/storage/Cargo.toml new file mode 100644 index 0000000000..35681dbf9e --- /dev/null +++ b/common/wasm/storage/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "wasm-storage" +version = "0.1.0" +authors = ["Jedrzej Stuczynski "] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = { workspace = true } +futures = { workspace = true } +js-sys = { workspace = true } +wasm-bindgen = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde-wasm-bindgen = { workspace = true } +indexed_db_futures = { version = " 0.3.0"} +thiserror = { workspace = true } + +nym-store-cipher = { path = "../../store-cipher", features = ["json"] } +wasm-utils = { path = "../utils", default-features = false } \ No newline at end of file diff --git a/common/wasm-utils/src/storage/cipher_export.rs b/common/wasm/storage/src/cipher_export.rs similarity index 100% rename from common/wasm-utils/src/storage/cipher_export.rs rename to common/wasm/storage/src/cipher_export.rs diff --git a/common/wasm-utils/src/storage/error.rs b/common/wasm/storage/src/error.rs similarity index 97% rename from common/wasm-utils/src/storage/error.rs rename to common/wasm/storage/src/error.rs index 9ead907c08..e4da9497f1 100644 --- a/common/wasm-utils/src/storage/error.rs +++ b/common/wasm/storage/src/error.rs @@ -1,11 +1,11 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::simple_js_error; use indexed_db_futures::web_sys::DomException; use serde_wasm_bindgen::Error; use thiserror::Error; use wasm_bindgen::JsValue; +use wasm_utils::error::simple_js_error; #[derive(Debug, Error)] pub enum StorageError { diff --git a/common/wasm-utils/src/storage/mod.rs b/common/wasm/storage/src/lib.rs similarity index 96% rename from common/wasm-utils/src/storage/mod.rs rename to common/wasm/storage/src/lib.rs index eb17949849..434125155d 100644 --- a/common/wasm-utils/src/storage/mod.rs +++ b/common/wasm/storage/src/lib.rs @@ -1,22 +1,23 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::console_log; -use crate::storage::cipher_export::StoredExportedStoreCipher; -use crate::storage::error::StorageError; -use futures::TryFutureExt; +use crate::cipher_export::StoredExportedStoreCipher; +use crate::error::StorageError; use nym_store_cipher::{ Aes256Gcm, Algorithm, EncryptedData, KdfInfo, KeySizeUser, Params, StoreCipher, Unsigned, Version, }; use serde::de::DeserializeOwned; use serde::Serialize; +use std::future::IntoFuture; use wasm_bindgen::JsValue; +use wasm_utils::console_log; pub use indexed_db_futures::prelude::*; mod cipher_export; pub mod error; +pub mod traits; pub const CIPHER_INFO_STORE: &str = "_cipher_store"; pub const CIPHER_STORE_EXPORT: &str = "cipher_store_export_info"; @@ -87,6 +88,16 @@ impl WasmStorage { }) } + pub async fn delete(self) -> Result<(), StorageError> { + self.inner.0.delete()?.into_future().await?; + Ok(()) + } + + pub async fn remove(db_name: &str) -> Result<(), StorageError> { + IdbDatabase::delete_by_name(db_name)?.into_future().await?; + Ok(()) + } + pub async fn exists(db_name: &str) -> Result { let db_req: OpenDbRequest = IdbDatabase::open(db_name)?; let db: IdbDatabase = db_req.into_future().await?; diff --git a/common/wasm/storage/src/traits.rs b/common/wasm/storage/src/traits.rs new file mode 100644 index 0000000000..b9c124fe07 --- /dev/null +++ b/common/wasm/storage/src/traits.rs @@ -0,0 +1,100 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::WasmStorage; +use async_trait::async_trait; +use js_sys::Array; +use serde::de::DeserializeOwned; +use serde::Serialize; +use std::error::Error; + +#[async_trait(?Send)] +pub trait BaseWasmStorage { + type StorageError: Error; + + async fn exists(db_name: &str) -> Result; + + async fn read_value(&self, store: &str, key: K) -> Result, Self::StorageError> + where + T: DeserializeOwned, + K: wasm_bindgen::JsCast; + + async fn store_value( + &self, + store: &str, + key: K, + value: &T, + ) -> Result<(), Self::StorageError> + where + T: Serialize, + K: wasm_bindgen::JsCast; + + async fn remove_value(&self, store: &str, key: K) -> Result<(), Self::StorageError> + where + K: wasm_bindgen::JsCast; + + async fn has_value(&self, store: &str, key: K) -> Result + where + K: wasm_bindgen::JsCast; + + async fn key_count(&self, store: &str, key: K) -> Result + where + K: wasm_bindgen::JsCast; + + async fn get_all_keys(&self, store: &str) -> Result; +} + +#[async_trait(?Send)] +impl BaseWasmStorage for WasmStorage { + type StorageError = crate::error::StorageError; + + async fn exists(db_name: &str) -> Result { + WasmStorage::exists(db_name).await + } + + async fn read_value(&self, store: &str, key: K) -> Result, Self::StorageError> + where + T: DeserializeOwned, + K: wasm_bindgen::JsCast, + { + self.read_value(store, key).await + } + + async fn store_value( + &self, + store: &str, + key: K, + value: &T, + ) -> Result<(), Self::StorageError> + where + T: Serialize, + K: wasm_bindgen::JsCast, + { + self.store_value(store, key, value).await + } + + async fn remove_value(&self, store: &str, key: K) -> Result<(), Self::StorageError> + where + K: wasm_bindgen::JsCast, + { + self.remove_value(store, key).await + } + + async fn has_value(&self, store: &str, key: K) -> Result + where + K: wasm_bindgen::JsCast, + { + self.has_value(store, key).await + } + + async fn key_count(&self, store: &str, key: K) -> Result + where + K: wasm_bindgen::JsCast, + { + self.key_count(store, key).await + } + + async fn get_all_keys(&self, store: &str) -> Result { + self.get_all_keys(store).await + } +} diff --git a/common/wasm/utils/Cargo.toml b/common/wasm/utils/Cargo.toml new file mode 100644 index 0000000000..6bffdd7687 --- /dev/null +++ b/common/wasm/utils/Cargo.toml @@ -0,0 +1,44 @@ +[package] +name = "wasm-utils" +version = "0.1.0" +authors = ["Jedrzej Stuczynski "] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +futures = { workspace = true } +js-sys = { workspace = true } +wasm-bindgen = { workspace = true } +wasm-bindgen-futures = { workspace = true } +getrandom = { workspace = true, features=["js"], optional = true } +gloo-utils = { workspace = true } +gloo-net = { version = "0.2.6", features = ["websocket"], optional = true } + +# we don't want entire tokio-tungstenite, tungstenite itself is just fine - we just want message and error enums +[dependencies.tungstenite] +version = "0.13" +default-features = false +optional = true + +[dependencies.web-sys] +workspace = true +optional = true + +[features] +default = ["sleep"] +sleep = ["web-sys", "web-sys/Window"] +websocket = [ + "getrandom", + "tungstenite", + "gloo-net" +] +crypto = [ + "web-sys", + "web-sys/Crypto", + "web-sys/CryptoKey", + "web-sys/CryptoKeyPair", + "web-sys/SubtleCrypto", + "web-sys/Window", + "web-sys/WorkerGlobalScope", +] diff --git a/common/wasm-utils/src/crypto/asymmetric.rs b/common/wasm/utils/src/crypto/asymmetric.rs similarity index 100% rename from common/wasm-utils/src/crypto/asymmetric.rs rename to common/wasm/utils/src/crypto/asymmetric.rs diff --git a/common/wasm-utils/src/crypto/mod.rs b/common/wasm/utils/src/crypto/mod.rs similarity index 100% rename from common/wasm-utils/src/crypto/mod.rs rename to common/wasm/utils/src/crypto/mod.rs diff --git a/common/wasm-utils/src/crypto/symmetric.rs b/common/wasm/utils/src/crypto/symmetric.rs similarity index 100% rename from common/wasm-utils/src/crypto/symmetric.rs rename to common/wasm/utils/src/crypto/symmetric.rs diff --git a/common/wasm-utils/src/lib.rs b/common/wasm/utils/src/error.rs similarity index 54% rename from common/wasm-utils/src/lib.rs rename to common/wasm/utils/src/error.rs index e0e3804eaa..4d1e1860e2 100644 --- a/common/wasm-utils/src/lib.rs +++ b/common/wasm/utils/src/error.rs @@ -1,58 +1,36 @@ -// Copyright 2021 - Nym Technologies SA +// Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use wasm_bindgen::prelude::*; +use js_sys::Promise; use wasm_bindgen::JsValue; -#[cfg(feature = "websocket")] -pub mod websocket; - -#[cfg(feature = "crypto")] -pub mod crypto; - -#[cfg(feature = "storage")] -pub mod storage; - -// will cause messages to be written as if console.log("...") was called #[macro_export] -macro_rules! console_log { - ($($t:tt)*) => ($crate::log(&format_args!($($t)*).to_string())) +macro_rules! wasm_error { + ($struct:ident) => { + impl $struct { + pub fn into_rejected_promise(self) -> js_sys::Promise { + self.into() + } + } + + impl From<$struct> for wasm_bindgen::JsValue { + fn from(value: $struct) -> Self { + $crate::error::simple_js_error(value.to_string()) + } + } + + impl From<$struct> for js_sys::Promise { + fn from(value: $struct) -> Self { + Promise::reject(&value.into()) + } + } + }; } -// will cause messages to be written as if console.warn("...") was called -#[macro_export] -macro_rules! console_warn { - ($($t:tt)*) => ($crate::warn(&format_args!($($t)*).to_string())) -} - -// will cause messages to be written as if console.error("...") was called -#[macro_export] -macro_rules! console_error { - ($($t:tt)*) => ($crate::error(&format_args!($($t)*).to_string())) -} - -#[wasm_bindgen] -extern "C" { - #[wasm_bindgen(js_namespace = console)] - pub fn log(s: &str); - - #[wasm_bindgen(js_namespace = console)] - pub fn warn(s: &str); - - #[wasm_bindgen(js_namespace = console)] - pub fn error(s: &str); -} - -#[cfg(feature = "sleep")] -pub async fn sleep(ms: i32) -> Result<(), JsValue> { - let promise = js_sys::Promise::new(&mut |yes, _| { - let win = web_sys::window().expect("no window available!"); - win.set_timeout_with_callback_and_timeout_and_arguments_0(&yes, ms) - .unwrap(); - }); - let js_fut = wasm_bindgen_futures::JsFuture::from(promise); - js_fut.await?; - Ok(()) +/// A helper that constructs a `Promise` containing a wrapper JS error. +pub fn simple_rejected_promise>(err_message: S) -> Promise { + let err = simple_js_error(err_message); + Promise::reject(&err) } /// A helper that construct a `JsValue` containing an error with the provided message. @@ -121,7 +99,7 @@ where #[macro_export] macro_rules! check_promise_result { ( $x:expr ) => { - match $crate::PromisableResultError::map_promise_err($x) { + match $crate::error::PromisableResultError::map_promise_err($x) { Ok(r) => r, Err(err) => return js_sys::Promise::reject(&err), } diff --git a/common/wasm/utils/src/lib.rs b/common/wasm/utils/src/lib.rs new file mode 100644 index 0000000000..1781771067 --- /dev/null +++ b/common/wasm/utils/src/lib.rs @@ -0,0 +1,72 @@ +// Copyright 2021 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use wasm_bindgen::prelude::*; + +#[cfg(feature = "websocket")] +pub mod websocket; + +#[cfg(feature = "crypto")] +pub mod crypto; + +pub mod error; + +// will cause messages to be written as if console.log("...") was called +#[macro_export] +macro_rules! console_log { + ($($t:tt)*) => ($crate::log(&format_args!($($t)*).to_string())) +} + +// will cause messages to be written as if console.debug("...") was called +#[macro_export] +macro_rules! console_debug { + ($($t:tt)*) => ($crate::debug(&format_args!($($t)*).to_string())) +} + +// will cause messages to be written as if console.info("...") was called +#[macro_export] +macro_rules! console_info { + ($($t:tt)*) => ($crate::info(&format_args!($($t)*).to_string())) +} + +// will cause messages to be written as if console.warn("...") was called +#[macro_export] +macro_rules! console_warn { + ($($t:tt)*) => ($crate::warn(&format_args!($($t)*).to_string())) +} + +// will cause messages to be written as if console.error("...") was called +#[macro_export] +macro_rules! console_error { + ($($t:tt)*) => ($crate::error(&format_args!($($t)*).to_string())) +} + +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(js_namespace = console)] + pub fn log(s: &str); + + #[wasm_bindgen(js_namespace = console)] + pub fn debug(s: &str); + + #[wasm_bindgen(js_namespace = console)] + pub fn info(s: &str); + + #[wasm_bindgen(js_namespace = console)] + pub fn warn(s: &str); + + #[wasm_bindgen(js_namespace = console)] + pub fn error(s: &str); +} + +#[cfg(feature = "sleep")] +pub async fn sleep(ms: i32) -> Result<(), wasm_bindgen::JsValue> { + let promise = js_sys::Promise::new(&mut |yes, _| { + let win = web_sys::window().expect("no window available!"); + win.set_timeout_with_callback_and_timeout_and_arguments_0(&yes, ms) + .unwrap(); + }); + let js_fut = wasm_bindgen_futures::JsFuture::from(promise); + js_fut.await?; + Ok(()) +} diff --git a/common/wasm/utils/src/websocket/mod.rs b/common/wasm/utils/src/websocket/mod.rs new file mode 100644 index 0000000000..5978f0940d --- /dev/null +++ b/common/wasm/utils/src/websocket/mod.rs @@ -0,0 +1,108 @@ +// Copyright 2021-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::console_log; +use futures::{Sink, Stream}; +use gloo_net::websocket::futures::WebSocket; +use gloo_net::websocket::{Message, WebSocketError}; +use gloo_utils::errors::JsError; +use std::io; +use std::pin::Pin; +use std::task::{Context, Poll}; +use tungstenite::{Error as WsError, Message as WsMessage}; // use tungstenite Message and Error types for easier compatibility with `ClientHandshake` + +// Unfortunately this can't be cleanly done with TryFrom/TryInto traits as both are foreign types +fn into_tungstenite_message(msg: gloo_net::websocket::Message) -> WsMessage { + match msg { + Message::Text(text) => WsMessage::Text(text), + Message::Bytes(bytes) => WsMessage::Binary(bytes), + } +} + +fn map_ws_error(err: WebSocketError) -> WsError { + match err { + // TODO: are we preserving correct semantics? + WebSocketError::ConnectionError => WsError::ConnectionClosed, + WebSocketError::ConnectionClose(_event) => WsError::ConnectionClosed, + WebSocketError::MessageSendError(err) => { + WsError::Io(io::Error::new(io::ErrorKind::Other, err.to_string())) + } + _ => WsError::Io(io::Error::new(io::ErrorKind::Other, "new websocket error")), + } +} + +fn try_from_tungstenite_message(msg: WsMessage) -> Result { + match msg { + WsMessage::Text(text) => Ok(gloo_net::websocket::Message::Text(text)), + WsMessage::Binary(bytes) => Ok(gloo_net::websocket::Message::Bytes(bytes)), + _ => Err(WsError::Io(io::Error::from(io::ErrorKind::InvalidInput))), + } +} + +// Safety: when compiled to wasm32 everything is going to be running on a single thread and so there +// is no shared memory right now. +// +// ************************************ +// SUPER IMPORTANT TODO: ONCE WASM IN RUST MATURES AND BECOMES MULTI-THREADED THIS MIGHT +// LEAD TO RUNTIME MEMORY CORRUPTION!! +// ************************************ +// +// note: https://github.com/rustwasm/gloo/issues/109 +unsafe impl Send for JSWebsocket {} + +#[allow(clippy::upper_case_acronyms)] +pub struct JSWebsocket { + inner: WebSocket, +} + +impl JSWebsocket { + pub fn new(url: &str) -> Result { + let inner = WebSocket::open(url)?; + console_log!("Websocket to {:?} is now open!", url); + Ok(JSWebsocket { inner }) + } + + pub async fn close(self, code: Option, reason: Option<&str>) -> Result<(), JsError> { + self.inner.close(code, reason) + } +} + +impl Stream for JSWebsocket { + type Item = Result; + + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.inner).poll_next(cx).map(|maybe_item| { + maybe_item.map(|item| item.map(into_tungstenite_message).map_err(map_ws_error)) + }) + } +} + +impl Sink for JSWebsocket { + type Error = WsError; + + fn poll_ready(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.inner) + .poll_ready(cx) + .map(|ready_res| ready_res.map_err(map_ws_error)) + } + + fn start_send(mut self: Pin<&mut Self>, item: WsMessage) -> Result<(), Self::Error> { + let item = try_from_tungstenite_message(item)?; + + Pin::new(&mut self.inner) + .start_send(item) + .map_err(map_ws_error) + } + + fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.inner) + .poll_flush(cx) + .map(|flush_res| flush_res.map_err(map_ws_error)) + } + + fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.inner) + .poll_close(cx) + .map(|close_res| close_res.map_err(map_ws_error)) + } +} diff --git a/nym-browser-extension/package.json b/nym-browser-extension/package.json index e9617eb933..08fdc6f39c 100644 --- a/nym-browser-extension/package.json +++ b/nym-browser-extension/package.json @@ -4,10 +4,8 @@ "main": "index.js", "license": "MIT", "scripts": { - "preinstall": "yarn build:wasm", "dev": "yarn webpack serve --config webpack.dev.js", "build": "yarn preinstall && webpack build --progress --config webpack.prod.js", - "build:wasm": "cd storage && make wasm-pack", "lint": "eslint src", "lint:fix": "eslint src --fix", "lint:ts": "tsc --noEmit", @@ -22,10 +20,10 @@ "@mui/material": "^5.11.15", "@mui/system": "^5.11.15", "@nymproject/mui-theme": "^1.0.0", - "@nymproject/nym-validator-client": "0.19.0", + "@nymproject/nym-validator-client": ">=1.2.0-rc.0 || 1", "@nymproject/react": "^1.0.0", "@nymproject/types": "^1.0.0", - "@nymproject/extension-storage": "file:./storage/pkg", + "@nymproject/extension-storage": ">=1.2.0-rc.0 || 1", "@storybook/react": "^6.5.16", "big.js": "^6.2.1", "crypto-js": "^4.1.1", diff --git a/nym-browser-extension/storage/Cargo.toml b/nym-browser-extension/storage/Cargo.toml index dc48a6e7ef..5d88f1a4a8 100644 --- a/nym-browser-extension/storage/Cargo.toml +++ b/nym-browser-extension/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "extension-storage" -version = "0.1.0" +version = "1.2.0-rc.2" edition = "2021" license = "Apache-2.0" repository = "https://github.com/nymtech/nym" @@ -11,29 +11,22 @@ repository = "https://github.com/nymtech/nym" crate-type = ["cdylib", "rlib"] [dependencies] -bip39 = { version = "2.0.0", features = ["zeroize"] } -js-sys = "*" -serde-wasm-bindgen = "0.5" -thiserror = "1.0.40" -wasm-bindgen = { version = "*" } # , features = ["serde-serialize"] } -wasm-bindgen-futures = "*" -zeroize = "1.6.0" - +bip39 = { workspace = true } +js-sys = { workspace = true } +serde-wasm-bindgen = { workspace = true } +thiserror = { workspace = true } +wasm-bindgen = { workspace = true } +wasm-bindgen-futures = { workspace = true } +zeroize = { workspace = true } console_error_panic_hook = { version = "0.1", optional = true } -# `wee_alloc` is a tiny allocator for wasm that is only ~1K in code size -# compared to the default allocator's ~10K. It is slower than the default -# allocator, however. -# -# Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now. -wee_alloc = { version = "0.4", optional = true } - -wasm-utils = { path = "../../common/wasm-utils", features = ["storage"] } +wasm-utils = { path = "../../common/wasm/utils" } +wasm-storage = { path = "../../common/wasm/storage" } #[package.metadata.wasm-pack.profile.release] #wasm-opt = false [features] -default = ["console_error_panic_hook"] \ No newline at end of file +default = ["console_error_panic_hook"] diff --git a/nym-browser-extension/storage/Makefile b/nym-browser-extension/storage/Makefile index c7d6657cd6..c9cc632572 100644 --- a/nym-browser-extension/storage/Makefile +++ b/nym-browser-extension/storage/Makefile @@ -1,2 +1,2 @@ wasm-pack: - wasm-pack build --scope nymproject \ No newline at end of file + wasm-pack build --scope nymproject --out-dir ../../dist/wasm/extension-storage \ No newline at end of file diff --git a/nym-browser-extension/storage/src/error.rs b/nym-browser-extension/storage/src/error.rs index 2ea167fa21..6e3472ba73 100644 --- a/nym-browser-extension/storage/src/error.rs +++ b/nym-browser-extension/storage/src/error.rs @@ -1,10 +1,10 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use js_sys::Promise; use thiserror::Error; -use wasm_bindgen::JsValue; -use wasm_utils::simple_js_error; -use wasm_utils::storage::error::StorageError; +use wasm_storage::error::StorageError; +use wasm_utils::wasm_error; #[derive(Debug, Error)] pub enum ExtensionStorageError { @@ -30,8 +30,4 @@ pub enum ExtensionStorageError { }, } -impl From for JsValue { - fn from(value: ExtensionStorageError) -> Self { - simple_js_error(value.to_string()) - } -} +wasm_error!(ExtensionStorageError); diff --git a/nym-browser-extension/storage/src/lib.rs b/nym-browser-extension/storage/src/lib.rs index 9f4ae1302b..767755c0a3 100644 --- a/nym-browser-extension/storage/src/lib.rs +++ b/nym-browser-extension/storage/src/lib.rs @@ -1,14 +1,22 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use wasm_bindgen::prelude::*; - +#[cfg(target_arch = "wasm32")] pub mod error; + +#[cfg(target_arch = "wasm32")] pub mod storage; +#[cfg(target_arch = "wasm32")] pub use error::ExtensionStorageError; + +#[cfg(target_arch = "wasm32")] pub use storage::ExtensionStorage; +#[cfg(target_arch = "wasm32")] +use wasm_bindgen::prelude::*; + +#[cfg(target_arch = "wasm32")] #[wasm_bindgen] pub fn set_panic_hook() { // When the `console_error_panic_hook` feature is enabled, we can call the diff --git a/nym-browser-extension/storage/src/storage.rs b/nym-browser-extension/storage/src/storage.rs index 9b7278d028..4a0874f47e 100644 --- a/nym-browser-extension/storage/src/storage.rs +++ b/nym-browser-extension/storage/src/storage.rs @@ -6,8 +6,9 @@ use js_sys::Promise; use std::sync::Arc; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::future_to_promise; -use wasm_utils::storage::{IdbVersionChangeEvent, WasmStorage}; -use wasm_utils::{check_promise_result, PromisableResult, PromisableResultError}; +use wasm_storage::{IdbVersionChangeEvent, WasmStorage}; +use wasm_utils::check_promise_result; +use wasm_utils::error::{PromisableResult, PromisableResultError}; use zeroize::Zeroizing; const STORAGE_NAME: &str = "nym-wallet-extension"; @@ -25,6 +26,7 @@ pub struct ExtensionStorage { inner: Arc, } +#[allow(clippy::type_complexity)] fn db_migration() -> Box Result<(), JsValue>> { Box::new(|evt: &IdbVersionChangeEvent| -> Result<(), JsValue> { // Even if the web-sys bindings expose the version as a f64, the IndexedDB API diff --git a/nym-connect/desktop/Cargo.lock b/nym-connect/desktop/Cargo.lock index 0181354c1d..be8401d5c6 100644 --- a/nym-connect/desktop/Cargo.lock +++ b/nym-connect/desktop/Cargo.lock @@ -2577,6 +2577,26 @@ dependencies = [ "regex", ] +[[package]] +name = "gloo-net" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9902a044653b26b99f7e3693a42f171312d9be8b26b5697bd1e43ad1f8a35e10" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "gloo-timers" version = "0.2.6" @@ -2589,6 +2609,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gloo-utils" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037fcb07216cb3a30f7292bd0176b050b7b9a052ba830ef7d5d65f6dc64ba58e" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "gobject-sys" version = "0.15.10" @@ -3298,9 +3331,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -4161,6 +4194,7 @@ version = "0.1.0" dependencies = [ "futures", "getrandom 0.2.10", + "gloo-utils", "log", "nym-bandwidth-controller", "nym-coconut-interface", @@ -4575,6 +4609,7 @@ dependencies = [ "nym-sphinx-routing", "nym-sphinx-types", "rand 0.7.3", + "semver 0.11.0", "thiserror", ] @@ -7874,9 +7909,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -7884,24 +7919,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.28", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.33" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -7911,9 +7946,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7921,22 +7956,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.28", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "wasm-streams" @@ -7957,6 +7992,8 @@ version = "0.1.0" dependencies = [ "futures", "getrandom 0.2.10", + "gloo-net", + "gloo-utils", "js-sys", "tungstenite", "wasm-bindgen", @@ -7980,9 +8017,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/nym-connect/desktop/src-tauri/Cargo.toml b/nym-connect/desktop/src-tauri/Cargo.toml index 6b4de12a5f..1edef0686a 100644 --- a/nym-connect/desktop/src-tauri/Cargo.toml +++ b/nym-connect/desktop/src-tauri/Cargo.toml @@ -37,7 +37,8 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde_repr = "0.1" tap = "1.0.1" -tauri = { version = "^1.2.2", features = ["clipboard-write-text", "macos-private-api", "notification-all", "shell-open", "system-tray", "updater", "window-close", "window-minimize", "window-start-dragging"] } +# 07.07.23: JS: I changed the version from ^1.2.2 to fix up indirect import of web-sys +tauri = { version = "1.4.1", features = ["clipboard-write-text", "macos-private-api", "notification-all", "shell-open", "system-tray", "updater", "window-close", "window-minimize", "window-start-dragging"] } #tendermint-rpc = "0.23.0" thiserror = "1.0" time = { version = "0.3.17", features = ["local-offset"] } diff --git a/nym-wallet/package.json b/nym-wallet/package.json index e91c500678..daf25e8142 100644 --- a/nym-wallet/package.json +++ b/nym-wallet/package.json @@ -31,7 +31,7 @@ "@nymproject/mui-theme": "^1.0.0", "@nymproject/react": "^1.0.0", "@nymproject/types": "^1.0.0", - "@nymproject/sdk": "^1.1.8", + "@nymproject/node-tester": ">=1.2.0-rc.1 || ^1", "@storybook/react": "^6.5.15", "@tauri-apps/api": "^1.2.0", "@tauri-apps/tauri-forage": "^1.0.0-beta.2", @@ -123,4 +123,4 @@ "webpack-favicons": "^1.3.8", "webpack-merge": "^5.8.0" } -} \ No newline at end of file +} diff --git a/nym-wallet/src-tauri/Cargo.toml b/nym-wallet/src-tauri/Cargo.toml index d6b9c1392a..042c31b014 100644 --- a/nym-wallet/src-tauri/Cargo.toml +++ b/nym-wallet/src-tauri/Cargo.toml @@ -19,7 +19,7 @@ tauri-codegen = "=1.2.1" tauri-macros = "=1.2.1" [dependencies] -async-trait = "0.1.64" +async-trait = "0.1.68" bip39 = { version = "2.0.0", features = ["zeroize", "rand"] } cfg-if = "1.0.0" colored = "2.0" diff --git a/nym-wallet/src/components/TestNode/Packets.tsx b/nym-wallet/src/components/TestNode/Packets.tsx index dfbc4d7144..e935f26960 100644 --- a/nym-wallet/src/components/TestNode/Packets.tsx +++ b/nym-wallet/src/components/TestNode/Packets.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { TestStatus } from '@nymproject/sdk'; import { Divider, Typography } from '@mui/material'; +import { TestStatus } from './types'; import { ResultsCard, ResultsCardDetail } from './ResultsCard'; export const Packets = ({ diff --git a/nym-wallet/src/components/TestNode/Results.tsx b/nym-wallet/src/components/TestNode/Results.tsx index 58856801b3..15404dde1c 100644 --- a/nym-wallet/src/components/TestNode/Results.tsx +++ b/nym-wallet/src/components/TestNode/Results.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { TestStatus } from '@nymproject/sdk'; import { Grid } from '@mui/material'; +import { TestStatus } from './types'; import { Packets } from './Packets'; import { NodeScore } from './NodeScore'; import { Overview } from './Overview'; diff --git a/nym-wallet/src/components/TestNode/types.ts b/nym-wallet/src/components/TestNode/types.ts new file mode 100644 index 0000000000..0189f10b7b --- /dev/null +++ b/nym-wallet/src/components/TestNode/types.ts @@ -0,0 +1 @@ +export type TestStatus = 'Running' | 'Stopped' | 'Complete'; diff --git a/nym-wallet/src/pages/bonding/node-settings/node-test/index.tsx b/nym-wallet/src/pages/bonding/node-settings/node-test/index.tsx index 7670fe1dcd..ba9bf522f3 100644 --- a/nym-wallet/src/pages/bonding/node-settings/node-test/index.tsx +++ b/nym-wallet/src/pages/bonding/node-settings/node-test/index.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useContext, useEffect, useRef, useState } from 'react'; import { Box, Button } from '@mui/material'; import { Download } from '@mui/icons-material'; -import { NodeTestResultResponse, NodeTester, TestStatus, createNodeTesterClient } from '@nymproject/sdk'; +import { NodeTestResultResponse, NodeTester, createNodeTesterClient } from '@nymproject/node-tester'; import { format } from 'date-fns'; import { AppContext, useBondingContext } from 'src/context'; import { LoadingModal } from 'src/components/Modals/LoadingModal'; @@ -9,6 +9,7 @@ import { Results } from 'src/components/TestNode/Results'; import { ErrorModal } from 'src/components/Modals/ErrorModal'; import { PrintResults } from 'src/components/TestNode/PrintResults'; import { MAINNET_VALIDATOR_URL, QA_VALIDATOR_URL } from 'src/constants'; +import { TestStatus } from 'src/components/TestNode/types'; export const NodeTestPage = () => { const [nodeTestClient, setNodeTestClient] = useState(); diff --git a/package.json b/package.json index a967dafdee..1fbdb8bf82 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "private": true, "license": "Apache 2.0", "workspaces": [ + "dist/wasm/**", "sdk/typescript/packages/**", "ts-packages/*", "nym-wallet", @@ -13,8 +14,15 @@ "clients/validator" ], "scripts": { + "nuke": "npx rimraf **/node_modules node_modules", "clean": "lerna run clean", + + "build:ci:sdk": "run-s build:types build:packages build:wasm build:sdk:ci", + "build:sdk:ci": "lerna run --scope '{@nymproject/sdk,@nymproject/node-tester,@nymproject/sdk-react,@nymproject/mix-fetch}' build:dev --stream", + "build": "run-s build:types build:packages", + "build:wasm": "make sdk-wasm-build", + "build:sdk": "make sdk-typescript-build", "build:types": "lerna run --scope @nymproject/types build --stream", "build:packages": "run-s build:packages:theme build:packages:react", "build:packages:theme": "lerna run --scope @nymproject/mui-theme build", @@ -23,16 +31,21 @@ "build:playground": "lerna run --scope @nymproject/react storybook:build --stream", "build:ci": "yarn build && run-p build:react-example build:playground && yarn build:ci:collect-artifacts", "build:ci:collect-artifacts": "mkdir -p ts-packages/dist && mv ts-packages/react-components/storybook-static ts-packages/dist/storybook && mv ts-packages/react-webpack-with-theme-example/dist ts-packages/dist/example", + "docs:prod:build": "run-p docs:prod:build:ws docs:prod:build:ts:sdk", + "docs:prod:build:ws": "lerna run docs:prod:build --stream", + "docs:prod:build:ts:sdk": "cd sdk/typescript/docs && npm i && npm run docs:prod:build", + "sdk:build": "./sdk/typescript/scripts/build-prod-sdk.sh", + "sdk:publish": "./sdk/typescript/scripts/publish.sh", "lint": "lerna run lint --stream", "lint:fix": "lerna run lint:fix --stream", "tsc": "lerna run tsc --stream", "types:lint:fix": "lerna run lint:fix --scope @nymproject/types --scope @nymproject/nym-wallet-app", - "audit:fix": "npm_config_yes=true npx yarn-audit-fix -- --dry-run", - "preinstall": "yarn install:copy-placeholders", - "install:copy-placeholders": "cp scripts/build/yarn/wasm-placeholder/package.json sdk/typescript/packages/nym-client-wasm" + "audit:fix": "npm_config_yes=true npx yarn-audit-fix -- --dry-run" }, "devDependencies": { "lerna": "^6.6.2", - "npm-run-all": "^4.1.5" + "npm-run-all": "^4.1.5", + "@npmcli/node-gyp": "^3.0.0", + "node-gyp": "^9.3.1" } } \ No newline at end of file diff --git a/scripts/build/yarn/storage-placeholder/package.json b/scripts/build/yarn/storage-placeholder/package.json deleted file mode 100644 index 4a84a67b49..0000000000 --- a/scripts/build/yarn/storage-placeholder/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "@nymproject/extension-storage", - "version": "0.1.0", - "sideEffects": false -} diff --git a/scripts/build/yarn/wasm-placeholder/package.json b/scripts/build/yarn/wasm-placeholder/package.json deleted file mode 100644 index 50f57bc30d..0000000000 --- a/scripts/build/yarn/wasm-placeholder/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "@nymproject/nym-client-wasm", - "version": "1.0.0", - "sideEffects": false -} diff --git a/scripts/generate_changelog.sh b/scripts/generate_changelog.sh deleted file mode 100755 index 68b85e2ebd..0000000000 --- a/scripts/generate_changelog.sh +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2020 - The Nym Mixnet Authors -# SPDX-License-Identifier: Apache-2.0 - - -#!/bin/bash - -# Copyright 2020 Nym -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# set CHANGELOG_GITHUB_TOKEN in your .bashrc file -# For each version, you can add a release summary with text, images, gif animations, etc, and show new features and notes clearly to the user. This is done using GitHub metadata. - -# Example: adding the release summary for v1.0.0: - -# 1. Create a new GitHub Issue -# 2. In the Issue's Description field, add your release summary content -# 3. Set the Issue Label `release-summary` and add it to the GitHub Milestone `v1.0.0` -# 4. Close the Issue and execute `github-changelog-generator` -github_changelog_generator -u nymtech -p nym --exclude-tags 0.1.0,nym-wallet-v1.0.0-windows --token "$CHANGELOG_GITHUB_TOKEN" diff --git a/scripts/start_local_network.sh b/scripts/start_local_network.sh deleted file mode 100755 index 0bbbd4eaa3..0000000000 --- a/scripts/start_local_network.sh +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright 2020 - The Nym Mixnet Authors -# SPDX-License-Identifier: Apache-2.0 - -#!/bin/bash - -#// Copyright 2020 The Nym Mixnet Authors -#// -#// Licensed under the Apache License, Version 2.0 (the "License"); -#// you may not use this file except in compliance with the License. -#// You may obtain a copy of the License at -#// -#// http://www.apache.org/licenses/LICENSE-2.0 -#// -#// Unless required by applicable law or agreed to in writing, software -#// distributed under the License is distributed on an "AS IS" BASIS, -#// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -#// See the License for the specific language governing permissions and -#// limitations under the License. - -MAX_LAYERS=3 -NUMMIXES=3 - -function kill_old() { - echo "Killing old testnet processes..." - killall nym-mixnode - killall nym-gateway - killall nym-client -} - -if [ $# -ne 1 ]; then - echo "Expected a single argument to be passed - the directory server (that you should have independently started locally!)" - exit 1 -fi - -DIR=$1 - -echo "Press CTRL-C to stop." - -kill_old -export RUST_LOG=warning -# NOTE: If we wanted to suppress stdout and stderr, replace `&` with `> /dev/null 2>&1 &` in the `run` - -# cargo run --bin nym-gateway -- init --id gateway-local --mix-host 127.0.0.1:10000 --clients-host 127.0.0.1:10001 --directory $DIR -cargo run --release --bin nym-gateway -- run --id gateway-local & - -sleep 1 - -# Note: to disable logging (or direct it to another output) modify the constant on top of mixnode or provider; -# Will make it later either configurable by flags or config file. -for (( j=0; j<$NUMMIXES; j++ )); do - let layer=j%MAX_LAYERS+1 - cargo run --release --bin nym-mixnode -- init --id mix-local$j --host 127.0.0.1 --port $((9980+$j)) --layer $layer --directory $DIR - cargo run --release --bin nym-mixnode -- run --id mix-local$j & - sleep 1 -done - - -# just run forever (so we'd get all network warnings in this window and you wouldn't get confused when you started another process here) -# also it seems that SIGINT is nicely passed to all processes so they kill themselves -tail -f /dev/null diff --git a/sdk/rust/nym-sdk/Cargo.toml b/sdk/rust/nym-sdk/Cargo.toml index 6986e0ef15..9d8cdbe621 100644 --- a/sdk/rust/nym-sdk/Cargo.toml +++ b/sdk/rust/nym-sdk/Cargo.toml @@ -21,6 +21,13 @@ nym-task = { path = "../../../common/task" } nym-topology = { path = "../../../common/topology" } nym-socks5-client-core = { path = "../../../common/socks5-client-core" } nym-validator-client = { path = "../../../common/client-libs/validator-client", features = ["http-client"] } +nym-socks5-requests = { path = "../../../common/socks5/requests" } +nym-ordered-buffer = { path = "../../../common/socks5/ordered-buffer" } +nym-service-providers-common = { path = "../../../service-providers/common" } +bytecodec = "0.4.15" +httpcodec = "0.2.3" +bytes = "1" +http = "0.2.9" futures = { workspace = true } log = { workspace = true } diff --git a/sdk/rust/nym-sdk/examples/manually_overwrite_topology.rs b/sdk/rust/nym-sdk/examples/manually_overwrite_topology.rs index bad1c9651b..175a64f4cd 100644 --- a/sdk/rust/nym-sdk/examples/manually_overwrite_topology.rs +++ b/sdk/rust/nym-sdk/examples/manually_overwrite_topology.rs @@ -31,7 +31,7 @@ async fn main() { .parse() .unwrap(), layer: Layer::One, - version: "1.1.0".to_string(), + version: "1.1.0".into(), }], ); mixnodes.insert( @@ -48,7 +48,7 @@ async fn main() { .parse() .unwrap(), layer: Layer::Two, - version: "1.1.0".to_string(), + version: "1.1.0".into(), }], ); mixnodes.insert( @@ -65,7 +65,7 @@ async fn main() { .parse() .unwrap(), layer: Layer::Three, - version: "1.1.0".to_string(), + version: "1.1.0".into(), }], ); diff --git a/sdk/rust/nym-sdk/examples/mixfetch.rs b/sdk/rust/nym-sdk/examples/mixfetch.rs new file mode 100644 index 0000000000..c71503e9f1 --- /dev/null +++ b/sdk/rust/nym-sdk/examples/mixfetch.rs @@ -0,0 +1,166 @@ +extern crate core; + +// use bytecodec::bytes::BytesEncoder; +// use bytecodec::bytes::RemainingBytesDecoder; +// use bytecodec::io::IoEncodeExt; +// use bytecodec::{DecodeExt, Encode}; +// use httpcodec::{BodyDecoder, ResponseDecoder}; +// use httpcodec::{ +// BodyEncoder, HeaderField, HttpVersion, Method, Request, RequestEncoder, RequestTarget, +// }; +// use nym_sdk::mixnet; +// use nym_sdk::mixnet::{IncludedSurbs, Recipient}; +// use nym_service_providers_common::interface::Serializable; +// use nym_socks5_requests::{ +// Socks5ProtocolVersion, Socks5ProviderRequest, Socks5Response, Socks5ResponseContent, +// }; +// use std::time::Duration; + +#[tokio::main] +async fn main() { + unimplemented!() + // nym_bin_common::logging::setup_logging(); + // + // // Passing no config makes the client fire up an ephemeral session and figure shit out on its own + // let mut client = mixnet::MixnetClient::connect_new().await.unwrap(); + // + // // Be able to get our client address + // let our_address = client.nym_address(); + // println!("Our client nym address is: {our_address}"); + // + // // Send a message through the mixnet to ourselves + // // client.send_str(*our_address, "hello there").await; + // + // // Build an HTTP GET request + // let mut request = Request::new( + // Method::new("GET").unwrap(), + // RequestTarget::new("/.wellknown/wallet/validators.json").unwrap(), + // HttpVersion::V1_1, + // b"", + // ); + // let mut headers = request.header_mut(); + // headers.add_field(HeaderField::new("Host", "nymtech.net").unwrap()); + // + // // Set up an HTTP GET request, with headers and no payload + // // let mut request = Request::new( + // // Method::new("GET").unwrap(), + // // RequestTarget::new("/package.json").unwrap(), + // // HttpVersion::V1_1, + // // b"", + // // ); + // // let mut headers = request.header_mut(); + // // headers.add_field(HeaderField::new("Host", "localhost:3000").unwrap()); + // + // // Encode as bytes + // let mut encoder = RequestEncoder::new(BodyEncoder::new(BytesEncoder::new())); + // encoder.start_encoding(request).unwrap(); + // let mut buf = Vec::new(); + // encoder.encode_all(&mut buf).unwrap(); + // + // println!("{:?}", buf); + // println!("{}", String::from_utf8_lossy(&buf)); + // + // let client_address = Recipient::try_from_base58_string("8YF6f8x17j3fviBdU87EGD9g9MAgn9DARxunwLEVM7Bm.4ydfpjbTjCmzj58hWdQjxU2gT6CRVnTbnKajr2hAGBBM@2xU4CBE6QiiYt6EyBXSALwxkNvM7gqJfjHXaMkjiFmYW") + // .expect("address is valid"); + // + // // Any old connection id will do + // let conn_id = 13488440783042593894u64; + // + // // Wrap is SOCKS5 connect request + // let socks5_connect = nym_socks5_requests::request::Socks5Request::new_connect( + // Socks5ProtocolVersion::Legacy, + // conn_id, + // "nymtech.net:443".to_string(), + // // "localhost:3000".to_string(), + // Some(*our_address), + // ); + // nym_socks5_requests::request::Socks5Request::try_from_bytes( + // &socks5_connect.clone().into_bytes(), + // ) + // .unwrap(); + // + // let msg_connect = Socks5ProviderRequest::new_provider_data( + // nym_socks5_client_core::config::Config::default() + // .get_socks5() + // .get_provider_interface_version(), + // socks5_connect, + // ); + // + // client + // .send_bytes( + // client_address, + // msg_connect.into_bytes(), + // IncludedSurbs::ExposeSelfAddress, + // ) + // .await; + // + // // Sleep to avoid weird packet ordering + // tokio::time::sleep(Duration::from_millis(1000u64)).await; + // + // // Create an ordered message + // let ordered_msg = OrderedMessage { + // data: buf, + // index: 0, + // }; + // + // let buf2 = ordered_msg.into_bytes(); + // println!("socks5 with payload: {:?}", &buf2); + // + // // Wrap is SOCKS5 send request + // let socks5_send = nym_socks5_requests::request::Socks5Request::new_send( + // Socks5ProtocolVersion::Legacy, + // conn_id, + // buf2, + // false, + // ); + // + // let msg_send = Socks5ProviderRequest::new_provider_data( + // nym_socks5_client_core::config::Config::default() + // .get_socks5() + // .get_provider_interface_version(), + // socks5_send, + // ); + // + // client + // .send_bytes( + // client_address, + // msg_send.into_bytes(), + // IncludedSurbs::ExposeSelfAddress, + // ) + // .await; + // + // println!("Waiting for message (ctrl-c to exit)"); + // client + // .on_messages(|msg| { + // if let Ok(res) = Socks5Response::try_from_bytes(msg.message.as_slice()) { + // println!("️✅ Socks5Response: {:?}", res); + // if let Socks5ResponseContent::NetworkData(data) = res.content { + // // data.data is really an OrderedMessage + // let response_ordered_message = + // OrderedMessage::try_from_bytes(data.data).unwrap(); + // + // println!( + // "️🤖 Socks5ResponseContent::NetworkData: {}", + // String::from_utf8_lossy(&response_ordered_message.data) + // ); + // + // if !response_ordered_message.data.is_empty() { + // println!("️✅ resp: {:?}", response_ordered_message.data); + // + // // let response = http::response::Response::try_parse(resp).unwrap(); + // let mut decoder = + // ResponseDecoder::>::default(); + // let response = decoder + // .decode_from_bytes(response_ordered_message.data.as_ref()) + // .unwrap(); + // + // println!("➡️ decoded: {:?}", response); + // println!("🚀 decoded: {}", String::from_utf8_lossy(response.body())); + // } + // } + // } + // + // // println!("️✅ Received: {}", String::from_utf8_lossy(&msg.message)) + // }) + // .await; +} diff --git a/sdk/typescript/.eslintrc.js b/sdk/typescript/.eslintrc.js index 52bd4fe9a9..14620fcb06 100644 --- a/sdk/typescript/.eslintrc.js +++ b/sdk/typescript/.eslintrc.js @@ -109,7 +109,7 @@ module.exports = { 'root-import': { rootPathPrefix: '@', rootPathSuffix: 'src', - extensions: ['.js', '.ts', '.tsx', '.jsx', '.mdx'], + extensions: ['.js', '.ts', '.tsx', '.jsx', '.mdx', '.mjs'], }, }, }, diff --git a/sdk/typescript/docs/.gitignore b/sdk/typescript/docs/.gitignore new file mode 100644 index 0000000000..1fcb1529f8 --- /dev/null +++ b/sdk/typescript/docs/.gitignore @@ -0,0 +1 @@ +out diff --git a/sdk/typescript/docs/README.md b/sdk/typescript/docs/README.md new file mode 100644 index 0000000000..2a9c9f4fff --- /dev/null +++ b/sdk/typescript/docs/README.md @@ -0,0 +1,26 @@ +# Nym Typescript SDK Documentation + +This directory contains the interactive documentation for the Typescript SDK. + +If you find any issues with this documentation, please open an issue on https://github.com/nymtech/nym/issues/new/choose. + +## Local development + +``` +npm i +npm run dev +``` + +Open http://localhost:3000 to browse the output that will hot-reload when you make changes. + +## Build + +``` +npm run build +``` + +The static output will be in `./out`; + +## Template details + +This documentation was made with [Nextra](https://nextra.site) using the template from here https://github.com/shuding/nextra-docs-template. diff --git a/sdk/typescript/docs/components/wallet.tsx b/sdk/typescript/docs/components/wallet.tsx new file mode 100644 index 0000000000..666b7a3173 --- /dev/null +++ b/sdk/typescript/docs/components/wallet.tsx @@ -0,0 +1,27 @@ +import React, { FC } from 'react'; + +import { ChainProvider, useChainWallet } from '@cosmos-kit/react'; +import { chains, assets } from 'chain-registry'; +import { wallets } from '@cosmos-kit/keplr'; + +// Import this in your top-level route/layout +import '@interchain-ui/react/styles'; + +const WalletInner: FC = () => { + const chainContext = useChainWallet('nyx', 'keplr'); + + return

    {JSON.stringify(chainContext, null, 2)}
    ; +}; + +export const Wallet: FC = () => ( + // TODO + + +
    This is a wallet
    + +
    +); diff --git a/sdk/typescript/docs/next-env.d.ts b/sdk/typescript/docs/next-env.d.ts new file mode 100644 index 0000000000..4f11a03dc6 --- /dev/null +++ b/sdk/typescript/docs/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/sdk/typescript/docs/next.config.js b/sdk/typescript/docs/next.config.js new file mode 100644 index 0000000000..f4e7f0aac9 --- /dev/null +++ b/sdk/typescript/docs/next.config.js @@ -0,0 +1,21 @@ +const withNextra = require('nextra')({ + theme: 'nextra-theme-docs', + themeConfig: './theme.config.tsx', +}); + +console.dir(withNextra(), { depth: 30 }); +console.dir(withNextra().rewrites, { depth: 30 }); + +const config = { + ...withNextra(), + output: 'export', + rewrites: undefined, + images: { + unoptimized: true, + }, + basePath: process.env.NODE_ENV === 'development' ? undefined : '/docs/sdk/typescript', // this makes the SDK docs appear at https://nymtech.net/docs/sdk/typescript +}; + +// config.images.unoptimized = true; + +module.exports = config; diff --git a/sdk/typescript/docs/package-lock.json b/sdk/typescript/docs/package-lock.json new file mode 100644 index 0000000000..fc1d744b25 --- /dev/null +++ b/sdk/typescript/docs/package-lock.json @@ -0,0 +1,7113 @@ +{ + "name": "nym-sdk-docs", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "nym-sdk-docs", + "version": "0.0.1", + "dependencies": { + "@cosmjs/amino": "^0.31.0", + "@cosmjs/cosmwasm-stargate": "^0.31.0", + "@cosmos-kit/keplr": "^2.1.0", + "@cosmos-kit/react": "^2.1.1", + "@interchain-ui/react": "^1.3.3", + "chain-registry": "^1.18.0", + "next": "^13.0.6", + "nextra": "latest", + "nextra-theme-docs": "latest", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/node": "18.11.10", + "typescript": "^4.9.3" + } + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", + "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==" + }, + "node_modules/@chain-registry/keplr": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@chain-registry/keplr/-/keplr-1.8.0.tgz", + "integrity": "sha512-P1IyZihR/rZUBgFZm5DGs4LAVpMSJ7QfQ5YV1ofpMNeB0iXEEGC4BuuT8NonwgAyWGOw9/c8Z/cNN8f9m5nFkQ==", + "dependencies": { + "@babel/runtime": "^7.19.4", + "@chain-registry/types": "^0.13.1", + "@keplr-wallet/cosmos": "0.11.16", + "@keplr-wallet/crypto": "0.11.16", + "semver": "^7.3.8" + } + }, + "node_modules/@chain-registry/keplr/node_modules/@keplr-wallet/common": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@keplr-wallet/common/-/common-0.11.16.tgz", + "integrity": "sha512-RTbfe8LkPzQQqYntx53dZTuDUgx+W6KRY4g3fIv1c59DS/bp9ZqjYfUDmj3yH0GQk822zqJJwCtjk+qsgvyebg==", + "dependencies": { + "@keplr-wallet/crypto": "0.11.16", + "buffer": "^6.0.3", + "delay": "^4.4.0" + } + }, + "node_modules/@chain-registry/keplr/node_modules/@keplr-wallet/cosmos": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@keplr-wallet/cosmos/-/cosmos-0.11.16.tgz", + "integrity": "sha512-Rgch9zw+GKQ2wAKw6I5+J8AAlKHs4MhnkGFfTuqy0e453Ig0+KCHvs+IgMURM9j6E7K0OPQVc4vCvWnQLs6Zbw==", + "dependencies": { + "@ethersproject/address": "^5.6.0", + "@keplr-wallet/common": "0.11.16", + "@keplr-wallet/crypto": "0.11.16", + "@keplr-wallet/proto-types": "0.11.16", + "@keplr-wallet/types": "0.11.16", + "@keplr-wallet/unit": "0.11.16", + "axios": "^0.27.2", + "bech32": "^1.1.4", + "buffer": "^6.0.3", + "long": "^4.0.0", + "protobufjs": "^6.11.2" + } + }, + "node_modules/@chain-registry/keplr/node_modules/@keplr-wallet/crypto": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@keplr-wallet/crypto/-/crypto-0.11.16.tgz", + "integrity": "sha512-th3t05Aq+uQLbhhiqIHbevY3pA4dBKr+vKcUpfdshcc78fI1eGpmzGcQKxlvbectBn4UwamTEANssyplXOGQqg==", + "dependencies": { + "@ethersproject/keccak256": "^5.5.0", + "bip32": "^2.0.6", + "bip39": "^3.0.3", + "bs58check": "^2.1.2", + "buffer": "^6.0.3", + "crypto-js": "^4.0.0", + "elliptic": "^6.5.3", + "sha.js": "^2.4.11" + } + }, + "node_modules/@chain-registry/keplr/node_modules/@keplr-wallet/proto-types": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@keplr-wallet/proto-types/-/proto-types-0.11.16.tgz", + "integrity": "sha512-0tX7AN1bmlZdpUwqgjQU6MI+p+qBBaWUxHvOrNYtvX0FShw9RihasWdrV6biciQewVd54fChVIGmYKhCLtwPsg==", + "dependencies": { + "long": "^4.0.0", + "protobufjs": "^6.11.2" + } + }, + "node_modules/@chain-registry/keplr/node_modules/@keplr-wallet/types": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@keplr-wallet/types/-/types-0.11.16.tgz", + "integrity": "sha512-jkBWj6bcw6BZqPavLms3EcaK6YG4suoTPA9PuO6+eFjj7TomUrzzYdhXyc7Mm0K/KVEz5CjPxjmx7LsPuWYKgg==", + "dependencies": { + "axios": "^0.27.2", + "long": "^4.0.0", + "secretjs": "0.17.7" + } + }, + "node_modules/@chain-registry/keplr/node_modules/@keplr-wallet/unit": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@keplr-wallet/unit/-/unit-0.11.16.tgz", + "integrity": "sha512-RRVE3oLZq84P4CQONHXDRX+jdqsP9Zar0V9ROAkG4qzitG2glNY/KCVd9SeSOatbGOb/4X88/4pH273TkjtlRA==", + "dependencies": { + "@keplr-wallet/types": "0.11.16", + "big-integer": "^1.6.48", + "utility-types": "^3.10.0" + } + }, + "node_modules/@chain-registry/keplr/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@chain-registry/types": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@chain-registry/types/-/types-0.13.1.tgz", + "integrity": "sha512-NF4x7pqkQJ/zSQLoT28sYlBdzWUyCTFvWgVE9hJ2jkirX+It9VUHP5j1wtTq+vxQ74SZk2V8vRBo2uuoEYBB1A==", + "dependencies": { + "@babel/runtime": "^7.19.4" + } + }, + "node_modules/@confio/ics23": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.8.tgz", + "integrity": "sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==", + "dependencies": { + "@noble/hashes": "^1.0.0", + "protobufjs": "^6.8.8" + } + }, + "node_modules/@cosmjs/amino": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.31.0.tgz", + "integrity": "sha512-xJ5CCEK7H79FTpOuEmlpSzVI+ZeYESTVvO3wHDgbnceIyAne3C68SvyaKqLUR4uJB0Z4q4+DZHbqW6itUiv4lA==", + "dependencies": { + "@cosmjs/crypto": "^0.31.0", + "@cosmjs/encoding": "^0.31.0", + "@cosmjs/math": "^0.31.0", + "@cosmjs/utils": "^0.31.0" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.31.0.tgz", + "integrity": "sha512-l6aX++3LhaAGZO46qIgrrNF40lYhOrdPfl35Z32ks6Wf3mwgbQEZwaxnoGzwUePY7/yaIiEFJ1JO6MlVPZVuag==", + "dependencies": { + "@cosmjs/amino": "^0.31.0", + "@cosmjs/crypto": "^0.31.0", + "@cosmjs/encoding": "^0.31.0", + "@cosmjs/math": "^0.31.0", + "@cosmjs/proto-signing": "^0.31.0", + "@cosmjs/stargate": "^0.31.0", + "@cosmjs/tendermint-rpc": "^0.31.0", + "@cosmjs/utils": "^0.31.0", + "cosmjs-types": "^0.8.0", + "long": "^4.0.0", + "pako": "^2.0.2" + } + }, + "node_modules/@cosmjs/crypto": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.31.0.tgz", + "integrity": "sha512-UaqCe6Tgh0pe1QlZ66E13t6FlIF86QrnBXXq+EN7Xe1Rouza3fJ1ojGlPleJZkBoq3tAyYVIOOqdZIxtVj/sIQ==", + "dependencies": { + "@cosmjs/encoding": "^0.31.0", + "@cosmjs/math": "^0.31.0", + "@cosmjs/utils": "^0.31.0", + "@noble/hashes": "^1", + "bn.js": "^5.2.0", + "elliptic": "^6.5.4", + "libsodium-wrappers-sumo": "^0.7.11" + } + }, + "node_modules/@cosmjs/encoding": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.31.0.tgz", + "integrity": "sha512-NYGQDRxT7MIRSlcbAezwxK0FqnaSPKCH7O32cmfpHNWorFxhy9lwmBoCvoe59Kd0HmArI4h+NGzLEfX3OLnA4Q==", + "dependencies": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "node_modules/@cosmjs/json-rpc": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.31.0.tgz", + "integrity": "sha512-Ix2Cil2qysiLNrX+E0w3vtwCrqxGVq8jklpLA7B2vtMrw7tru/rS65fdFSy8ep0wUNLL6Ud32VXa5K0YObDOMA==", + "dependencies": { + "@cosmjs/stream": "^0.31.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/math": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.31.0.tgz", + "integrity": "sha512-Sb/8Ry/+gKJaYiV6X8q45kxXC9FoV98XCY1WXtu0JQwOi61VCG2VXsURQnVvZ/EhR/CuT/swOlNKrqEs3da0fw==", + "dependencies": { + "bn.js": "^5.2.0" + } + }, + "node_modules/@cosmjs/proto-signing": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.31.0.tgz", + "integrity": "sha512-JNlyOJRkn8EKB9mCthkjr6lVX6eyVQ09PFdmB4/DR874E62dFTvQ+YvyKMAgN7K7Dcjj26dVlAD3f6Xs7YOGDg==", + "dependencies": { + "@cosmjs/amino": "^0.31.0", + "@cosmjs/crypto": "^0.31.0", + "@cosmjs/encoding": "^0.31.0", + "@cosmjs/math": "^0.31.0", + "@cosmjs/utils": "^0.31.0", + "cosmjs-types": "^0.8.0", + "long": "^4.0.0" + } + }, + "node_modules/@cosmjs/socket": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.31.0.tgz", + "integrity": "sha512-WDh9gTyiP3OCXvSAJJn33+Ef3XqMWag+bpR1TdMBxTmlTxuvU+kPy4cf6P2OF+jkkUBEA5Se2EAju0eFbJMT+w==", + "dependencies": { + "@cosmjs/stream": "^0.31.0", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/stargate": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.31.0.tgz", + "integrity": "sha512-GYhk9lzZPj/QmYHC0VV/4AMoRzVcOP+EnB1YZCoWlBdLuVmpBYKRagJqWIrIwdk1E0gF2ZoESd2TYfdh1fqIpg==", + "dependencies": { + "@confio/ics23": "^0.6.8", + "@cosmjs/amino": "^0.31.0", + "@cosmjs/encoding": "^0.31.0", + "@cosmjs/math": "^0.31.0", + "@cosmjs/proto-signing": "^0.31.0", + "@cosmjs/stream": "^0.31.0", + "@cosmjs/tendermint-rpc": "^0.31.0", + "@cosmjs/utils": "^0.31.0", + "cosmjs-types": "^0.8.0", + "long": "^4.0.0", + "protobufjs": "~6.11.3", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/stream": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.31.0.tgz", + "integrity": "sha512-Y+aSHwhHkLGIaQOdqRob+yga2zr9ifl9gZDKD+B7+R5pdWN5f2TTDhYWxA6YZcZ6xRmfr7u8a7tDh7iYLC/zKA==", + "dependencies": { + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/tendermint-rpc": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.31.0.tgz", + "integrity": "sha512-yo9xbeuI6UoEKIhFZ9g0dvUKLqnBzwdpEc/uldQygQc51j38gQVwFko+6sjmhieJqRYYvrYumcbJMiV6GFM9aA==", + "dependencies": { + "@cosmjs/crypto": "^0.31.0", + "@cosmjs/encoding": "^0.31.0", + "@cosmjs/json-rpc": "^0.31.0", + "@cosmjs/math": "^0.31.0", + "@cosmjs/socket": "^0.31.0", + "@cosmjs/stream": "^0.31.0", + "@cosmjs/utils": "^0.31.0", + "axios": "^0.21.2", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/utils": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.31.0.tgz", + "integrity": "sha512-nNcycZWUYLNJlrIXgpcgVRqdl6BXjF4YlXdxobQWpW9Tikk61bEGeAFhDYtC0PwHlokCNw0KxWiHGJL4nL7Q5A==" + }, + "node_modules/@cosmos-kit/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cosmos-kit/core/-/core-2.1.0.tgz", + "integrity": "sha512-QFtVtzd2VXDQ55WfelPtMRdgnd3nalonEdcKnWe54GTCmyOa9zkADQFW7N48w6yoFDXZFPAnbIFoa5CEJo99CA==", + "dependencies": { + "@chain-registry/types": "0.13.0", + "@walletconnect/types": "2.7.2", + "bowser": "2.11.0", + "events": "3.3.0" + }, + "peerDependencies": { + "@cosmjs/amino": ">= 0.28", + "@cosmjs/cosmwasm-stargate": ">= 0.28", + "@cosmjs/proto-signing": ">= 0.28", + "@cosmjs/stargate": ">= 0.28", + "cosmjs-types": ">= 0.5" + } + }, + "node_modules/@cosmos-kit/core/node_modules/@chain-registry/types": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@chain-registry/types/-/types-0.13.0.tgz", + "integrity": "sha512-2xgKaRK6T3qkkzWkj2n5nHzGNl+0RuDDB8nS+oyssBe4tCq835yMkxrVAOivFfEm5YGl92FcaVDLrzmfPUO0MA==", + "dependencies": { + "@babel/runtime": "^7.19.4", + "@keplr-wallet/cosmos": "^0.11.12", + "@keplr-wallet/crypto": "^0.11.12" + } + }, + "node_modules/@cosmos-kit/keplr": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cosmos-kit/keplr/-/keplr-2.1.0.tgz", + "integrity": "sha512-Y7Rz5QUlXvkPLAp3RgiiHTeRk16+O+5peosYGzbTE563j5Au8hl9y/mHuxk7z0Rtc++GjAnAzEar31FqCaeYhQ==", + "dependencies": { + "@cosmos-kit/keplr-extension": "^2.1.0", + "@cosmos-kit/keplr-mobile": "^2.1.0" + } + }, + "node_modules/@cosmos-kit/keplr-extension": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cosmos-kit/keplr-extension/-/keplr-extension-2.1.0.tgz", + "integrity": "sha512-2heJlcKwcFCizhneqJKKYefDb8qvk0WzSv6Sgnqh4jnnXEU+Hh3+6jOCktjNY540naXIucEeICwa3kvTkqDp2w==", + "dependencies": { + "@chain-registry/keplr": "1.8.0", + "@cosmos-kit/core": "^2.1.0" + }, + "peerDependencies": { + "@cosmjs/amino": ">= 0.28", + "@cosmjs/proto-signing": ">= 0.28" + } + }, + "node_modules/@cosmos-kit/keplr-mobile": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cosmos-kit/keplr-mobile/-/keplr-mobile-2.1.0.tgz", + "integrity": "sha512-i8SwDsaSGqo0b9y2Pk3mrsAQzl0Omt10LVaUryPKVYYzRqulcSbICV6bwsG5ZfYuLM7Su4qDuma+tupfKz3ijQ==", + "dependencies": { + "@chain-registry/keplr": "1.8.0", + "@cosmos-kit/core": "^2.1.0", + "@cosmos-kit/walletconnect": "^2.1.0" + }, + "peerDependencies": { + "@cosmjs/amino": ">= 0.28", + "@cosmjs/proto-signing": ">= 0.28" + } + }, + "node_modules/@cosmos-kit/react": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@cosmos-kit/react/-/react-2.1.1.tgz", + "integrity": "sha512-ZSpwVoEZDkJPJG+Ru4iR87v3WbRSOPgyf4wRq1zbp5kmNoezbjumoFuWRx2MpSvl0yYRfLlzpEqB3HGq5TTWYA==", + "dependencies": { + "@chain-registry/types": "0.13.1", + "@cosmos-kit/core": "^2.1.0", + "@cosmos-kit/react-lite": "^2.1.1", + "@interchain-ui/react": "1.3.0", + "@react-icons/all-files": "^4.1.0" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@cosmos-kit/react-lite": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@cosmos-kit/react-lite/-/react-lite-2.1.1.tgz", + "integrity": "sha512-2wDkZYYGA45alR6xfd7nDizh8P3Sqmc0FlWLHS+Y6Gx66CRnsEoWejQz2kkakEai1PcNMefvkAJt9l5fCloUyg==", + "dependencies": { + "@chain-registry/types": "0.13.1", + "@cosmos-kit/core": "^2.1.0" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@cosmos-kit/react/node_modules/@interchain-ui/react": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@interchain-ui/react/-/react-1.3.0.tgz", + "integrity": "sha512-17Forqigz0o0vUsg9b+oJoYiYTr5FLwCcj5VNivOBH4+Icg/IzAl7nR5UeCkcpXbd6QHdFPBZtijLKLmfj1O1Q==", + "dependencies": { + "@fastify/deepmerge": "^1.3.0", + "@formkit/auto-animate": "1.0.0-beta.6", + "@types/react-transition-group": "4.4.5", + "@vanilla-extract/css": "^1.12.0", + "@vanilla-extract/css-utils": "^0.1.3", + "@vanilla-extract/dynamic": "^2.0.3", + "@vanilla-extract/recipes": "^0.4.0", + "@zag-js/dialog": "^0.9.2", + "@zag-js/react": "^0.9.2", + "animejs": "^3.2.1", + "bignumber.js": "^9.1.1", + "clsx": "^1.2.1", + "copy-to-clipboard": "^3.3.3", + "immer": "^9.0.19", + "lodash": "^4.17.21", + "motion": "^10.16.2", + "polished": "^4.2.2", + "rainbow-sprinkles": "^0.17.0", + "zustand": "^4.3.8" + }, + "peerDependencies": { + "react": "^18.x", + "react-dom": "^18.x" + } + }, + "node_modules/@cosmos-kit/walletconnect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cosmos-kit/walletconnect/-/walletconnect-2.1.0.tgz", + "integrity": "sha512-/y+JBjGOi11uYJZsBvJZkC30EH6KBeo0bxPfbe8yLusdhItHavwjZlnv0BOVI0BA7mIIb38hAM1c3yQmS9g/pQ==", + "dependencies": { + "@babel/runtime": "7.11.2", + "@cosmos-kit/core": "^2.1.0", + "@walletconnect/sign-client": "^2.9.0", + "@walletconnect/types": "^2.9.0", + "@walletconnect/utils": "^2.9.0", + "events": "3.3.0" + }, + "peerDependencies": { + "@cosmjs/amino": ">= 0.28", + "@cosmjs/proto-signing": ">= 0.28" + } + }, + "node_modules/@cosmos-kit/walletconnect/node_modules/@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@cosmos-kit/walletconnect/node_modules/@walletconnect/types": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.9.1.tgz", + "integrity": "sha512-xbGgTPuD6xsb7YMvCESBIH55cjB86QAnnVL50a/ED42YkQzDsOdJ0VGTbrm0tG5cxUOF933rpxZQjxGdP+ovww==", + "dependencies": { + "@walletconnect/events": "^1.0.1", + "@walletconnect/heartbeat": "1.2.1", + "@walletconnect/jsonrpc-types": "1.0.3", + "@walletconnect/keyvaluestorage": "^1.0.2", + "@walletconnect/logger": "^2.0.1", + "events": "^3.3.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@fastify/deepmerge": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", + "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" + }, + "node_modules/@formkit/auto-animate": { + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@formkit/auto-animate/-/auto-animate-1.0.0-beta.6.tgz", + "integrity": "sha512-PVDhLAlr+B4Xb7e+1wozBUWmXa6BFU8xUPR/W/E+TsQhPS1qkAdAsJ25keEnFrcePSnXHrOsh3tiFbEToOzV9w==" + }, + "node_modules/@headlessui/react": { + "version": "1.7.15", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz", + "integrity": "sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw==", + "dependencies": { + "client-only": "^0.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "node_modules/@interchain-ui/react": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@interchain-ui/react/-/react-1.3.3.tgz", + "integrity": "sha512-YMgbsa935yCM+vsK2SnZe220TRcDr8+Pm1xBwaQVwthUd2OWFMjB2ktJ+zrtT8pii6XlOZ5EMbE5M1BPQVGbAQ==", + "dependencies": { + "@fastify/deepmerge": "^1.3.0", + "@formkit/auto-animate": "1.0.0-beta.6", + "@vanilla-extract/css": "^1.12.0", + "@vanilla-extract/css-utils": "^0.1.3", + "@vanilla-extract/dynamic": "^2.0.3", + "@vanilla-extract/recipes": "^0.4.0", + "@zag-js/dialog": "^0.9.2", + "@zag-js/react": "^0.9.2", + "animejs": "^3.2.1", + "bignumber.js": "^9.1.1", + "clsx": "^1.2.1", + "copy-to-clipboard": "^3.3.3", + "immer": "^9.0.19", + "motion": "^10.16.2", + "rainbow-sprinkles": "^0.17.0", + "zustand": "^4.3.8" + }, + "peerDependencies": { + "react": "^18.x", + "react-dom": "^18.x" + } + }, + "node_modules/@iov/crypto": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@iov/crypto/-/crypto-2.1.0.tgz", + "integrity": "sha512-jnb4XuK50admolm7fBxOcxfAW2TO+wYrZlhDWiMETItY/Y5gNNa1zaDSO2wNIjjfGng+8nQ1yqnNhqy7busV2Q==", + "dependencies": { + "@iov/encoding": "^2.1.0", + "bip39": "^3.0.2", + "bn.js": "^4.11.8", + "elliptic": "^6.4.0", + "js-sha3": "^0.8.0", + "libsodium-wrappers": "^0.7.6", + "pbkdf2": "^3.0.16", + "ripemd160": "^2.0.2", + "sha.js": "^2.4.11", + "type-tagger": "^1.0.0", + "unorm": "^1.5.0" + } + }, + "node_modules/@iov/crypto/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@iov/encoding": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@iov/encoding/-/encoding-2.1.0.tgz", + "integrity": "sha512-5IOdLO7Xg/uRykuiCqeMYghQ3IjWDtGxv7NTWXkgpHuna0aewx43mRpT2NPCpOZd1tpuorDtQ7/zbDNRaIIF/w==", + "dependencies": { + "base64-js": "^1.3.0", + "bech32": "^1.1.3", + "bn.js": "^4.11.8", + "readonly-date": "^1.0.0" + } + }, + "node_modules/@iov/encoding/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@iov/utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@iov/utils/-/utils-2.0.2.tgz", + "integrity": "sha512-4D8MEvTcFc/DVy5q25vHxRItmgJyeX85dixMH+MxdKr+yy71h3sYk+sVBEIn70uqGP7VqAJkGOPNFs08/XYELw==" + }, + "node_modules/@keplr-wallet/common": { + "version": "0.11.64", + "resolved": "https://registry.npmjs.org/@keplr-wallet/common/-/common-0.11.64.tgz", + "integrity": "sha512-kEnv6K+TxH+BBwwqUgiTcIXuRLBn6PaZMO4jwJbE1O8C8Qh/2j1QtkMLAMgl3Nj9qQkHgJ/dvA5oIqOIdLVMwg==", + "dependencies": { + "@keplr-wallet/crypto": "0.11.64", + "buffer": "^6.0.3", + "delay": "^4.4.0" + } + }, + "node_modules/@keplr-wallet/cosmos": { + "version": "0.11.64", + "resolved": "https://registry.npmjs.org/@keplr-wallet/cosmos/-/cosmos-0.11.64.tgz", + "integrity": "sha512-S6pLRaDKOyOFPfry7Km+Bgwr087gwHI4n3fp8NLGHtL75mLnOdeGvSEVW5LXJEWc5EyYgngM2CeS7xNHz+vjHg==", + "dependencies": { + "@ethersproject/address": "^5.6.0", + "@keplr-wallet/common": "0.11.64", + "@keplr-wallet/crypto": "0.11.64", + "@keplr-wallet/proto-types": "0.11.64", + "@keplr-wallet/types": "0.11.64", + "@keplr-wallet/unit": "0.11.64", + "axios": "^0.27.2", + "bech32": "^1.1.4", + "buffer": "^6.0.3", + "long": "^4.0.0", + "protobufjs": "^6.11.2" + } + }, + "node_modules/@keplr-wallet/cosmos/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@keplr-wallet/crypto": { + "version": "0.11.64", + "resolved": "https://registry.npmjs.org/@keplr-wallet/crypto/-/crypto-0.11.64.tgz", + "integrity": "sha512-DMeGhs+UUBpvefYa/0pF8h8D0lVS1T/eTGNKrn7SIO5CBMp1qfght+k1Se0pHGLr4CAtxFSXTDvYm3mr+ovKhg==", + "dependencies": { + "@ethersproject/keccak256": "^5.5.0", + "bip32": "^2.0.6", + "bip39": "^3.0.3", + "bs58check": "^2.1.2", + "buffer": "^6.0.3", + "crypto-js": "^4.0.0", + "elliptic": "^6.5.3", + "sha.js": "^2.4.11" + } + }, + "node_modules/@keplr-wallet/proto-types": { + "version": "0.11.64", + "resolved": "https://registry.npmjs.org/@keplr-wallet/proto-types/-/proto-types-0.11.64.tgz", + "integrity": "sha512-3oxfD1+zHPPuyKz41wt5A/gVhf2FQbA/L2u/4TxnmnITkY3IENirvMDrZUDJF0pWyGgZuXjhoVVFN2hMWI++PQ==", + "dependencies": { + "long": "^4.0.0", + "protobufjs": "^6.11.2" + } + }, + "node_modules/@keplr-wallet/types": { + "version": "0.11.64", + "resolved": "https://registry.npmjs.org/@keplr-wallet/types/-/types-0.11.64.tgz", + "integrity": "sha512-GgzeLDHHfZFyne3O7UIfFHj/uYqVbxAZI31RbBwt460OBbvwQzjrlZwvJW3vieWRAgxKSITjzEDBl2WneFTQdQ==", + "dependencies": { + "axios": "^0.27.2", + "long": "^4.0.0" + } + }, + "node_modules/@keplr-wallet/types/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@keplr-wallet/unit": { + "version": "0.11.64", + "resolved": "https://registry.npmjs.org/@keplr-wallet/unit/-/unit-0.11.64.tgz", + "integrity": "sha512-BKTaDYI17QgEcBBCP5ZqsHsfNH29P6VMRxjR4nOXcJfhsuwvdJxa/p88VwQYbpVBw0oXcDOwudNiu7Bgf8w6QQ==", + "dependencies": { + "@keplr-wallet/types": "0.11.64", + "big-integer": "^1.6.48", + "utility-types": "^3.10.0" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz", + "integrity": "sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/mdx": "^2.0.0", + "estree-util-build-jsx": "^2.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "estree-util-to-js": "^1.1.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^2.0.0", + "markdown-extensions": "^1.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^2.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "unified": "^10.0.0", + "unist-util-position-from-estree": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz", + "integrity": "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==", + "dependencies": { + "@types/mdx": "^2.0.0", + "@types/react": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/@motionone/animation": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", + "integrity": "sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==", + "dependencies": { + "@motionone/easing": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/dom": { + "version": "10.16.2", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.2.tgz", + "integrity": "sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==", + "dependencies": { + "@motionone/animation": "^10.15.1", + "@motionone/generators": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/easing": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz", + "integrity": "sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==", + "dependencies": { + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/generators": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz", + "integrity": "sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==", + "dependencies": { + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/svelte": { + "version": "10.16.2", + "resolved": "https://registry.npmjs.org/@motionone/svelte/-/svelte-10.16.2.tgz", + "integrity": "sha512-38xsroKrfK+aHYhuQlE6eFcGy0EwrB43Q7RGjF73j/kRUTcLNu/LAaKiLLsN5lyqVzCgTBVt4TMT/ShWbTbc5Q==", + "dependencies": { + "@motionone/dom": "^10.16.2", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/types": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz", + "integrity": "sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==" + }, + "node_modules/@motionone/utils": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz", + "integrity": "sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==", + "dependencies": { + "@motionone/types": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/vue": { + "version": "10.16.2", + "resolved": "https://registry.npmjs.org/@motionone/vue/-/vue-10.16.2.tgz", + "integrity": "sha512-7/dEK/nWQXOkJ70bqb2KyNfSWbNvWqKKq1C8juj+0Mg/AorgD8O5wE3naddK0G+aXuNMqRuc4jlsYHHWHtIzVw==", + "dependencies": { + "@motionone/dom": "^10.16.2", + "tslib": "^2.3.1" + } + }, + "node_modules/@napi-rs/simple-git": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.8.tgz", + "integrity": "sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA==", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@napi-rs/simple-git-android-arm-eabi": "0.1.8", + "@napi-rs/simple-git-android-arm64": "0.1.8", + "@napi-rs/simple-git-darwin-arm64": "0.1.8", + "@napi-rs/simple-git-darwin-x64": "0.1.8", + "@napi-rs/simple-git-linux-arm-gnueabihf": "0.1.8", + "@napi-rs/simple-git-linux-arm64-gnu": "0.1.8", + "@napi-rs/simple-git-linux-arm64-musl": "0.1.8", + "@napi-rs/simple-git-linux-x64-gnu": "0.1.8", + "@napi-rs/simple-git-linux-x64-musl": "0.1.8", + "@napi-rs/simple-git-win32-arm64-msvc": "0.1.8", + "@napi-rs/simple-git-win32-x64-msvc": "0.1.8" + } + }, + "node_modules/@napi-rs/simple-git-android-arm-eabi": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.8.tgz", + "integrity": "sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-android-arm64": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.8.tgz", + "integrity": "sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-darwin-arm64": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.8.tgz", + "integrity": "sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-darwin-x64": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.8.tgz", + "integrity": "sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-arm-gnueabihf": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.8.tgz", + "integrity": "sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-arm64-gnu": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.8.tgz", + "integrity": "sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA==", + "cpu": [ + "arm64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-arm64-musl": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.8.tgz", + "integrity": "sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow==", + "cpu": [ + "arm64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-x64-gnu": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.8.tgz", + "integrity": "sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw==", + "cpu": [ + "x64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-x64-musl": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.8.tgz", + "integrity": "sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ==", + "cpu": [ + "x64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-win32-arm64-msvc": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.8.tgz", + "integrity": "sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-win32-x64-msvc": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.8.tgz", + "integrity": "sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/env": { + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.8.tgz", + "integrity": "sha512-twuSf1klb3k9wXI7IZhbZGtFCWvGD4wXTY2rmvzIgVhXhs7ISThrbNyutBx3jWIL8Y/Hk9+woytFz5QsgtcRKQ==" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.8.tgz", + "integrity": "sha512-MSFplVM4dTWOuKAUv0XR9gY7AWtMSBu9os9f+kp+s5rWhM1I2CdR3obFttd6366nS/W/VZxbPM5oEIdlIa46zA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.8.tgz", + "integrity": "sha512-Reox+UXgonon9P0WNDE6w85DGtyBqGitl/ryznOvn6TvfxEaZIpTgeu3ZrJLU9dHSMhiK7YAM793mE/Zii2/Qw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.8.tgz", + "integrity": "sha512-kdyzYvAYtqQVgzIKNN7e1rLU8aZv86FDSRqPlOkKZlvqudvTO0iohuTPmnEEDlECeBM6qRPShNffotDcU/R2KA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.8.tgz", + "integrity": "sha512-oWxx4yRkUGcR81XwbI+T0zhZ3bDF6V1aVLpG+C7hSG50ULpV8gC39UxVO22/bv93ZlcfMY4zl8xkz9Klct6dpQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.8.tgz", + "integrity": "sha512-anhtvuO6eE9YRhYnaEGTfbpH3L5gT/9qPFcNoi6xS432r/4DAtpJY8kNktqkTVevVIC/pVumqO8tV59PR3zbNg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.8.tgz", + "integrity": "sha512-aR+J4wWfNgH1DwCCBNjan7Iumx0lLtn+2/rEYuhIrYLY4vnxqSVGz9u3fXcgUwo6Q9LT8NFkaqK1vPprdq+BXg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.8.tgz", + "integrity": "sha512-OWBKIrJwQBTqrat0xhxEB/jcsjJR3+diD9nc/Y8F1mRdQzsn4bPsomgJyuqPVZs6Lz3K18qdIkvywmfSq75SsQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.8.tgz", + "integrity": "sha512-agiPWGjUndXGTOn4ChbKipQXRA6/UPkywAWIkx7BhgGv48TiJfHTK6MGfBoL9tS6B4mtW39++uy0wFPnfD0JWg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.8.tgz", + "integrity": "sha512-UIRKoByVKbuR6SnFG4JM8EMFlJrfEGuUQ1ihxzEleWcNwRMMiVaCj1KyqfTOW8VTQhJ0u8P1Ngg6q1RwnIBTtw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@react-icons/all-files": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@react-icons/all-files/-/all-files-4.1.0.tgz", + "integrity": "sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@stablelib/aead": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/aead/-/aead-1.0.1.tgz", + "integrity": "sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==" + }, + "node_modules/@stablelib/binary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz", + "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==", + "dependencies": { + "@stablelib/int": "^1.0.1" + } + }, + "node_modules/@stablelib/bytes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/bytes/-/bytes-1.0.1.tgz", + "integrity": "sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==" + }, + "node_modules/@stablelib/chacha": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/chacha/-/chacha-1.0.1.tgz", + "integrity": "sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==", + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/chacha20poly1305": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz", + "integrity": "sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==", + "dependencies": { + "@stablelib/aead": "^1.0.1", + "@stablelib/binary": "^1.0.1", + "@stablelib/chacha": "^1.0.1", + "@stablelib/constant-time": "^1.0.1", + "@stablelib/poly1305": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/constant-time/-/constant-time-1.0.1.tgz", + "integrity": "sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==" + }, + "node_modules/@stablelib/ed25519": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stablelib/ed25519/-/ed25519-1.0.3.tgz", + "integrity": "sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==", + "dependencies": { + "@stablelib/random": "^1.0.2", + "@stablelib/sha512": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/hash": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz", + "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==" + }, + "node_modules/@stablelib/hkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/hkdf/-/hkdf-1.0.1.tgz", + "integrity": "sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==", + "dependencies": { + "@stablelib/hash": "^1.0.1", + "@stablelib/hmac": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/hmac": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/hmac/-/hmac-1.0.1.tgz", + "integrity": "sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==", + "dependencies": { + "@stablelib/constant-time": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/int": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz", + "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==" + }, + "node_modules/@stablelib/keyagreement": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz", + "integrity": "sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==", + "dependencies": { + "@stablelib/bytes": "^1.0.1" + } + }, + "node_modules/@stablelib/poly1305": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/poly1305/-/poly1305-1.0.1.tgz", + "integrity": "sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==", + "dependencies": { + "@stablelib/constant-time": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/random": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz", + "integrity": "sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==", + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/sha256": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/sha256/-/sha256-1.0.1.tgz", + "integrity": "sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==", + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/sha512": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/sha512/-/sha512-1.0.1.tgz", + "integrity": "sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==", + "dependencies": { + "@stablelib/binary": "^1.0.1", + "@stablelib/hash": "^1.0.1", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@stablelib/wipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz", + "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==" + }, + "node_modules/@stablelib/x25519": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stablelib/x25519/-/x25519-1.0.3.tgz", + "integrity": "sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==", + "dependencies": { + "@stablelib/keyagreement": "^1.0.1", + "@stablelib/random": "^1.0.2", + "@stablelib/wipe": "^1.0.1" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", + "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@theguild/remark-mermaid": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@theguild/remark-mermaid/-/remark-mermaid-0.0.3.tgz", + "integrity": "sha512-fccVR6o4UPUztrBjdUhM4ahwx+X7YHhoxsUoXv2vI07vz4dq+I03Ot0SjuZzDA/H7engxcb8ZxzCUEkZgGr/2g==", + "dependencies": { + "mermaid": "^10.2.2", + "unist-util-visit": "^4.1.2" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", + "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" + }, + "node_modules/@types/katex": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.14.0.tgz", + "integrity": "sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.5.tgz", + "integrity": "sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg==" + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, + "node_modules/@types/node": { + "version": "18.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", + "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/react": { + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", + "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@vanilla-extract/css": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.12.0.tgz", + "integrity": "sha512-TEttZfnqTRtwgVYiBWQSGGUiVaYWReHp59DsavITEvh4TpJNifZFGhBznHx4wQFEsyio6xA513jps4tmqR6zmw==", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@vanilla-extract/private": "^1.0.3", + "ahocorasick": "1.0.2", + "chalk": "^4.1.1", + "css-what": "^6.1.0", + "cssesc": "^3.0.0", + "csstype": "^3.0.7", + "deep-object-diff": "^1.1.9", + "deepmerge": "^4.2.2", + "media-query-parser": "^2.0.2", + "outdent": "^0.8.0" + } + }, + "node_modules/@vanilla-extract/css-utils": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@vanilla-extract/css-utils/-/css-utils-0.1.3.tgz", + "integrity": "sha512-PZAcHROlgtCUGI2y0JntdNwvPwCNyeVnkQu6KTYKdmxBbK3w72XJUmLFYapfaFfgami4I9CTLnrJTPdtmS3gpw==" + }, + "node_modules/@vanilla-extract/css/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vanilla-extract/css/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@vanilla-extract/css/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@vanilla-extract/css/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@vanilla-extract/css/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@vanilla-extract/css/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vanilla-extract/dynamic": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vanilla-extract/dynamic/-/dynamic-2.0.3.tgz", + "integrity": "sha512-Rglfw2gXAYiBzAQ4jgUG7rBgE2c88e/zcG27ZVoIqMHVq56wf2C1katGMm1yFMNBgzqM7oBNYzz4YOMzznydkg==", + "dependencies": { + "@vanilla-extract/private": "^1.0.3" + } + }, + "node_modules/@vanilla-extract/private": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.3.tgz", + "integrity": "sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==" + }, + "node_modules/@vanilla-extract/recipes": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@vanilla-extract/recipes/-/recipes-0.4.0.tgz", + "integrity": "sha512-gFgB7BofUYbtbxINHK6DhMv1JDFDXp/YI/Xm+cqKar+1I/2dfxPepeDxSexL6YB4ftfeaDw8Kn5zydMvHcGOEQ==", + "peerDependencies": { + "@vanilla-extract/css": "^1.0.0" + } + }, + "node_modules/@walletconnect/core": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.9.1.tgz", + "integrity": "sha512-xyWeP0eLhEEDQAVJSmqs4n/AClKUM+8os2ZFe7BTuw1tFYjeLNVDtKCHziVOSTh8wEChMsKSGKA4zerQoH8mAQ==", + "dependencies": { + "@walletconnect/heartbeat": "1.2.1", + "@walletconnect/jsonrpc-provider": "1.0.13", + "@walletconnect/jsonrpc-types": "1.0.3", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.13", + "@walletconnect/keyvaluestorage": "^1.0.2", + "@walletconnect/logger": "^2.0.1", + "@walletconnect/relay-api": "^1.0.9", + "@walletconnect/relay-auth": "^1.0.4", + "@walletconnect/safe-json": "^1.0.2", + "@walletconnect/time": "^1.0.2", + "@walletconnect/types": "2.9.1", + "@walletconnect/utils": "2.9.1", + "events": "^3.3.0", + "lodash.isequal": "4.5.0", + "uint8arrays": "^3.1.0" + } + }, + "node_modules/@walletconnect/core/node_modules/@walletconnect/types": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.9.1.tgz", + "integrity": "sha512-xbGgTPuD6xsb7YMvCESBIH55cjB86QAnnVL50a/ED42YkQzDsOdJ0VGTbrm0tG5cxUOF933rpxZQjxGdP+ovww==", + "dependencies": { + "@walletconnect/events": "^1.0.1", + "@walletconnect/heartbeat": "1.2.1", + "@walletconnect/jsonrpc-types": "1.0.3", + "@walletconnect/keyvaluestorage": "^1.0.2", + "@walletconnect/logger": "^2.0.1", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/environment": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", + "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==", + "dependencies": { + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/environment/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/events": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz", + "integrity": "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==", + "dependencies": { + "keyvaluestorage-interface": "^1.0.0", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/events/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/heartbeat": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.1.tgz", + "integrity": "sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q==", + "dependencies": { + "@walletconnect/events": "^1.0.1", + "@walletconnect/time": "^1.0.2", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/heartbeat/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/jsonrpc-provider": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz", + "integrity": "sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g==", + "dependencies": { + "@walletconnect/jsonrpc-utils": "^1.0.8", + "@walletconnect/safe-json": "^1.0.2", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/jsonrpc-provider/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/jsonrpc-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz", + "integrity": "sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw==", + "dependencies": { + "keyvaluestorage-interface": "^1.0.0", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/jsonrpc-types/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/jsonrpc-utils": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz", + "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==", + "dependencies": { + "@walletconnect/environment": "^1.0.1", + "@walletconnect/jsonrpc-types": "^1.0.3", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/jsonrpc-ws-connection": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.13.tgz", + "integrity": "sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg==", + "dependencies": { + "@walletconnect/jsonrpc-utils": "^1.0.6", + "@walletconnect/safe-json": "^1.0.2", + "events": "^3.3.0", + "tslib": "1.14.1", + "ws": "^7.5.1" + } + }, + "node_modules/@walletconnect/jsonrpc-ws-connection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/keyvaluestorage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.0.2.tgz", + "integrity": "sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ==", + "dependencies": { + "safe-json-utils": "^1.1.1", + "tslib": "1.14.1" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x", + "lokijs": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + }, + "lokijs": { + "optional": true + } + } + }, + "node_modules/@walletconnect/keyvaluestorage/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/logger": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.0.1.tgz", + "integrity": "sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ==", + "dependencies": { + "pino": "7.11.0", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/logger/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/relay-api": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.9.tgz", + "integrity": "sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg==", + "dependencies": { + "@walletconnect/jsonrpc-types": "^1.0.2", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/relay-api/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/relay-auth": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz", + "integrity": "sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==", + "dependencies": { + "@stablelib/ed25519": "^1.0.2", + "@stablelib/random": "^1.0.1", + "@walletconnect/safe-json": "^1.0.1", + "@walletconnect/time": "^1.0.2", + "tslib": "1.14.1", + "uint8arrays": "^3.0.0" + } + }, + "node_modules/@walletconnect/relay-auth/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/safe-json": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz", + "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==", + "dependencies": { + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/safe-json/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/sign-client": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.9.1.tgz", + "integrity": "sha512-Z7tFRrJ9btA1vU427vsjUS6cPlHQVcTWdKH90khEc2lv3dB6mU8FNO0VJsw+I2D7CW7WaMWF3nnj6Z1FfotbDg==", + "dependencies": { + "@walletconnect/core": "2.9.1", + "@walletconnect/events": "^1.0.1", + "@walletconnect/heartbeat": "1.2.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "^2.0.1", + "@walletconnect/time": "^1.0.2", + "@walletconnect/types": "2.9.1", + "@walletconnect/utils": "2.9.1", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/sign-client/node_modules/@walletconnect/types": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.9.1.tgz", + "integrity": "sha512-xbGgTPuD6xsb7YMvCESBIH55cjB86QAnnVL50a/ED42YkQzDsOdJ0VGTbrm0tG5cxUOF933rpxZQjxGdP+ovww==", + "dependencies": { + "@walletconnect/events": "^1.0.1", + "@walletconnect/heartbeat": "1.2.1", + "@walletconnect/jsonrpc-types": "1.0.3", + "@walletconnect/keyvaluestorage": "^1.0.2", + "@walletconnect/logger": "^2.0.1", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz", + "integrity": "sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==", + "dependencies": { + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/time/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/types": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.7.2.tgz", + "integrity": "sha512-1O2UefakZpT0ErRfEAXY7Ls3qdUrKDky/DsK088xR6klyfkQOx+aSVH0fJYLhmnqPTuvp3lrqNbsDc0s6/6nvg==", + "dependencies": { + "@walletconnect/events": "^1.0.1", + "@walletconnect/heartbeat": "1.2.1", + "@walletconnect/jsonrpc-types": "^1.0.2", + "@walletconnect/keyvaluestorage": "^1.0.2", + "@walletconnect/logger": "^2.0.1", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/utils": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.9.1.tgz", + "integrity": "sha512-tXeQVebF5oPBvhdmuUyVSkSIBYx/egIi4czav1QrnUpwrUS1LsrFhyWBxSbhN7TXY287ULWkEf6aFpWOHdp5EA==", + "dependencies": { + "@stablelib/chacha20poly1305": "1.0.1", + "@stablelib/hkdf": "1.0.1", + "@stablelib/random": "^1.0.2", + "@stablelib/sha256": "1.0.1", + "@stablelib/x25519": "^1.0.3", + "@walletconnect/relay-api": "^1.0.9", + "@walletconnect/safe-json": "^1.0.2", + "@walletconnect/time": "^1.0.2", + "@walletconnect/types": "2.9.1", + "@walletconnect/window-getters": "^1.0.1", + "@walletconnect/window-metadata": "^1.0.1", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "^3.1.0" + } + }, + "node_modules/@walletconnect/utils/node_modules/@walletconnect/types": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.9.1.tgz", + "integrity": "sha512-xbGgTPuD6xsb7YMvCESBIH55cjB86QAnnVL50a/ED42YkQzDsOdJ0VGTbrm0tG5cxUOF933rpxZQjxGdP+ovww==", + "dependencies": { + "@walletconnect/events": "^1.0.1", + "@walletconnect/heartbeat": "1.2.1", + "@walletconnect/jsonrpc-types": "1.0.3", + "@walletconnect/keyvaluestorage": "^1.0.2", + "@walletconnect/logger": "^2.0.1", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/window-getters": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz", + "integrity": "sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==", + "dependencies": { + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/window-getters/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/window-metadata": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz", + "integrity": "sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==", + "dependencies": { + "@walletconnect/window-getters": "^1.0.1", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/window-metadata/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@zag-js/anatomy": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/anatomy/-/anatomy-0.9.2.tgz", + "integrity": "sha512-DgzZf4oo1/tdnSzUDu75pdxYep8WmgvxZi3h1Qa0hlu0erGvWPV0L7aAkdrau+Z3z4phc0FndieIDZN1oN1bEg==" + }, + "node_modules/@zag-js/aria-hidden": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/aria-hidden/-/aria-hidden-0.9.2.tgz", + "integrity": "sha512-Md+RCv8yOQ7uALjE8GRV0al3sb007aobFn1g6Vz0OSUD6Owsl4k1hwV1ZBWkSq6+OHhty35HROydqsKANDGc1g==", + "dependencies": { + "@zag-js/dom-query": "0.9.2" + } + }, + "node_modules/@zag-js/core": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/core/-/core-0.9.2.tgz", + "integrity": "sha512-L8MwOCuKnOdWqjSRlgb8HQYuD29yRmi0PrTip+T42YK4+SiBiROeGcExYH2txIpVCk3Gww8TU5TzOHDvKCACyA==", + "dependencies": { + "@zag-js/store": "0.9.2", + "klona": "2.0.6" + } + }, + "node_modules/@zag-js/dialog": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/dialog/-/dialog-0.9.2.tgz", + "integrity": "sha512-F7LrX2W5lSXukzRNnEL9z8E4zoHmqagrfP/o55jlM8+U/CVoLrRzTmPfl9b3ARguidkFIKj1ZgxZkphM9B0xoQ==", + "dependencies": { + "@zag-js/anatomy": "0.9.2", + "@zag-js/aria-hidden": "0.9.2", + "@zag-js/core": "0.9.2", + "@zag-js/dismissable": "0.9.2", + "@zag-js/dom-query": "0.9.2", + "@zag-js/remove-scroll": "0.9.2", + "@zag-js/types": "0.9.2", + "@zag-js/utils": "0.9.2", + "focus-trap": "7.4.1" + } + }, + "node_modules/@zag-js/dismissable": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/dismissable/-/dismissable-0.9.2.tgz", + "integrity": "sha512-e654TDrIMedzFawTF6o/o4Pdf5k78asE5nSBKri3FZqbHWmpCacLc+vil5d27nc7Y3BXRuM7AyAaFoyBnZ/IOw==", + "dependencies": { + "@zag-js/dom-event": "0.9.2", + "@zag-js/dom-query": "0.9.2", + "@zag-js/interact-outside": "0.9.2", + "@zag-js/utils": "0.9.2" + } + }, + "node_modules/@zag-js/dom-event": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/dom-event/-/dom-event-0.9.2.tgz", + "integrity": "sha512-2HUoIZw7Ig5bzm3S1f5i7S50LlyakhAD1seHBw6w+VwM7I6AFpbpJZjYAESeeKE+SAIA5q3CpdpL+KfdO5jpRg==", + "dependencies": { + "@zag-js/text-selection": "0.9.2", + "@zag-js/types": "0.9.2" + } + }, + "node_modules/@zag-js/dom-query": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-0.9.2.tgz", + "integrity": "sha512-N4K9sl3Dup+Jb0kaXrrwClwUdXgpgBb4xKYRDfG9HPO8ixX11Px8j4iTU3MdvhEt81sE7SkECdJNoyXaNxFqZA==" + }, + "node_modules/@zag-js/interact-outside": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/interact-outside/-/interact-outside-0.9.2.tgz", + "integrity": "sha512-UYaim/6dgqo5lUyfag5SeWqyGwGHyBgh7MC92eymI86Kb3BYOUhIfXEUaoaacFBxRuJbhmFEsxFF8bN/tWNTJw==", + "dependencies": { + "@zag-js/dom-event": "0.9.2", + "@zag-js/dom-query": "0.9.2", + "@zag-js/tabbable": "0.9.2", + "@zag-js/utils": "0.9.2" + } + }, + "node_modules/@zag-js/react": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/react/-/react-0.9.2.tgz", + "integrity": "sha512-7HBRfXQnPghWQwH/SY4MjUfRg8F6JaX/AosUA1mgUAi6WAIMEr8bIwb3iRVdRdjMoya/w3uynESpuimvo/7GFA==", + "dependencies": { + "@zag-js/core": "0.9.2", + "@zag-js/store": "0.9.2", + "@zag-js/types": "0.9.2", + "proxy-compare": "2.5.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@zag-js/remove-scroll": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/remove-scroll/-/remove-scroll-0.9.2.tgz", + "integrity": "sha512-SJti7IWmsXQU58vlMOz6BxzfSVKjLWMf7TJB2S6B/vuxLqrDpVal4+K5kgYqwa2rmbf/NkR+4ocdLyF63YupUg==", + "dependencies": { + "@zag-js/dom-query": "0.9.2" + } + }, + "node_modules/@zag-js/store": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/store/-/store-0.9.2.tgz", + "integrity": "sha512-FO6BUK6ri0pZCEWqT8veiaZoTQwnCMqQ+C1pvf+ZtMnGMCjMXe/QvNUx/dcHSrscGckWJDBTJRbLhmDedyDPUA==", + "dependencies": { + "proxy-compare": "2.5.1" + } + }, + "node_modules/@zag-js/tabbable": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/tabbable/-/tabbable-0.9.2.tgz", + "integrity": "sha512-CekXUcJ7HqK+MIFXazBD7KIrntOIJZc8lscf3aXEkpbYfTmilad1ZORAR5tnsIkYIoDHcLdxhT69CKR87NMNFA==", + "dependencies": { + "@zag-js/dom-query": "0.9.2" + } + }, + "node_modules/@zag-js/text-selection": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/text-selection/-/text-selection-0.9.2.tgz", + "integrity": "sha512-xaXeLb9U7wZ5kEZ/L/if5INcX2YWi+Yzr8KIH2cNUaRE79cJFf0z1JG4D8VmO40EnCE396DVyNeLFdQXOAsu4Q==", + "dependencies": { + "@zag-js/dom-query": "0.9.2" + } + }, + "node_modules/@zag-js/types": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/types/-/types-0.9.2.tgz", + "integrity": "sha512-MM8KPTW5nX438fDb57K0DM+nxcLA9+WoFyE9A/fEaCH2kGsaVltmsY1ejolU4duYNOEQVon9T39QlGfgc81f/w==", + "dependencies": { + "csstype": "3.1.2" + } + }, + "node_modules/@zag-js/utils": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@zag-js/utils/-/utils-0.9.2.tgz", + "integrity": "sha512-PQZRIhgaowNrON7UF4u1JTABUhlWhMiu4uwN7S7SXcpyq1z8JXb4j5YEHNkH4F7lLMQAwmMdpJXHfjH5bYXR1Q==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ahocorasick": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ahocorasick/-/ahocorasick-1.0.2.tgz", + "integrity": "sha512-hCOfMzbFx5IDutmWLAt6MZwOUjIfSM9G9FyVxytmE4Rs/5YDPWQrD/+IR1w+FweD9H2oOZEnv36TmkjhNURBVA==" + }, + "node_modules/animejs": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/animejs/-/animejs-3.2.1.tgz", + "integrity": "sha512-sWno3ugFryK5nhiDm/2BKeFCpZv7vzerWUcUPyAZLDhMek3+S/p418ldZJbJXo5ZUOpfm2kP2XRO4NJcULMy9A==" + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", + "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==" + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/arg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-1.0.0.tgz", + "integrity": "sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/astring": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bip32": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", + "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", + "dependencies": { + "@types/node": "10.12.18", + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.1.3", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bip32/node_modules/@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + }, + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001512", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz", + "integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chain-registry": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/chain-registry/-/chain-registry-1.18.0.tgz", + "integrity": "sha512-m80cUS7DM235FVxw82Vxf/9/j3qp8GXCQa7wtC55AaHdyajX/C0hWw513FVBKnMyCLPwLfMzC58eiFudBk888w==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@chain-registry/types": "^0.16.0" + } + }, + "node_modules/chain-registry/node_modules/@chain-registry/types": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@chain-registry/types/-/types-0.16.0.tgz", + "integrity": "sha512-4j6vq2Vqn/nF+UBjvRPUVs6eM3+5rJ+dPmEWpd/OoNH3wTy1k6aoilcSTZRR//vGcI5EOVGsxhhJxUzo2qqweA==", + "dependencies": { + "@babel/runtime": "^7.21.0" + } + }, + "node_modules/chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dependencies": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/clipboardy": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.2.tgz", + "integrity": "sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==", + "dependencies": { + "arch": "^2.1.0", + "execa": "^0.8.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz", + "integrity": "sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cosmjs-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.8.0.tgz", + "integrity": "sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg==", + "dependencies": { + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/curve25519-js": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/curve25519-js/-/curve25519-js-0.0.4.tgz", + "integrity": "sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w==" + }, + "node_modules/cytoscape": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.25.0.tgz", + "integrity": "sha512-7MW3Iz57mCUo6JQCho6CmPBCbTlJr7LzyEtIkutG255HLVd4XuBg2I9BkTZLI/e4HoaOB/BiAzXuQybQ95+r9Q==", + "dependencies": { + "heap": "^0.2.6", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" + }, + "node_modules/d3": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", + "dependencies": { + "d3": "^7.8.2", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-object-diff": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz", + "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delay": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/delay/-/delay-4.4.1.tgz", + "integrity": "sha512-aL3AhqtfhOlT/3ai6sWXeqwnw63ATNpnUiN4HL7x9q+My5QtHlO3OIkasmug9LKzpheLdmUKGRKnYXYAS7FQkQ==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-browser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", + "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==" + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dompurify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.3.tgz", + "integrity": "sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ==" + }, + "node_modules/duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "node_modules/elkjs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", + "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz", + "integrity": "sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz", + "integrity": "sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz", + "integrity": "sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz", + "integrity": "sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz", + "integrity": "sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==", + "dependencies": { + "is-plain-obj": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/estree-util-visit": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.1.tgz", + "integrity": "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "node_modules/fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flexsearch": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.31.tgz", + "integrity": "sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==" + }, + "node_modules/focus-trap": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.4.1.tgz", + "integrity": "sha512-rnXP5ERIjlo1gEZp7hQb4ekYqUxRuSDQeyWvxhahH3/GkWtd8h8g1C8Eu/KGpuvbUWNVeogK0kuzzrM4u2Z9jA==", + "dependencies": { + "tabbable": "^6.1.2" + } + }, + "node_modules/focus-visible": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz", + "integrity": "sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } + }, + "node_modules/git-url-parse": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", + "dependencies": { + "git-up": "^7.0.0" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-obj": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hash-obj/-/hash-obj-4.0.0.tgz", + "integrity": "sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==", + "dependencies": { + "is-obj": "^3.0.0", + "sort-keys": "^5.0.0", + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hast-util-from-dom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz", + "integrity": "sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==", + "dependencies": { + "hastscript": "^7.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-1.0.2.tgz", + "integrity": "sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^7.0.0", + "vfile": "^5.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html-isomorphic": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-1.0.0.tgz", + "integrity": "sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-dom": "^4.0.0", + "hast-util-from-html": "^1.0.0", + "unist-util-remove-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", + "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz", + "integrity": "sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz", + "integrity": "sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "estree-util-attach-comments": "^2.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdxjs-esm": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.1", + "unist-util-position": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz", + "integrity": "sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "unist-util-find-after": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/intersection-observer": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.2.tgz", + "integrity": "sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", + "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-reference": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.1.tgz", + "integrity": "sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/js-crypto-env": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/js-crypto-env/-/js-crypto-env-0.3.2.tgz", + "integrity": "sha512-F1uHiCkSOo36qBuuZABA4sBf+xeFBzhJZ0Sd7af8FAruszIhm1Xxv+Zr5Ne90Zlh7/fnxCsrdkj0N8f0a3lVlQ==" + }, + "node_modules/js-crypto-hash": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/js-crypto-hash/-/js-crypto-hash-0.6.3.tgz", + "integrity": "sha512-SG8c9tM8y3sUb4k7WvpVfu5vU7zfPvX+eaYR5578TvehkehdaQbqAc+y+1FwxnqQ3WZ0gsYoOKp/mW+mqtNoWA==", + "dependencies": { + "buffer": "~5.4.3", + "hash.js": "~1.1.7", + "js-crypto-env": "^0.3.2", + "md5": "~2.2.1", + "sha3": "~2.1.0" + } + }, + "node_modules/js-crypto-hash/node_modules/buffer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/js-crypto-hkdf": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/js-crypto-hkdf/-/js-crypto-hkdf-0.7.3.tgz", + "integrity": "sha512-eAaVArAjS2GCacWGXY4hjBiexrLQYlI0PMOcbwtrSEj84XU3kUfMYZm9bpTyaTXgdHC/eQoXe/Of6biG+RSEaQ==", + "dependencies": { + "js-crypto-env": "^0.3.2", + "js-crypto-hmac": "^0.6.3", + "js-crypto-random": "^0.4.3", + "js-encoding-utils": "0.5.6" + } + }, + "node_modules/js-crypto-hmac": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/js-crypto-hmac/-/js-crypto-hmac-0.6.3.tgz", + "integrity": "sha512-T0pKOaHACOSG6Xs6/06G8RDDeZouQwIQNBq9L/zoUGsd4F67gAjpT3q2lGigAGpUd1hiyy7vnhvLpz7VDt6DbA==", + "dependencies": { + "js-crypto-env": "^0.3.2", + "js-crypto-hash": "^0.6.3" + } + }, + "node_modules/js-crypto-random": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/js-crypto-random/-/js-crypto-random-0.4.3.tgz", + "integrity": "sha512-C3gzphPPfw9jfQ9Q/LjhJMZxQNp3AaoVRDvyZkiB+zYltfs8tKQPsskWkXACpg1Nzh01PtSRUvVijjptd2qGHQ==", + "dependencies": { + "js-crypto-env": "^0.3.2" + } + }, + "node_modules/js-encoding-utils": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/js-encoding-utils/-/js-encoding-utils-0.5.6.tgz", + "integrity": "sha512-qnAGsUIWrmzh5n+3AXqbxX1KsB9hkQmJZf3aA9DLAS7GpL/NEHCBreFFbW+imramoU+Q0TDyvkwhRbBRH1TVkg==" + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "node_modules/katex": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.8.tgz", + "integrity": "sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/keyvaluestorage-interface": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz", + "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==" + }, + "node_modules/khroma": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + }, + "node_modules/libsodium": { + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.11.tgz", + "integrity": "sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A==" + }, + "node_modules/libsodium-sumo": { + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.11.tgz", + "integrity": "sha512-bY+7ph7xpk51Ez2GbE10lXAQ5sJma6NghcIDaSPbM/G9elfrjLa0COHl/7P6Wb/JizQzl5UQontOOP1z0VwbLA==" + }, + "node_modules/libsodium-wrappers": { + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.11.tgz", + "integrity": "sha512-SrcLtXj7BM19vUKtQuyQKiQCRJPgbpauzl3s0rSwD+60wtHqSUuqcoawlMDheCJga85nKOQwxNYQxf/CKAvs6Q==", + "dependencies": { + "libsodium": "^0.7.11" + } + }, + "node_modules/libsodium-wrappers-sumo": { + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.11.tgz", + "integrity": "sha512-DGypHOmJbB1nZn89KIfGOAkDgfv5N6SBGC3Qvmy/On0P0WD1JQvNRS/e3UL3aFF+xC0m+MYz5M+MnRnK2HMrKQ==", + "dependencies": { + "libsodium-sumo": "^0.7.11" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/markdown-extensions": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz", + "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/match-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", + "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "remove-accents": "0.4.2" + } + }, + "node_modules/md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", + "dependencies": { + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/md5/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-math": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-2.0.2.tgz", + "integrity": "sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz", + "integrity": "sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdx-jsx": "^2.0.0", + "mdast-util-mdxjs-esm": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz", + "integrity": "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz", + "integrity": "sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "ccount": "^2.0.0", + "mdast-util-from-markdown": "^1.1.0", + "mdast-util-to-markdown": "^1.3.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^4.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz", + "integrity": "sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/media-query-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", + "integrity": "sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==", + "dependencies": { + "@babel/runtime": "^7.12.5" + } + }, + "node_modules/mermaid": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.2.4.tgz", + "integrity": "sha512-zHGjEI7lBvWZX+PQYmlhSA2p40OzW6QbGodTCSzDeVpqaTnyAC+2sRGqrpXO+uQk3CnoeClHQPraQUMStdqy2g==", + "dependencies": { + "@braintree/sanitize-url": "^6.0.2", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.4.0", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "3.0.3", + "elkjs": "^0.8.2", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "mdast-util-from-markdown": "^1.3.0", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.3", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-2.1.2.tgz", + "integrity": "sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==", + "dependencies": { + "@types/katex": "^0.16.0", + "katex": "^0.16.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math/node_modules/@types/katex": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.0.tgz", + "integrity": "sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw==" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz", + "integrity": "sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz", + "integrity": "sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz", + "integrity": "sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz", + "integrity": "sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^1.0.0", + "micromark-extension-mdx-jsx": "^1.0.0", + "micromark-extension-mdx-md": "^1.0.0", + "micromark-extension-mdxjs-esm": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz", + "integrity": "sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==", + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-core-commonmark": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.1.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz", + "integrity": "sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz", + "integrity": "sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^2.0.0", + "estree-util-visit": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/miscreant": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/miscreant/-/miscreant-0.3.2.tgz", + "integrity": "sha512-fL9KxsQz9BJB2KGPMHFrReioywkiomBiuaLk6EuChijK0BsJsIKJXdVomR+/bPj5mvbFD6wM0CM3bZio9g7OHA==" + }, + "node_modules/motion": { + "version": "10.16.2", + "resolved": "https://registry.npmjs.org/motion/-/motion-10.16.2.tgz", + "integrity": "sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==", + "dependencies": { + "@motionone/animation": "^10.15.1", + "@motionone/dom": "^10.16.2", + "@motionone/svelte": "^10.16.2", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "@motionone/vue": "^10.16.2" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.8.tgz", + "integrity": "sha512-lxUjndYKjZHGK3CWeN2RI+/6ni6EUvjiqGWXAYPxUfGIdFGQ5XoisrqAJ/dF74aP27buAfs8MKIbIMMdxjqSBg==", + "dependencies": { + "@next/env": "13.4.8", + "@swc/helpers": "0.5.1", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1", + "watchpack": "2.4.0", + "zod": "3.21.4" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=16.8.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "13.4.8", + "@next/swc-darwin-x64": "13.4.8", + "@next/swc-linux-arm64-gnu": "13.4.8", + "@next/swc-linux-arm64-musl": "13.4.8", + "@next/swc-linux-x64-gnu": "13.4.8", + "@next/swc-linux-x64-musl": "13.4.8", + "@next/swc-win32-arm64-msvc": "13.4.8", + "@next/swc-win32-ia32-msvc": "13.4.8", + "@next/swc-win32-x64-msvc": "13.4.8" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "fibers": ">= 3.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "fibers": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-mdx-remote": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-4.4.1.tgz", + "integrity": "sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==", + "dependencies": { + "@mdx-js/mdx": "^2.2.1", + "@mdx-js/react": "^2.2.1", + "vfile": "^5.3.0", + "vfile-matter": "^3.0.1" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "peerDependencies": { + "react": ">=16.x <=18.x", + "react-dom": ">=16.x <=18.x" + } + }, + "node_modules/next-seo": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/next-seo/-/next-seo-6.1.0.tgz", + "integrity": "sha512-iMBpFoJsR5zWhguHJvsoBDxDSmdYTHtnVPB1ij+CD0NReQCP78ZxxbdL9qkKIf4oEuZEqZkrjAQLB0bkII7RYA==", + "peerDependencies": { + "next": "^8.1.1-canary.54 || >=9.0.0", + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/next-themes": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", + "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==", + "peerDependencies": { + "next": "*", + "react": "*", + "react-dom": "*" + } + }, + "node_modules/nextra": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nextra/-/nextra-2.8.0.tgz", + "integrity": "sha512-WyRNzw1IM/eF3M1H3LSsbZH97QsYYgj8upjx0f8hY6GspmPyPRAvBBscmXRt+7vye2oIYjfVwSiD1rj9amqq9Q==", + "dependencies": { + "@mdx-js/mdx": "^2.3.0", + "@mdx-js/react": "^2.3.0", + "@napi-rs/simple-git": "^0.1.8", + "@theguild/remark-mermaid": "^0.0.3", + "clsx": "^1.2.1", + "github-slugger": "^2.0.0", + "graceful-fs": "^4.2.11", + "gray-matter": "^4.0.3", + "katex": "^0.16.7", + "lodash.get": "^4.4.2", + "next-mdx-remote": "^4.2.1", + "p-limit": "^3.1.0", + "rehype-katex": "^6.0.3", + "rehype-pretty-code": "0.9.9", + "remark-gfm": "^3.0.1", + "remark-math": "^5.1.1", + "remark-reading-time": "^2.0.1", + "shiki": "^0.14.2", + "slash": "^3.0.0", + "title": "^3.5.3", + "unist-util-remove": "^3.1.1", + "unist-util-visit": "^4.1.1", + "zod": "^3.20.2" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "next": ">=9.5.3", + "react": ">=16.13.1", + "react-dom": ">=16.13.1" + } + }, + "node_modules/nextra-theme-docs": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nextra-theme-docs/-/nextra-theme-docs-2.8.0.tgz", + "integrity": "sha512-JoSAILDVp0GxeVWWZBFGoRijE2RcjZcXrMa47Fssi254T5wF+gm0HvEOSwrTaKaPaUL+IfshAiKglvXNKGzbNw==", + "dependencies": { + "@headlessui/react": "^1.7.10", + "@popperjs/core": "^2.11.6", + "clsx": "^1.2.1", + "flexsearch": "^0.7.21", + "focus-visible": "^5.2.0", + "git-url-parse": "^13.1.0", + "intersection-observer": "^0.12.2", + "match-sorter": "^6.3.1", + "next-seo": "^6.0.0", + "next-themes": "^0.2.1", + "scroll-into-view-if-needed": "^3.0.0", + "zod": "^3.20.2" + }, + "peerDependencies": { + "next": ">=9.5.3", + "nextra": "2.8.0", + "react": ">=16.13.1", + "react-dom": ">=16.13.1" + } + }, + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-exit-leak-free": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/outdent": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz", + "integrity": "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==" + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "dependencies": { + "protocols": "^2.0.0" + } + }, + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "dependencies": { + "parse-path": "^7.0.0" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/pino": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", + "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.0.0", + "on-exit-leak-free": "^0.2.0", + "pino-abstract-transport": "v0.5.0", + "pino-std-serializers": "^4.0.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.1.0", + "safe-stable-stringify": "^2.1.0", + "sonic-boom": "^2.2.1", + "thread-stream": "^0.15.1" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", + "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "dependencies": { + "duplexify": "^4.1.2", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" + }, + "node_modules/polished": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", + "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, + "node_modules/property-information": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", + "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" + }, + "node_modules/proxy-compare": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.5.1.tgz", + "integrity": "sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/rainbow-sprinkles": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/rainbow-sprinkles/-/rainbow-sprinkles-0.17.0.tgz", + "integrity": "sha512-ok3NrylQ0szvJtuBYaB/w09L9zOvvqcSQrvycT2A5XJxQNvwvkeADvTqQWGOQ3b6MkO8UmYccBPt8g8vVvxM9A==", + "peerDependencies": { + "@vanilla-extract/css": "^1", + "@vanilla-extract/dynamic": "^2" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/readonly-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz", + "integrity": "sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==" + }, + "node_modules/real-require": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", + "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/rehype-katex": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-6.0.3.tgz", + "integrity": "sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/katex": "^0.14.0", + "hast-util-from-html-isomorphic": "^1.0.0", + "hast-util-to-text": "^3.1.0", + "katex": "^0.16.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-pretty-code": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/rehype-pretty-code/-/rehype-pretty-code-0.9.9.tgz", + "integrity": "sha512-mlU2Qgupn9MMK31CTmWk0Ie5Vp0od+jh2vCkGDBMlPAMeAvYASn6Ois6xRmosutMT4yH/COc3R4r/PELpuUoWg==", + "dependencies": { + "@types/hast": "^2.0.0", + "hash-obj": "^4.0.0", + "parse-numeric-range": "^1.3.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "shiki": "*" + } + }, + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-math": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-5.1.1.tgz", + "integrity": "sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-math": "^2.0.0", + "micromark-extension-math": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz", + "integrity": "sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==", + "dependencies": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-reading-time": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-reading-time/-/remark-reading-time-2.0.1.tgz", + "integrity": "sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==", + "dependencies": { + "estree-util-is-identifier-name": "^2.0.0", + "estree-util-value-to-estree": "^1.3.0", + "reading-time": "^1.3.0", + "unist-util-visit": "^3.1.0" + } + }, + "node_modules/remark-reading-time/node_modules/unist-util-visit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", + "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-reading-time/node_modules/unist-util-visit-parents": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", + "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-json-utils": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-json-utils/-/safe-json-utils-1.1.1.tgz", + "integrity": "sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ==" + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz", + "integrity": "sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/secretjs": { + "version": "0.17.7", + "resolved": "https://registry.npmjs.org/secretjs/-/secretjs-0.17.7.tgz", + "integrity": "sha512-j39l9+vR2A8067QBqDDejS7LmRLgdkG4uRw2Ar6HMfzDGo26eTh7cIXVlVu/yHBumxtQzKun20epOXwuYHXjQg==", + "deprecated": "deprecated", + "dependencies": { + "@iov/crypto": "2.1.0", + "@iov/encoding": "2.1.0", + "@iov/utils": "2.0.2", + "axios": "0.21.1", + "curve25519-js": "0.0.4", + "fast-deep-equal": "3.1.1", + "js-crypto-hkdf": "0.7.3", + "miscreant": "0.3.2", + "pako": "1.0.11", + "protobufjs": "6.11.3", + "secure-random": "1.1.2" + } + }, + "node_modules/secretjs/node_modules/axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dependencies": { + "follow-redirects": "^1.10.0" + } + }, + "node_modules/secretjs/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/secure-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/secure-random/-/secure-random-1.1.2.tgz", + "integrity": "sha512-H2bdSKERKdBV1SwoqYm6C0y+9EA94v6SUBOWO8kDndc4NoUih7Dv6Tsgma7zO1lv27wIvjlD0ZpMQk7um5dheQ==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/sha3": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", + "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shiki": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", + "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sonic-boom": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", + "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/sort-keys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-5.0.0.tgz", + "integrity": "sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==", + "dependencies": { + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-to-object": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", + "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" + }, + "node_modules/supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==", + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-observable": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", + "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "node_modules/thread-stream": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", + "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", + "dependencies": { + "real-require": "^0.1.0" + } + }, + "node_modules/tiny-secp256k1": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", + "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.3.0", + "bn.js": "^4.11.8", + "create-hmac": "^1.1.7", + "elliptic": "^6.4.0", + "nan": "^2.13.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tiny-secp256k1/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/title": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/title/-/title-3.5.3.tgz", + "integrity": "sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==", + "dependencies": { + "arg": "1.0.0", + "chalk": "2.3.0", + "clipboardy": "1.2.2", + "titleize": "1.0.0" + }, + "bin": { + "title": "bin/title.js" + } + }, + "node_modules/titleize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-1.0.0.tgz", + "integrity": "sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-tagger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-tagger/-/type-tagger-1.0.0.tgz", + "integrity": "sha512-FIPqqpmDgdaulCnRoKv1/d3U4xVBUrYn42QXWNP3XYmgfPUDuBUsgFOb9ntT0aIe0UsUP+lknpQ5d9Kn36RssA==" + }, + "node_modules/typeforce": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-find-after": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz", + "integrity": "sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz", + "integrity": "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-3.1.1.tgz", + "integrity": "sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz", + "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", + "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-matter": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile-matter/-/vfile-matter-3.0.1.tgz", + "integrity": "sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==", + "dependencies": { + "@types/js-yaml": "^4.0.0", + "is-buffer": "^2.0.0", + "js-yaml": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-matter/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/vfile-matter/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==" + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==" + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", + "dependencies": { + "bs58check": "<3.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xstream": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/xstream/-/xstream-11.14.0.tgz", + "integrity": "sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==", + "dependencies": { + "globalthis": "^1.0.1", + "symbol-observable": "^2.0.3" + } + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zustand": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.9.tgz", + "integrity": "sha512-Tat5r8jOMG1Vcsj8uldMyqYKC5IZvQif8zetmLHs9WoZlntTHmIoNM8TpLRY31ExncuUvUOXehd0kvahkuHjDw==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "immer": ">=9.0", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/sdk/typescript/docs/package.json b/sdk/typescript/docs/package.json new file mode 100644 index 0000000000..a33f6f33d0 --- /dev/null +++ b/sdk/typescript/docs/package.json @@ -0,0 +1,29 @@ +{ + "name": "nym-sdk-docs", + "version": "0.0.1", + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "lint:fix": "next lint --fix", + "docs:prod:build": "./scripts/build-prod-docs.sh" + }, + "dependencies": { + "@cosmjs/amino": "^0.31.0", + "@cosmjs/cosmwasm-stargate": "^0.31.0", + "@cosmos-kit/keplr": "^2.1.0", + "@cosmos-kit/react": "^2.1.1", + "@interchain-ui/react": "^1.3.3", + "chain-registry": "^1.18.0", + "next": "^13.0.6", + "nextra": "latest", + "nextra-theme-docs": "latest", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/node": "18.11.10", + "typescript": "^4.9.3" + } +} diff --git a/sdk/typescript/docs/pages/_meta.json b/sdk/typescript/docs/pages/_meta.json new file mode 100644 index 0000000000..3d07d952be --- /dev/null +++ b/sdk/typescript/docs/pages/_meta.json @@ -0,0 +1,6 @@ +{ + "index": "Introduction", + "sdk": "Typescript SDK", + "examples": "Example usage and apps", + "blockchain": "Nym Cosmos chain" +} diff --git a/sdk/typescript/docs/pages/blockchain/_meta.json b/sdk/typescript/docs/pages/blockchain/_meta.json new file mode 100644 index 0000000000..4f8abbb472 --- /dev/null +++ b/sdk/typescript/docs/pages/blockchain/_meta.json @@ -0,0 +1,3 @@ +{ + "wallet": "Wallet support" +} diff --git a/sdk/typescript/docs/pages/blockchain/wallet.mdx b/sdk/typescript/docs/pages/blockchain/wallet.mdx new file mode 100644 index 0000000000..5e7bbe91a8 --- /dev/null +++ b/sdk/typescript/docs/pages/blockchain/wallet.mdx @@ -0,0 +1,13 @@ + +You can try out interacting with the Nyx chain that runs the Nym smart contracts by connecting your wallet: + +```tsx +// TODO - move this out of fencing and fix up compile errors + +import { Wallet } from '../components/wallet'; + + +``` + +Nulla reprehenderit nostrud culpa consectetur culpa occaecat tempor culpa tempor eiusmod. Ullamco amet labore culpa ipsum ullamco veniam ex sunt et. Pariatur qui consectetur commodo irure non laboris officia in ex dolor eu. Quis est quis eiusmod non cillum ea aliqua amet excepteur deserunt. Esse commodo anim Lorem enim nostrud veniam ex cillum commodo proident laboris ad dolore. Lorem ea veniam ex cillum adipisicing ut sunt minim voluptate cupidatat labore voluptate eiusmod irure. Laborum ipsum ullamco fugiat elit ullamco officia laborum nulla aute ea et tempor labore id. + diff --git a/sdk/typescript/docs/pages/examples/_meta.json b/sdk/typescript/docs/pages/examples/_meta.json new file mode 100644 index 0000000000..1a0898b0b9 --- /dev/null +++ b/sdk/typescript/docs/pages/examples/_meta.json @@ -0,0 +1,5 @@ +{ + "index": "List of live examples", + "community": "Apps made by the Nym community", + "playground": "Interactive playground" +} diff --git a/sdk/typescript/docs/pages/examples/community.mdx b/sdk/typescript/docs/pages/examples/community.mdx new file mode 100644 index 0000000000..e5e5f3fb87 --- /dev/null +++ b/sdk/typescript/docs/pages/examples/community.mdx @@ -0,0 +1,8 @@ +# Community Typescript and Javascript apps + +Here is a list of apps built by our awesome community using the Nym Typescript SDK: + +- project 1 +- project 2 +- project 3 + diff --git a/sdk/typescript/docs/pages/examples/index.mdx b/sdk/typescript/docs/pages/examples/index.mdx new file mode 100644 index 0000000000..05e56d947c --- /dev/null +++ b/sdk/typescript/docs/pages/examples/index.mdx @@ -0,0 +1,12 @@ +# Examples + +Here are some live examples of what you can do with the Typescript SDK: + +- Chat app +- Node tester +- mixFetch demo + +And some examples of usage: + +- Firefox browser extension +- Chrome browser extension diff --git a/sdk/typescript/docs/pages/examples/playground.mdx b/sdk/typescript/docs/pages/examples/playground.mdx new file mode 100644 index 0000000000..3200695a3b --- /dev/null +++ b/sdk/typescript/docs/pages/examples/playground.mdx @@ -0,0 +1,7 @@ +# Try out the Typescript SDK live in your browser + +Commodo magna ullamco voluptate aute adipisicing culpa duis reprehenderit. Laboris fugiat in duis mollit dolor voluptate ex anim. Cupidatat enim nostrud laboris incididunt minim do do et adipisicing. Adipisicing pariatur dolor elit nisi elit. Cillum nisi irure officia ipsum. Pariatur ex esse dolor sit esse consectetur dolore dolor. Nostrud dolor proident ullamco sint commodo laboris culpa. + +Occaecat commodo deserunt ut laborum pariatur exercitation ea cillum officia non. Cupidatat amet aute ex exercitation magna quis fugiat consequat minim exercitation fugiat deserunt Lorem deserunt. Commodo irure incididunt officia et aute. + +Ut voluptate deserunt sunt voluptate elit. Incididunt enim nulla amet occaecat incididunt officia sunt eu fugiat dolore id anim. Aliqua duis voluptate consectetur ex voluptate nisi sit quis esse nulla irure aliquip. diff --git a/sdk/typescript/docs/pages/index.mdx b/sdk/typescript/docs/pages/index.mdx new file mode 100644 index 0000000000..a36b03cc62 --- /dev/null +++ b/sdk/typescript/docs/pages/index.mdx @@ -0,0 +1,3 @@ +# Introduction + +Welcome to the documentation for the Nym Typescript SDK. diff --git a/sdk/typescript/docs/pages/sdk/_meta.json b/sdk/typescript/docs/pages/sdk/_meta.json new file mode 100644 index 0000000000..fc58278791 --- /dev/null +++ b/sdk/typescript/docs/pages/sdk/_meta.json @@ -0,0 +1,5 @@ +{ + "index": "Introduction", + "mix-fetch": "mixFetch", + "react": "React" +} diff --git a/sdk/typescript/docs/pages/sdk/index.mdx b/sdk/typescript/docs/pages/sdk/index.mdx new file mode 100644 index 0000000000..f55fd65cca --- /dev/null +++ b/sdk/typescript/docs/pages/sdk/index.mdx @@ -0,0 +1,9 @@ +# Nym Typescript SDK + +Commodo magna ullamco voluptate aute adipisicing culpa duis reprehenderit. Laboris fugiat in duis mollit dolor voluptate ex anim. Cupidatat enim nostrud laboris incididunt minim do do et adipisicing. Adipisicing pariatur dolor elit nisi elit. Cillum nisi irure officia ipsum. Pariatur ex esse dolor sit esse consectetur dolore dolor. Nostrud dolor proident ullamco sint commodo laboris culpa. + +Occaecat commodo deserunt ut laborum pariatur exercitation ea cillum officia non. Cupidatat amet aute ex exercitation magna quis fugiat consequat minim exercitation fugiat deserunt Lorem deserunt. Commodo irure incididunt officia et aute. + +Ut voluptate deserunt sunt voluptate elit. Incididunt enim nulla amet occaecat incididunt officia sunt eu fugiat dolore id anim. Aliqua duis voluptate consectetur ex voluptate nisi sit quis esse nulla irure aliquip. + +Culpa proident aliqua eu in. Id Lorem eu nostrud cupidatat sint adipisicing ex esse tempor commodo. Enim labore commodo aute quis aliqua enim. Veniam minim sunt commodo cillum quis officia ea tempor adipisicing pariatur. Nisi ea in reprehenderit in nostrud. Mollit non proident cupidatat aliqua ut ea quis id exercitation labore excepteur nulla ex. diff --git a/sdk/typescript/docs/pages/sdk/mix-fetch.mdx b/sdk/typescript/docs/pages/sdk/mix-fetch.mdx new file mode 100644 index 0000000000..8ca721850d --- /dev/null +++ b/sdk/typescript/docs/pages/sdk/mix-fetch.mdx @@ -0,0 +1,8 @@ +--- +description: Send your HTTP requests over the Nym mixnet securely with a drop-in replacement for fetch +--- + +# mixFetch + +Anim occaecat exercitation officia aliquip sit culpa incididunt labore sit aute sint incididunt consequat. Ex enim ullamco dolore laboris incididunt aliqua duis consectetur non voluptate. Dolore ut sunt ad commodo. Veniam enim culpa tempor consectetur excepteur pariatur adipisicing. Commodo adipisicing magna irure deserunt cupidatat excepteur cupidatat consectetur fugiat irure aliqua laboris qui. Officia incididunt adipisicing elit eu fugiat cupidatat non irure id dolor. + diff --git a/sdk/typescript/docs/pages/sdk/node-tester.mdx b/sdk/typescript/docs/pages/sdk/node-tester.mdx new file mode 100644 index 0000000000..374a0dae0e --- /dev/null +++ b/sdk/typescript/docs/pages/sdk/node-tester.mdx @@ -0,0 +1,3 @@ +# Node Tester + +Deserunt commodo tempor magna culpa qui consectetur reprehenderit. Pariatur ipsum nostrud mollit ex elit est reprehenderit enim deserunt. Et voluptate veniam proident sunt ea in. Aute aliquip do commodo aliqua duis Lorem. Ut sunt officia exercitation magna nisi ea commodo do nostrud ullamco cupidatat tempor est. Magna minim magna minim occaecat. Tempor nisi occaecat amet duis duis qui deserunt culpa ex. diff --git a/sdk/typescript/docs/pages/sdk/react/_meta.json b/sdk/typescript/docs/pages/sdk/react/_meta.json new file mode 100644 index 0000000000..d3673f13ea --- /dev/null +++ b/sdk/typescript/docs/pages/sdk/react/_meta.json @@ -0,0 +1,3 @@ +{ + "index": "Introduction" +} diff --git a/sdk/typescript/docs/pages/sdk/react/components.mdx b/sdk/typescript/docs/pages/sdk/react/components.mdx new file mode 100644 index 0000000000..cb09ef1200 --- /dev/null +++ b/sdk/typescript/docs/pages/sdk/react/components.mdx @@ -0,0 +1,9 @@ +# Nym React Components + +Voluptate laborum sit deserunt mollit labore ex labore sunt. Aliquip culpa est veniam culpa dolore irure do veniam aliquip ullamco reprehenderit pariatur. Elit proident sit ullamco dolore deserunt aute minim. Irure consectetur minim elit et incididunt non fugiat ad deserunt consectetur ad. Veniam enim non ipsum duis anim duis duis cillum consectetur anim eiusmod sint veniam. Amet commodo dolor esse amet dolor quis labore elit. Tempor commodo ipsum enim consectetur sit culpa consequat nisi. + +UI to show: +- address display +- address form text input (with validation) +- currency display +- currency form text input (with validation) diff --git a/sdk/typescript/docs/pages/sdk/react/hooks.mdx b/sdk/typescript/docs/pages/sdk/react/hooks.mdx new file mode 100644 index 0000000000..53c6ceab8a --- /dev/null +++ b/sdk/typescript/docs/pages/sdk/react/hooks.mdx @@ -0,0 +1,3 @@ +# React Hooks for the SDK + +Voluptate laborum sit deserunt mollit labore ex labore sunt. Aliquip culpa est veniam culpa dolore irure do veniam aliquip ullamco reprehenderit pariatur. Elit proident sit ullamco dolore deserunt aute minim. Irure consectetur minim elit et incididunt non fugiat ad deserunt consectetur ad. Veniam enim non ipsum duis anim duis duis cillum consectetur anim eiusmod sint veniam. Amet commodo dolor esse amet dolor quis labore elit. Tempor commodo ipsum enim consectetur sit culpa consequat nisi. diff --git a/sdk/typescript/docs/pages/sdk/react/index.mdx b/sdk/typescript/docs/pages/sdk/react/index.mdx new file mode 100644 index 0000000000..9d94d539ac --- /dev/null +++ b/sdk/typescript/docs/pages/sdk/react/index.mdx @@ -0,0 +1,9 @@ +# React support + +Nym provides several React libraries: + + +We also suggest you look at [CosmosKit](https://docs.cosmoskit.com/) if you want to: +- use a wallet (Keplr, Cosmostation) in your app +- sign transactions with a Ledger hardware wallet +- query and execute methods on Nym's smart contracts diff --git a/sdk/typescript/docs/pages/sdk/tsdoc/_meta.json b/sdk/typescript/docs/pages/sdk/tsdoc/_meta.json new file mode 100644 index 0000000000..2a80340c0e --- /dev/null +++ b/sdk/typescript/docs/pages/sdk/tsdoc/_meta.json @@ -0,0 +1,21 @@ +{ + "index": "List of packages", + "@nymproject/sdk": { + "title": "@nymproject/sdk", + "type": "page", + "href": "/docs/tsdoc/nymproject/sdk/", + "newWindow": true + }, + "nymproject/mix-fetch": { + "title": "@nymproject/mix-fetch", + "type": "page", + "href": "/docs/tsdoc/nymproject/mix-fetch/", + "newWindow": true + }, + "nymproject/node-tester": { + "title": "@nymproject/node-tester", + "type": "page", + "href": "/docs/tsdoc/nymproject/node-tester/", + "newWindow": true + } +} diff --git a/sdk/typescript/docs/pages/sdk/tsdoc/index.mdx b/sdk/typescript/docs/pages/sdk/tsdoc/index.mdx new file mode 100644 index 0000000000..632c593e86 --- /dev/null +++ b/sdk/typescript/docs/pages/sdk/tsdoc/index.mdx @@ -0,0 +1,4 @@ +# `tsdoc` for all classes and interfaces + +Nostrud sint occaecat dolore qui mollit deserunt aliquip est elit. Fugiat id minim minim ut incididunt enim ipsum eiusmod tempor pariatur laborum proident. Exercitation adipisicing laborum culpa ipsum irure. Lorem amet anim pariatur exercitation dolore velit. Voluptate tempor proident laboris qui aliqua reprehenderit deserunt. In tempor eu nostrud ex consectetur incididunt in. + diff --git a/sdk/typescript/docs/pnpm-lock.yaml b/sdk/typescript/docs/pnpm-lock.yaml new file mode 100644 index 0000000000..afa36b4e63 --- /dev/null +++ b/sdk/typescript/docs/pnpm-lock.yaml @@ -0,0 +1,2172 @@ +lockfileVersion: 5.3 + +specifiers: + '@types/node': 18.11.10 + next: ^13.0.6 + nextra: latest + nextra-theme-docs: latest + react: ^18.2.0 + react-dom: ^18.2.0 + typescript: ^4.9.3 + +dependencies: + next: 13.0.6_react-dom@18.2.0+react@18.2.0 + nextra: 2.2.14_f26ff3bd08f1cd28b0f73422c76f5ffd + nextra-theme-docs: 2.2.14_d8d66b9d2170cddb63c39dddec8541b9 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + +devDependencies: + '@types/node': 18.11.10 + typescript: 4.9.3 + +packages: + + /@babel/runtime/7.20.6: + resolution: {integrity: sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: false + + /@headlessui/react/1.7.10_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-1m66h/5eayTEZVT2PI13/2PG3EVC7a9XalmUtVSC8X76pcyKYMuyX1XAL2RUtCr8WhoMa/KrDEyoeU5v+kSQOw==} + engines: {node: '>=10'} + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 + dependencies: + client-only: 0.0.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /@mdx-js/mdx/2.2.1: + resolution: {integrity: sha512-hZ3ex7exYLJn6FfReq8yTvA6TE53uW9UHJQM9IlSauOuS55J9y8RtA7W+dzp6Yrzr00/U1sd7q+Wf61q6SfiTQ==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/mdx': 2.0.3 + estree-util-build-jsx: 2.2.0 + estree-util-is-identifier-name: 2.0.1 + estree-util-to-js: 1.1.0 + estree-walker: 3.0.1 + hast-util-to-estree: 2.1.0 + markdown-extensions: 1.1.1 + periscopic: 3.0.4 + remark-mdx: 2.1.5 + remark-parse: 10.0.1 + remark-rehype: 10.1.0 + unified: 10.1.2 + unist-util-position-from-estree: 1.1.1 + unist-util-stringify-position: 3.0.2 + unist-util-visit: 4.1.1 + vfile: 5.3.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@mdx-js/react/2.2.1_react@18.2.0: + resolution: {integrity: sha512-YdXcMcEnqZhzql98RNrqYo9cEhTTesBiCclEtoiQUbJwx87q9453GTapYU6kJ8ZZ2ek1Vp25SiAXEFy5O/eAPw==} + peerDependencies: + react: '>=16' + dependencies: + '@types/mdx': 2.0.3 + '@types/react': 18.0.25 + react: 18.2.0 + dev: false + + /@napi-rs/simple-git-android-arm-eabi/0.1.8: + resolution: {integrity: sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-android-arm64/0.1.8: + resolution: {integrity: sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-darwin-arm64/0.1.8: + resolution: {integrity: sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-darwin-x64/0.1.8: + resolution: {integrity: sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-linux-arm-gnueabihf/0.1.8: + resolution: {integrity: sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-linux-arm64-gnu/0.1.8: + resolution: {integrity: sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-linux-arm64-musl/0.1.8: + resolution: {integrity: sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-linux-x64-gnu/0.1.8: + resolution: {integrity: sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-linux-x64-musl/0.1.8: + resolution: {integrity: sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-win32-arm64-msvc/0.1.8: + resolution: {integrity: sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-win32-x64-msvc/0.1.8: + resolution: {integrity: sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git/0.1.8: + resolution: {integrity: sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA==} + engines: {node: '>= 10'} + optionalDependencies: + '@napi-rs/simple-git-android-arm-eabi': 0.1.8 + '@napi-rs/simple-git-android-arm64': 0.1.8 + '@napi-rs/simple-git-darwin-arm64': 0.1.8 + '@napi-rs/simple-git-darwin-x64': 0.1.8 + '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.8 + '@napi-rs/simple-git-linux-arm64-gnu': 0.1.8 + '@napi-rs/simple-git-linux-arm64-musl': 0.1.8 + '@napi-rs/simple-git-linux-x64-gnu': 0.1.8 + '@napi-rs/simple-git-linux-x64-musl': 0.1.8 + '@napi-rs/simple-git-win32-arm64-msvc': 0.1.8 + '@napi-rs/simple-git-win32-x64-msvc': 0.1.8 + dev: false + + /@next/env/13.0.6: + resolution: {integrity: sha512-yceT6DCHKqPRS1cAm8DHvDvK74DLIkDQdm5iV+GnIts8h0QbdHvkUIkdOvQoOODgpr6018skbmSQp12z5OWIQQ==} + dev: false + + /@next/swc-android-arm-eabi/13.0.6: + resolution: {integrity: sha512-FGFSj3v2Bluw8fD/X+1eXIEB0PhoJE0zfutsAauRhmNpjjZshLDgoXMWm1jTRL/04K/o9gwwO2+A8+sPVCH1uw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@next/swc-android-arm64/13.0.6: + resolution: {integrity: sha512-7MgbtU7kimxuovVsd7jSJWMkIHBDBUsNLmmlkrBRHTvgzx5nDBXogP0hzZm7EImdOPwVMPpUHRQMBP9mbsiJYQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-arm64/13.0.6: + resolution: {integrity: sha512-AUVEpVTxbP/fxdFsjVI9d5a0CFn6NVV7A/RXOb0Y+pXKIIZ1V5rFjPwpYfIfyOo2lrqgehMNQcyMRoTrhq04xg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64/13.0.6: + resolution: {integrity: sha512-SasCDJlshglsPnbzhWaIF6VEGkQy2NECcAOxPwaPr0cwbbt4aUlZ7QmskNzgolr5eAjFS/xTr7CEeKJtZpAAtQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-freebsd-x64/13.0.6: + resolution: {integrity: sha512-6Lbxd9gAdXneTkwHyYW/qtX1Tdw7ND9UbiGsGz/SP43ZInNWnW6q0au4hEVPZ9bOWWRKzcVoeTBdoMpQk9Hx9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm-gnueabihf/13.0.6: + resolution: {integrity: sha512-wNdi5A519e1P+ozEuYOhWPzzE6m1y7mkO6NFwn6watUwO0X9nZs7fT9THmnekvmFQpaZ6U+xf2MQ9poQoCh6jQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu/13.0.6: + resolution: {integrity: sha512-e8KTRnleQY1KLk5PwGV5hrmvKksCc74QRpHl5ffWnEEAtL2FE0ave5aIkXqErsPdXkiKuA/owp3LjQrP+/AH7Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl/13.0.6: + resolution: {integrity: sha512-/7RF03C3mhjYpHN+pqOolgME3guiHU5T3TsejuyteqyEyzdEyLHod+jcYH6ft7UZ71a6TdOewvmbLOtzHW2O8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu/13.0.6: + resolution: {integrity: sha512-kxyEXnYHpOEkFnmrlwB1QlzJtjC6sAJytKcceIyFUHbCaD3W/Qb5tnclcnHKTaFccizZRePXvV25Ok/eUSpKTw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl/13.0.6: + resolution: {integrity: sha512-N0c6gubS3WW1oYYgo02xzZnNatfVQP/CiJq2ax+DJ55ePV62IACbRCU99TZNXXg+Kos6vNW4k+/qgvkvpGDeyA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc/13.0.6: + resolution: {integrity: sha512-QjeMB2EBqBFPb/ac0CYr7GytbhUkrG4EwFWbcE0vsRp4H8grt25kYpFQckL4Jak3SUrp7vKfDwZ/SwO7QdO8vw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-ia32-msvc/13.0.6: + resolution: {integrity: sha512-EQzXtdqRTcmhT/tCq81rIwE36Y3fNHPInaCuJzM/kftdXfa0F+64y7FAoMO13npX8EG1+SamXgp/emSusKrCXg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc/13.0.6: + resolution: {integrity: sha512-pSkqZ//UP/f2sS9T7IvHLfEWDPTX0vRyXJnAUNisKvO3eF3e1xdhDX7dix/X3Z3lnN4UjSwOzclAI87JFbOwmQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@popperjs/core/2.11.6: + resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} + dev: false + + /@swc/helpers/0.4.14: + resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} + dependencies: + tslib: 2.4.1 + dev: false + + /@types/acorn/4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.0 + dev: false + + /@types/debug/4.1.7: + resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + dependencies: + '@types/ms': 0.7.31 + dev: false + + /@types/estree-jsx/1.0.0: + resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} + dependencies: + '@types/estree': 1.0.0 + dev: false + + /@types/estree/1.0.0: + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + dev: false + + /@types/hast/2.3.4: + resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /@types/js-yaml/4.0.5: + resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} + dev: false + + /@types/katex/0.11.1: + resolution: {integrity: sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg==} + dev: false + + /@types/mdast/3.0.10: + resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /@types/mdx/2.0.3: + resolution: {integrity: sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ==} + dev: false + + /@types/ms/0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: false + + /@types/node/18.11.10: + resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} + dev: true + + /@types/prop-types/15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: false + + /@types/react/18.0.25: + resolution: {integrity: sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.1.1 + dev: false + + /@types/scheduler/0.16.2: + resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + dev: false + + /@types/unist/2.0.6: + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + dev: false + + /acorn-jsx/5.3.2_acorn@8.8.1: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.1 + dev: false + + /acorn/8.8.1: + resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /arch/2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: false + + /arg/1.0.0: + resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} + dev: false + + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /astring/1.8.3: + resolution: {integrity: sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==} + hasBin: true + dev: false + + /bail/2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /caniuse-lite/1.0.30001435: + resolution: {integrity: sha512-kdCkUTjR+v4YAJelyiDTqiu82BDr4W4CP5sgTA0ZBmqn30XfS2ZghPLMowik9TPhS+psWJiUNxsqLyurDbmutA==} + dev: false + + /ccount/2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk/2.3.0: + resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 4.5.0 + dev: false + + /character-entities-html4/2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy/3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities/2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /character-reference-invalid/2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + + /client-only/0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /clipboardy/1.2.2: + resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} + engines: {node: '>=4'} + dependencies: + arch: 2.2.0 + execa: 0.8.0 + dev: false + + /clsx/1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /comma-separated-tokens/2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + + /commander/8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: false + + /compute-scroll-into-view/2.0.4: + resolution: {integrity: sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==} + dev: false + + /cross-spawn/5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: false + + /csstype/3.1.1: + resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + dev: false + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /decode-named-character-reference/1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + + /dequal/2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + + /diff/5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: false + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp/5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /estree-util-attach-comments/2.1.0: + resolution: {integrity: sha512-rJz6I4L0GaXYtHpoMScgDIwM0/Vwbu5shbMeER596rB2D1EWF6+Gj0e0UKzJPZrpoOc87+Q2kgVFHfjAymIqmw==} + dependencies: + '@types/estree': 1.0.0 + dev: false + + /estree-util-build-jsx/2.2.0: + resolution: {integrity: sha512-apsfRxF9uLrqosApvHVtYZjISPvTJ+lBiIydpC+9wE6cF6ssbhnjyQLqaIjgzGxvC2Hbmec1M7g91PoBayYoQQ==} + dependencies: + '@types/estree-jsx': 1.0.0 + estree-util-is-identifier-name: 2.0.1 + estree-walker: 3.0.1 + dev: false + + /estree-util-is-identifier-name/2.0.1: + resolution: {integrity: sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==} + dev: false + + /estree-util-to-js/1.1.0: + resolution: {integrity: sha512-490lbfCcpLk+ofK6HCgqDfYs4KAfq6QVvDw3+Bm1YoKRgiOjKiKYGAVQE1uwh7zVxBgWhqp4FDtp5SqunpUk1A==} + dependencies: + '@types/estree-jsx': 1.0.0 + astring: 1.8.3 + source-map: 0.7.4 + dev: false + + /estree-util-value-to-estree/1.3.0: + resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} + engines: {node: '>=12.0.0'} + dependencies: + is-plain-obj: 3.0.0 + dev: false + + /estree-util-visit/1.2.0: + resolution: {integrity: sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/unist': 2.0.6 + dev: false + + /estree-walker/3.0.1: + resolution: {integrity: sha512-woY0RUD87WzMBUiZLx8NsYr23N5BKsOMZHhu2hoNRVh6NXGfoiT1KOL8G3UHlJAnEDGmfa5ubNA/AacfG+Kb0g==} + dev: false + + /execa/0.8.0: + resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} + engines: {node: '>=4'} + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: false + + /extend-shallow/2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /extend/3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /flexsearch/0.7.31: + resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} + dev: false + + /focus-visible/5.2.0: + resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} + dev: false + + /get-stream/3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + dev: false + + /git-up/7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + dependencies: + is-ssh: 1.4.0 + parse-url: 8.1.0 + dev: false + + /git-url-parse/13.1.0: + resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} + dependencies: + git-up: 7.0.0 + dev: false + + /github-slugger/2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + dev: false + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: false + + /gray-matter/4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + + /has-flag/2.0.0: + resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} + engines: {node: '>=0.10.0'} + dev: false + + /hash-obj/4.0.0: + resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} + engines: {node: '>=12'} + dependencies: + is-obj: 3.0.0 + sort-keys: 5.0.0 + type-fest: 1.4.0 + dev: false + + /hast-util-from-parse5/7.1.1: + resolution: {integrity: sha512-R6PoNcUs89ZxLJmMWsVbwSWuz95/9OriyQZ3e2ybwqGsRXzhA6gv49rgGmQvLbZuSNDv9fCg7vV7gXUsvtUFaA==} + dependencies: + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 + hastscript: 7.2.0 + property-information: 6.2.0 + vfile: 5.3.6 + vfile-location: 4.0.1 + web-namespaces: 2.0.1 + dev: false + + /hast-util-is-element/2.1.3: + resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==} + dependencies: + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 + dev: false + + /hast-util-parse-selector/3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + dependencies: + '@types/hast': 2.3.4 + dev: false + + /hast-util-to-estree/2.1.0: + resolution: {integrity: sha512-Vwch1etMRmm89xGgz+voWXvVHba2iiMdGMKmaMfYt35rbVtFDq8JNwwAIvi8zHMkO6Gvqo9oTMwJTmzVRfXh4g==} + dependencies: + '@types/estree': 1.0.0 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 + comma-separated-tokens: 2.0.3 + estree-util-attach-comments: 2.1.0 + estree-util-is-identifier-name: 2.0.1 + hast-util-whitespace: 2.0.0 + mdast-util-mdx-expression: 1.3.1 + mdast-util-mdxjs-esm: 1.3.0 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.3.0 + unist-util-position: 4.0.3 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-text/3.1.2: + resolution: {integrity: sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==} + dependencies: + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 + hast-util-is-element: 2.1.3 + unist-util-find-after: 4.0.1 + dev: false + + /hast-util-whitespace/2.0.0: + resolution: {integrity: sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==} + dev: false + + /hastscript/7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + dependencies: + '@types/hast': 2.3.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + dev: false + + /inline-style-parser/0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /intersection-observer/0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + dev: false + + /is-alphabetical/2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /is-alphanumerical/2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + + /is-buffer/2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-decimal/2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + + /is-extendable/0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-hexadecimal/2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + + /is-obj/3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + dev: false + + /is-plain-obj/3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: false + + /is-plain-obj/4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-reference/3.0.0: + resolution: {integrity: sha512-Eo1W3wUoHWoCoVM4GVl/a+K0IgiqE5aIo4kJABFyMum1ZORlPkC+UC357sSQUL5w5QCE5kCC9upl75b7+7CY/Q==} + dependencies: + '@types/estree': 1.0.0 + dev: false + + /is-ssh/1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + dependencies: + protocols: 2.0.1 + dev: false + + /is-stream/1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: false + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /jsonc-parser/3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: false + + /katex/0.13.24: + resolution: {integrity: sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w==} + hasBin: true + dependencies: + commander: 8.3.0 + dev: false + + /katex/0.15.6: + resolution: {integrity: sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==} + hasBin: true + dependencies: + commander: 8.3.0 + dev: false + + /katex/0.16.4: + resolution: {integrity: sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==} + hasBin: true + dependencies: + commander: 8.3.0 + dev: false + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /kleur/4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: false + + /lodash.get/4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: false + + /longest-streak/3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lru-cache/4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: false + + /markdown-extensions/1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + dev: false + + /markdown-table/3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /match-sorter/6.3.1: + resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} + dependencies: + '@babel/runtime': 7.20.6 + remove-accents: 0.4.2 + dev: false + + /mdast-util-definitions/5.1.1: + resolution: {integrity: sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + unist-util-visit: 4.1.1 + dev: false + + /mdast-util-find-and-replace/2.2.1: + resolution: {integrity: sha512-SobxkQXFAdd4b5WmEakmkVoh18icjQRxGy5OWTCzgsLRm1Fu/KCtwD1HIQSsmq5ZRjVH0Ehwg6/Fn3xIUk+nKw==} + dependencies: + escape-string-regexp: 5.0.0 + unist-util-is: 5.1.1 + unist-util-visit-parents: 5.1.1 + dev: false + + /mdast-util-from-markdown/1.2.0: + resolution: {integrity: sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.1.0 + micromark: 3.1.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-decode-string: 1.0.2 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-stringify-position: 3.0.2 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal/1.0.2: + resolution: {integrity: sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==} + dependencies: + '@types/mdast': 3.0.10 + ccount: 2.0.1 + mdast-util-find-and-replace: 2.2.1 + micromark-util-character: 1.1.0 + dev: false + + /mdast-util-gfm-footnote/1.0.1: + resolution: {integrity: sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-to-markdown: 1.3.0 + micromark-util-normalize-identifier: 1.0.0 + dev: false + + /mdast-util-gfm-strikethrough/1.0.2: + resolution: {integrity: sha512-T/4DVHXcujH6jx1yqpcAYYwd+z5lAYMw4Ls6yhTfbMMtCt0PHY4gEfhW9+lKsLBtyhUGKRIzcUA2FATVqnvPDA==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-to-markdown: 1.3.0 + dev: false + + /mdast-util-gfm-table/1.0.6: + resolution: {integrity: sha512-uHR+fqFq3IvB3Rd4+kzXW8dmpxUhvgCQZep6KdjsLK4O6meK5dYZEayLtIxNus1XO3gfjfcIFe8a7L0HZRGgag==} + dependencies: + '@types/mdast': 3.0.10 + markdown-table: 3.0.3 + mdast-util-from-markdown: 1.2.0 + mdast-util-to-markdown: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item/1.0.1: + resolution: {integrity: sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-to-markdown: 1.3.0 + dev: false + + /mdast-util-gfm/2.0.1: + resolution: {integrity: sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ==} + dependencies: + mdast-util-from-markdown: 1.2.0 + mdast-util-gfm-autolink-literal: 1.0.2 + mdast-util-gfm-footnote: 1.0.1 + mdast-util-gfm-strikethrough: 1.0.2 + mdast-util-gfm-table: 1.0.6 + mdast-util-gfm-task-list-item: 1.0.1 + mdast-util-to-markdown: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-math/2.0.2: + resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} + dependencies: + '@types/mdast': 3.0.10 + longest-streak: 3.1.0 + mdast-util-to-markdown: 1.3.0 + dev: false + + /mdast-util-mdx-expression/1.3.1: + resolution: {integrity: sha512-TTb6cKyTA1RD+1su1iStZ5PAv3rFfOUKcoU5EstUpv/IZo63uDX03R8+jXjMEhcobXnNOiG6/ccekvVl4eV1zQ==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-from-markdown: 1.2.0 + mdast-util-to-markdown: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx/2.1.0: + resolution: {integrity: sha512-KzgzfWMhdteDkrY4mQtyvTU5bc/W4ppxhe9SzelO6QUUiwLAM+Et2Dnjjprik74a336kHdo0zKm7Tp+n6FFeRg==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + ccount: 2.0.1 + mdast-util-to-markdown: 1.3.0 + parse-entities: 4.0.0 + stringify-entities: 4.0.3 + unist-util-remove-position: 4.0.1 + unist-util-stringify-position: 3.0.2 + vfile-message: 3.1.3 + dev: false + + /mdast-util-mdx/2.0.0: + resolution: {integrity: sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==} + dependencies: + mdast-util-mdx-expression: 1.3.1 + mdast-util-mdx-jsx: 2.1.0 + mdast-util-mdxjs-esm: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm/1.3.0: + resolution: {integrity: sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-from-markdown: 1.2.0 + mdast-util-to-markdown: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-to-hast/12.2.4: + resolution: {integrity: sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg==} + dependencies: + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-definitions: 5.1.1 + micromark-util-sanitize-uri: 1.1.0 + trim-lines: 3.0.1 + unist-builder: 3.0.0 + unist-util-generated: 2.0.0 + unist-util-position: 4.0.3 + unist-util-visit: 4.1.1 + dev: false + + /mdast-util-to-markdown/1.3.0: + resolution: {integrity: sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + longest-streak: 3.1.0 + mdast-util-to-string: 3.1.0 + micromark-util-decode-string: 1.0.2 + unist-util-visit: 4.1.1 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string/3.1.0: + resolution: {integrity: sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==} + dev: false + + /micromark-core-commonmark/1.0.6: + resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.0.0 + micromark-factory-label: 1.0.2 + micromark-factory-space: 1.0.0 + micromark-factory-title: 1.0.2 + micromark-factory-whitespace: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-classify-character: 1.0.0 + micromark-util-html-tag-name: 1.1.0 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-subtokenize: 1.0.2 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-autolink-literal/1.0.3: + resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-sanitize-uri: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-footnote/1.0.4: + resolution: {integrity: sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==} + dependencies: + micromark-core-commonmark: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-sanitize-uri: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-strikethrough/1.0.4: + resolution: {integrity: sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-classify-character: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-table/1.0.5: + resolution: {integrity: sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-tagfilter/1.0.1: + resolution: {integrity: sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==} + dependencies: + micromark-util-types: 1.0.2 + dev: false + + /micromark-extension-gfm-task-list-item/1.0.3: + resolution: {integrity: sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm/2.0.1: + resolution: {integrity: sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==} + dependencies: + micromark-extension-gfm-autolink-literal: 1.0.3 + micromark-extension-gfm-footnote: 1.0.4 + micromark-extension-gfm-strikethrough: 1.0.4 + micromark-extension-gfm-table: 1.0.5 + micromark-extension-gfm-tagfilter: 1.0.1 + micromark-extension-gfm-task-list-item: 1.0.3 + micromark-util-combine-extensions: 1.0.0 + micromark-util-types: 1.0.2 + dev: false + + /micromark-extension-math/2.0.2: + resolution: {integrity: sha512-cFv2B/E4pFPBBFuGgLHkkNiFAIQv08iDgPH2HCuR2z3AUgMLecES5Cq7AVtwOtZeRrbA80QgMUk8VVW0Z+D2FA==} + dependencies: + '@types/katex': 0.11.1 + katex: 0.13.24 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-mdx-expression/1.0.3: + resolution: {integrity: sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==} + dependencies: + micromark-factory-mdx-expression: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-events-to-acorn: 1.2.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-mdx-jsx/1.0.3: + resolution: {integrity: sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==} + dependencies: + '@types/acorn': 4.0.6 + estree-util-is-identifier-name: 2.0.1 + micromark-factory-mdx-expression: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + vfile-message: 3.1.3 + dev: false + + /micromark-extension-mdx-md/1.0.0: + resolution: {integrity: sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==} + dependencies: + micromark-util-types: 1.0.2 + dev: false + + /micromark-extension-mdxjs-esm/1.0.3: + resolution: {integrity: sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==} + dependencies: + micromark-core-commonmark: 1.0.6 + micromark-util-character: 1.1.0 + micromark-util-events-to-acorn: 1.2.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-position-from-estree: 1.1.1 + uvu: 0.5.6 + vfile-message: 3.1.3 + dev: false + + /micromark-extension-mdxjs/1.0.0: + resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==} + dependencies: + acorn: 8.8.1 + acorn-jsx: 5.3.2_acorn@8.8.1 + micromark-extension-mdx-expression: 1.0.3 + micromark-extension-mdx-jsx: 1.0.3 + micromark-extension-mdx-md: 1.0.0 + micromark-extension-mdxjs-esm: 1.0.3 + micromark-util-combine-extensions: 1.0.0 + micromark-util-types: 1.0.2 + dev: false + + /micromark-factory-destination/1.0.0: + resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-factory-label/1.0.2: + resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-factory-mdx-expression/1.0.6: + resolution: {integrity: sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-events-to-acorn: 1.2.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-position-from-estree: 1.1.1 + uvu: 0.5.6 + vfile-message: 3.1.3 + dev: false + + /micromark-factory-space/1.0.0: + resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-types: 1.0.2 + dev: false + + /micromark-factory-title/1.0.2: + resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-factory-whitespace/1.0.0: + resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-character/1.1.0: + resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} + dependencies: + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-chunked/1.0.0: + resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-classify-character/1.0.0: + resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-combine-extensions/1.0.0: + resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-decode-numeric-character-reference/1.0.0: + resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-decode-string/1.0.2: + resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-encode/1.0.1: + resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} + dev: false + + /micromark-util-events-to-acorn/1.2.0: + resolution: {integrity: sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.0 + estree-util-visit: 1.2.0 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + vfile-location: 4.0.1 + vfile-message: 3.1.3 + dev: false + + /micromark-util-html-tag-name/1.1.0: + resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} + dev: false + + /micromark-util-normalize-identifier/1.0.0: + resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-resolve-all/1.0.0: + resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} + dependencies: + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-sanitize-uri/1.1.0: + resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-encode: 1.0.1 + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-subtokenize/1.0.2: + resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-util-symbol/1.0.1: + resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} + dev: false + + /micromark-util-types/1.0.2: + resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} + dev: false + + /micromark/3.1.0: + resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} + dependencies: + '@types/debug': 4.1.7 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-combine-extensions: 1.0.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-encode: 1.0.1 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-sanitize-uri: 1.1.0 + micromark-util-subtokenize: 1.0.2 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /mri/1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /nanoid/4.0.1: + resolution: {integrity: sha512-udKGtCCUafD3nQtJg9wBhRP3KMbPglUsgV5JVsXhvyBs/oefqb4sqMEhKBBgqZncYowu58p1prsZQBYvAj/Gww==} + engines: {node: ^14 || ^16 || >=18} + hasBin: true + dev: false + + /next-mdx-remote/4.3.0_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-fbxkY03pM2Wx5bDNTVKpYD5Hx3QVZGH+6xDtVIxlxXz4HTifP1yI2DrkDvxXbTz0SYGIbluRMIW81IOOa8pigA==} + engines: {node: '>=14', npm: '>=7'} + peerDependencies: + react: '>=16.x <=18.x' + react-dom: '>=16.x <=18.x' + dependencies: + '@mdx-js/mdx': 2.2.1 + '@mdx-js/react': 2.2.1_react@18.2.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + vfile: 5.3.6 + vfile-matter: 3.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /next-seo/5.14.1_f26ff3bd08f1cd28b0f73422c76f5ffd: + resolution: {integrity: sha512-NiJeQbxYP3z+EMp52q8k3Q+OfX2+Yv2WehERDj98r2wjXxL+woKpRBdsSVYolTD0Hm8IWs42SzaISE93RoQdOw==} + peerDependencies: + next: ^8.1.1-canary.54 || >=9.0.0 + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + next: 13.0.6_react-dom@18.2.0+react@18.2.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /next-themes/0.2.1_f26ff3bd08f1cd28b0f73422c76f5ffd: + resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + peerDependencies: + next: '*' + react: '*' + react-dom: '*' + dependencies: + next: 13.0.6_react-dom@18.2.0+react@18.2.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /next/13.0.6_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-COvigvms2LRt1rrzfBQcMQ2GZd86Mvk1z+LOLY5pniFtL4VrTmhZ9salrbKfSiXbhsD01TrDdD68ec3ABDyscA==} + engines: {node: '>=14.6.0'} + hasBin: true + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^6.0.0 || ^7.0.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + dependencies: + '@next/env': 13.0.6 + '@swc/helpers': 0.4.14 + caniuse-lite: 1.0.30001435 + postcss: 8.4.14 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + styled-jsx: 5.1.0_react@18.2.0 + optionalDependencies: + '@next/swc-android-arm-eabi': 13.0.6 + '@next/swc-android-arm64': 13.0.6 + '@next/swc-darwin-arm64': 13.0.6 + '@next/swc-darwin-x64': 13.0.6 + '@next/swc-freebsd-x64': 13.0.6 + '@next/swc-linux-arm-gnueabihf': 13.0.6 + '@next/swc-linux-arm64-gnu': 13.0.6 + '@next/swc-linux-arm64-musl': 13.0.6 + '@next/swc-linux-x64-gnu': 13.0.6 + '@next/swc-linux-x64-musl': 13.0.6 + '@next/swc-win32-arm64-msvc': 13.0.6 + '@next/swc-win32-ia32-msvc': 13.0.6 + '@next/swc-win32-x64-msvc': 13.0.6 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /nextra-theme-docs/2.2.14_d8d66b9d2170cddb63c39dddec8541b9: + resolution: {integrity: sha512-QQcHOcAXSfrpbSX3FqXgcQ2favKLnBAczqKWbSDVEtgHiUG6s7pVpxclpKm5F1c/fP47v19USRq3BL/SZ4JEIQ==} + peerDependencies: + next: '>=9.5.3' + nextra: 2.2.14 + react: '>=16.13.1' + react-dom: '>=16.13.1' + dependencies: + '@headlessui/react': 1.7.10_react-dom@18.2.0+react@18.2.0 + '@popperjs/core': 2.11.6 + clsx: 1.2.1 + flexsearch: 0.7.31 + focus-visible: 5.2.0 + git-url-parse: 13.1.0 + intersection-observer: 0.12.2 + match-sorter: 6.3.1 + next: 13.0.6_react-dom@18.2.0+react@18.2.0 + next-seo: 5.14.1_f26ff3bd08f1cd28b0f73422c76f5ffd + next-themes: 0.2.1_f26ff3bd08f1cd28b0f73422c76f5ffd + nextra: 2.2.14_f26ff3bd08f1cd28b0f73422c76f5ffd + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + scroll-into-view-if-needed: 3.0.4 + zod: 3.20.2 + dev: false + + /nextra/2.2.14_f26ff3bd08f1cd28b0f73422c76f5ffd: + resolution: {integrity: sha512-kToTiTiE4qrQsQ9snFRqCGLLSjKSFgFV/BJm3yp/SRmkmCr1WaWrlmUTAuXlxM7PREbNaZouNSOJ0hGS92rM8A==} + peerDependencies: + next: '>=9.5.3' + react: '>=16.13.1' + react-dom: '>=16.13.1' + dependencies: + '@mdx-js/mdx': 2.2.1 + '@mdx-js/react': 2.2.1_react@18.2.0 + '@napi-rs/simple-git': 0.1.8 + github-slugger: 2.0.0 + graceful-fs: 4.2.10 + gray-matter: 4.0.3 + katex: 0.16.4 + lodash.get: 4.4.2 + next: 13.0.6_react-dom@18.2.0+react@18.2.0 + next-mdx-remote: 4.3.0_react-dom@18.2.0+react@18.2.0 + p-limit: 3.1.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + rehype-katex: 6.0.2 + rehype-pretty-code: 0.9.2_shiki@0.12.1 + remark-gfm: 3.0.1 + remark-math: 5.1.1 + remark-reading-time: 2.0.1 + shiki: 0.12.1 + slash: 3.0.0 + title: 3.5.3 + unist-util-remove: 3.1.1 + unist-util-visit: 4.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /npm-run-path/2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: false + + /p-finally/1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: false + + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: false + + /parse-entities/4.0.0: + resolution: {integrity: sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==} + dependencies: + '@types/unist': 2.0.6 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false + + /parse-numeric-range/1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + dev: false + + /parse-path/7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + dependencies: + protocols: 2.0.1 + dev: false + + /parse-url/8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + dependencies: + parse-path: 7.0.0 + dev: false + + /parse5/6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: false + + /path-key/2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: false + + /periscopic/3.0.4: + resolution: {integrity: sha512-SFx68DxCv0Iyo6APZuw/AKewkkThGwssmU0QWtTlvov3VAtPX+QJ4CadwSaz8nrT5jPIuxdvJWB4PnD2KNDxQg==} + dependencies: + estree-walker: 3.0.1 + is-reference: 3.0.0 + dev: false + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: false + + /postcss/8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /property-information/6.2.0: + resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} + dev: false + + /protocols/2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + dev: false + + /pseudomap/1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: false + + /react-dom/18.2.0_react@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react/18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /reading-time/1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + dev: false + + /regenerator-runtime/0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false + + /rehype-katex/6.0.2: + resolution: {integrity: sha512-C4gDAlS1+l0hJqctyiU64f9CvT00S03qV1T6HiMzbSuLBgWUtcqydWHY9OpKrm0SpkK16FNd62CDKyWLwV2ppg==} + dependencies: + '@types/hast': 2.3.4 + '@types/katex': 0.11.1 + hast-util-to-text: 3.1.2 + katex: 0.15.6 + rehype-parse: 8.0.4 + unified: 10.1.2 + unist-util-remove-position: 4.0.1 + unist-util-visit: 4.1.1 + dev: false + + /rehype-parse/8.0.4: + resolution: {integrity: sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==} + dependencies: + '@types/hast': 2.3.4 + hast-util-from-parse5: 7.1.1 + parse5: 6.0.1 + unified: 10.1.2 + dev: false + + /rehype-pretty-code/0.9.2_shiki@0.12.1: + resolution: {integrity: sha512-l369pvBK6ihBEuy2+VDpHU+zbbY8I+Z4LiyIOunHAt3xyw6selaOFKc/DnX94jI5OJb3+NgjbOxXx2yaAypjZw==} + engines: {node: ^12.16.0 || >=13.2.0} + peerDependencies: + shiki: '*' + dependencies: + hash-obj: 4.0.0 + nanoid: 4.0.1 + parse-numeric-range: 1.3.0 + shiki: 0.12.1 + dev: false + + /remark-gfm/3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-gfm: 2.0.1 + micromark-extension-gfm: 2.0.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-math/5.1.1: + resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-math: 2.0.2 + micromark-extension-math: 2.0.2 + unified: 10.1.2 + dev: false + + /remark-mdx/2.1.5: + resolution: {integrity: sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==} + dependencies: + mdast-util-mdx: 2.0.0 + micromark-extension-mdxjs: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse/10.0.1: + resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-from-markdown: 1.2.0 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-reading-time/2.0.1: + resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} + dependencies: + estree-util-is-identifier-name: 2.0.1 + estree-util-value-to-estree: 1.3.0 + reading-time: 1.5.0 + unist-util-visit: 3.1.0 + dev: false + + /remark-rehype/10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + dependencies: + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-to-hast: 12.2.4 + unified: 10.1.2 + dev: false + + /remove-accents/0.4.2: + resolution: {integrity: sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U=} + dev: false + + /sade/1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: false + + /scheduler/0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /scroll-into-view-if-needed/3.0.4: + resolution: {integrity: sha512-s+/F50jwTOUt+u5oEIAzum9MN2lUQNvWBe/zfEsVQcbaERjGkKLq1s+2wCHkahMLC8nMLbzMVKivx9JhunXaZg==} + dependencies: + compute-scroll-into-view: 2.0.4 + dev: false + + /section-matter/1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + + /shebang-command/1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: false + + /shebang-regex/1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: false + + /shiki/0.12.1: + resolution: {integrity: sha512-aieaV1m349rZINEBkjxh2QbBvFFQOlgqYTNtCal82hHj4dDZ76oMlQIX+C7ryerBTDiga3e5NfH6smjdJ02BbQ==} + dependencies: + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + dev: false + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /sort-keys/5.0.0: + resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} + engines: {node: '>=12'} + dependencies: + is-plain-obj: 4.1.0 + dev: false + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map/0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: false + + /space-separated-tokens/2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + + /sprintf-js/1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /stringify-entities/4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + + /strip-bom-string/1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-eof/1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: false + + /style-to-object/0.3.0: + resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /styled-jsx/5.1.0_react@18.2.0: + resolution: {integrity: sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 18.2.0 + dev: false + + /supports-color/4.5.0: + resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} + engines: {node: '>=4'} + dependencies: + has-flag: 2.0.0 + dev: false + + /title/3.5.3: + resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} + hasBin: true + dependencies: + arg: 1.0.0 + chalk: 2.3.0 + clipboardy: 1.2.2 + titleize: 1.0.0 + dev: false + + /titleize/1.0.0: + resolution: {integrity: sha1-fTUHIgYYMLpmF2MeDP0+oIOY2Vo=} + engines: {node: '>=0.10.0'} + dev: false + + /trim-lines/3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trough/2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + + /tslib/2.4.1: + resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} + dev: false + + /type-fest/1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: false + + /typescript/4.9.3: + resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /unified/10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.6 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.6 + dev: false + + /unist-builder/3.0.0: + resolution: {integrity: sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-find-after/4.0.1: + resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + dev: false + + /unist-util-generated/2.0.0: + resolution: {integrity: sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==} + dev: false + + /unist-util-is/5.1.1: + resolution: {integrity: sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==} + dev: false + + /unist-util-position-from-estree/1.1.1: + resolution: {integrity: sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-position/4.0.3: + resolution: {integrity: sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-remove-position/4.0.1: + resolution: {integrity: sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==} + dependencies: + '@types/unist': 2.0.6 + unist-util-visit: 4.1.1 + dev: false + + /unist-util-remove/3.1.1: + resolution: {integrity: sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + unist-util-visit-parents: 5.1.1 + dev: false + + /unist-util-stringify-position/3.0.2: + resolution: {integrity: sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-visit-parents/4.1.1: + resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + dev: false + + /unist-util-visit-parents/5.1.1: + resolution: {integrity: sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + dev: false + + /unist-util-visit/3.1.0: + resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + unist-util-visit-parents: 4.1.1 + dev: false + + /unist-util-visit/4.1.1: + resolution: {integrity: sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + unist-util-visit-parents: 5.1.1 + dev: false + + /uvu/0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: false + + /vfile-location/4.0.1: + resolution: {integrity: sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==} + dependencies: + '@types/unist': 2.0.6 + vfile: 5.3.6 + dev: false + + /vfile-matter/3.0.1: + resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} + dependencies: + '@types/js-yaml': 4.0.5 + is-buffer: 2.0.5 + js-yaml: 4.1.0 + dev: false + + /vfile-message/3.1.3: + resolution: {integrity: sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==} + dependencies: + '@types/unist': 2.0.6 + unist-util-stringify-position: 3.0.2 + dev: false + + /vfile/5.3.6: + resolution: {integrity: sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==} + dependencies: + '@types/unist': 2.0.6 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.2 + vfile-message: 3.1.3 + dev: false + + /vscode-oniguruma/1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: false + + /vscode-textmate/8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + dev: false + + /web-namespaces/2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /yallist/2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: false + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: false + + /zod/3.20.2: + resolution: {integrity: sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==} + dev: false + + /zwitch/2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false diff --git a/sdk/typescript/docs/scripts/build-prod-docs.sh b/sdk/typescript/docs/scripts/build-prod-docs.sh new file mode 100755 index 0000000000..5f37401e87 --- /dev/null +++ b/sdk/typescript/docs/scripts/build-prod-docs.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +rm -rf ../../../dist/ts/docs/sdk/typescript || true + +# run the build +npm run build + +# move the output outside of the yarn/npm workspaces +mkdir -p ../../../dist/ts/docs/sdk +mv out ../../../dist/ts/docs/sdk/typescript + +echo "Output can be found in:" +realpath ../../../dist/ts/docs/sdk/typescript diff --git a/sdk/typescript/docs/theme.config.tsx b/sdk/typescript/docs/theme.config.tsx new file mode 100644 index 0000000000..2db2901904 --- /dev/null +++ b/sdk/typescript/docs/theme.config.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { DocsThemeConfig, useConfig } from 'nextra-theme-docs'; +import { useRouter } from 'next/router'; + +const config: DocsThemeConfig = { + logo: Nym Typescript SDK, + project: { + link: 'https://github.com/nymtech/nym', + }, + chat: { + link: 'https://discord.gg/nym', + }, + docsRepositoryBase: 'https://github.com/nymtech/nym/tree/develop/sdk/typescript/docs', + footer: { + text: 'Nym Typescript SDK', + }, + useNextSeoProps() { + return { + titleTemplate: '%s | Nym Typescript SDK', + }; + }, + // head: () => { + // const { asPath, defaultLocale, locale } = useRouter(); + // const { frontMatter } = useConfig(); + // const url = `https://nymtech.net/docs/sdk/typescript/${defaultLocale === locale ? asPath : `/${locale}${asPath}`}`; + // + // return ( + // <> + // + // + // + // + // ); + // }, +}; + +export default config; diff --git a/sdk/typescript/docs/tsconfig.json b/sdk/typescript/docs/tsconfig.json new file mode 100644 index 0000000000..1563f3e878 --- /dev/null +++ b/sdk/typescript/docs/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "incremental": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve" + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/sdk/typescript/examples/chat-app/parcel/package.json b/sdk/typescript/examples/chat-app/parcel/package.json index 98260f0f38..4159cc023c 100644 --- a/sdk/typescript/examples/chat-app/parcel/package.json +++ b/sdk/typescript/examples/chat-app/parcel/package.json @@ -6,7 +6,7 @@ "source": "src/index.html", "browserslist": "> 0.5%, last 2 versions, not dead", "dependencies": { - "@nymproject/sdk": "1" + "@nymproject/sdk": "1.2.0-rc.1" }, "devDependencies": { "@types/jest": "^27.0.1", diff --git a/sdk/typescript/examples/chat-app/parcel/src/index.html b/sdk/typescript/examples/chat-app/parcel/src/index.html index 4e4550c539..94eb12f5b2 100644 --- a/sdk/typescript/examples/chat-app/parcel/src/index.html +++ b/sdk/typescript/examples/chat-app/parcel/src/index.html @@ -5,7 +5,7 @@ Nym WebAssembly Demo - + diff --git a/sdk/typescript/examples/chat-app/plain-html/package.json b/sdk/typescript/examples/chat-app/plain-html/package.json index a937165155..31b37c2cb2 100644 --- a/sdk/typescript/examples/chat-app/plain-html/package.json +++ b/sdk/typescript/examples/chat-app/plain-html/package.json @@ -4,7 +4,7 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "@nymproject/sdk": "1" + "@nymproject/sdk": "1.2.0-rc.1" }, "devDependencies": { "@babel/core": "^7.15.0", diff --git a/sdk/typescript/examples/chat-app/plain-html/src/index.ts b/sdk/typescript/examples/chat-app/plain-html/src/index.ts deleted file mode 100644 index a0e429beb1..0000000000 --- a/sdk/typescript/examples/chat-app/plain-html/src/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { createNymMixnetClient, NymMixnetClient } from '@nymproject/sdk'; -import { displayReceived, sendMessageTo, displaySenderAddress } from './dom-utils'; - -let nym: NymMixnetClient | null = null; - -/** - * The main entry point - */ -async function main() { - nym = await createNymMixnetClient(); - - // add nym client to the Window globally, so that it can be used from the dev tools console - (window as any).nym = nym; - - if (!nym) { - console.error('Oh no! Could not create client'); - return; - } - - const nymApiUrl = 'https://validator.nymtech.net/api'; - const preferredGatewayIdentityKey = 'E3mvZTHQCdBvhfr178Swx9g4QG3kkRUun7YnToLMcMbM'; - - // subscribe to connect event, so that we can show the client's address - nym.events.subscribeToConnected((e) => { - if (e.args.address) { - displaySenderAddress(e.args.address); - } - }); - - // subscribe to message received events and show any string messages received - nym.events.subscribeToTextMessageReceivedEvent((e) => { - displayReceived(e.args.payload); - }); - - const sendButton: HTMLButtonElement = document.querySelector('#send-button') as HTMLButtonElement; - if (sendButton) { - sendButton.onclick = function () { - if (nym) { - sendMessageTo(nym); - } - }; - } - - nym.events.subscribeToRawMessageReceivedEvent((e) => console.log('Received: ', e.args.payload)); - - // start up the client - await nym.client.start({ - clientId: 'My awesome client', - nymApiUrl, - preferredGatewayIdentityKey, - }); -} - -// wait for the html to load -window.addEventListener('DOMContentLoaded', () => { - // let's do this! - main(); -}); diff --git a/sdk/typescript/examples/chat-app/plain-html/tsconfig.json b/sdk/typescript/examples/chat-app/plain-html/tsconfig.json index 86902367db..25e78e9f5f 100644 --- a/sdk/typescript/examples/chat-app/plain-html/tsconfig.json +++ b/sdk/typescript/examples/chat-app/plain-html/tsconfig.json @@ -4,6 +4,5 @@ "jsx": "react-jsx", "outDir": "./dist" }, - "include": ["src/**/*.ts", "src/**/*.tsx"], "exclude": ["node_modules", "build", "dist"] } diff --git a/sdk/typescript/examples/chat-app/plain-html/webpack.common.js b/sdk/typescript/examples/chat-app/plain-html/webpack.common.js index ae6ef6dc8e..121d113bcd 100644 --- a/sdk/typescript/examples/chat-app/plain-html/webpack.common.js +++ b/sdk/typescript/examples/chat-app/plain-html/webpack.common.js @@ -20,7 +20,7 @@ module.exports = mergeWithRules({ ]), { entry: { - index: path.resolve(__dirname, 'src/index.ts'), + index: path.resolve(__dirname, '../../shared/index.ts'), }, output: { path: path.resolve(__dirname, 'dist'), diff --git a/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/package.json b/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/package.json index 5af2e7b841..6c97cd50dc 100644 --- a/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/package.json +++ b/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/package.json @@ -9,7 +9,7 @@ "@mui/material": "^5.0.1", "@mui/styles": "^5.0.1", "react-mui-dropzone": "^4.0.6", - "@nymproject/sdk": "1", + "@nymproject/sdk": "1.2.0-rc.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", diff --git a/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/src/App.tsx b/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/src/App.tsx index c2252585de..cfb5a57b56 100644 --- a/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/src/App.tsx +++ b/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/src/App.tsx @@ -31,7 +31,7 @@ import { ThemeToggle } from './ThemeToggle'; import { AppContextProvider, useAppContext } from './context'; import { MixnetContextProvider, parseBinaryMessageHeaders, useMixnetContext } from './context/mixnet'; // eslint-disable-next-line import/no-relative-packages -import Logo from '../../../../../assets/logo/logo-circle.svg'; +import Logo from '../../../../../../assets/logo/logo-circle.svg'; export const AppTheme: FCWithChildren = ({ children }) => { const { mode } = useAppContext(); diff --git a/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/src/context/mixnet.tsx b/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/src/context/mixnet.tsx index 1a2588ce40..54b8d749d5 100644 --- a/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/src/context/mixnet.tsx +++ b/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/src/context/mixnet.tsx @@ -1,6 +1,5 @@ import * as React from 'react'; import { createNymMixnetClient, IWebWorkerEvents, MimeTypes, NymClientConfig, NymMixnetClient } from '@nymproject/sdk'; - export interface BinaryMessageHeaders { filename: string; mimeType: string; diff --git a/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/webpack.common.js b/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/webpack.common.js index 459c5495e4..d42d331663 100644 --- a/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/webpack.common.js +++ b/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/webpack.common.js @@ -1,6 +1,6 @@ const path = require('path'); const { mergeWithRules } = require('webpack-merge'); -const { webpackCommon } = require('../.webpack/webpack.base'); +const { webpackCommon } = require('../../.webpack/webpack.base'); module.exports = mergeWithRules({ module: { diff --git a/sdk/typescript/examples/chrome-extension/package.json b/sdk/typescript/examples/chrome-extension/package.json index cf9d9927d0..6db0895ef4 100644 --- a/sdk/typescript/examples/chrome-extension/package.json +++ b/sdk/typescript/examples/chrome-extension/package.json @@ -1,5 +1,5 @@ { - "name": "chrome-extension", + "name": "@nymproject/sdk-example-chrome-extension", "version": "1.0.0", "description": "This is an example of how Nym can be used within the context of a Chrome extension.", "main": "index.js", @@ -15,6 +15,6 @@ "webpack-cli": "^5.1.4" }, "dependencies": { - "@nymproject/sdk": "^1.1.8" + "@nymproject/sdk": "1.2.0-rc.1" } } diff --git a/sdk/typescript/examples/chrome-extension/tsconfig.json b/sdk/typescript/examples/chrome-extension/tsconfig.json new file mode 100644 index 0000000000..704db85a1c --- /dev/null +++ b/sdk/typescript/examples/chrome-extension/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": false, + "declarationMap": false + }, + "exclude": ["node_modules", "dist"] +} diff --git a/sdk/typescript/examples/firefox-extension/package.json b/sdk/typescript/examples/firefox-extension/package.json index 70160f5150..8113b5b123 100644 --- a/sdk/typescript/examples/firefox-extension/package.json +++ b/sdk/typescript/examples/firefox-extension/package.json @@ -1,5 +1,5 @@ { - "name": "firefox-extension", + "name": "@nymproject/sdk-example-firefox-extension", "version": "1.0.0", "description": "This is an example of how Nym can be used within the context of a Firefox extension.", "main": "index.js", @@ -8,12 +8,13 @@ "devDependencies": { "copy-webpack-plugin": "^11.0.0", "webpack": "^5.88.1", - "webpack-cli": "^5.1.4" + "webpack-cli": "^5.1.4", + "worker-loader": "^3.0.8" }, "scripts": { "build": "yarn webpack" }, "dependencies": { - "worker-loader": "^3.0.8" + "@nymproject/sdk": "1.2.0-rc.1" } } diff --git a/sdk/typescript/examples/firefox-extension/src/background.ts b/sdk/typescript/examples/firefox-extension/src/background.ts new file mode 100644 index 0000000000..6d15c9ce9f --- /dev/null +++ b/sdk/typescript/examples/firefox-extension/src/background.ts @@ -0,0 +1,114 @@ +// main.js +// Simple example of how to load Nym's TypeScript SDK and bind it to a DOM. +// Look at dom-utils.js for the DOM utility functionality referenced here. + +// Import the Nym mixnet ESM module. +// Import The web workers for the Nym mixnet ESM module.These are required for to run the Nym mixnet client. + +import { createNymMixnetClient } from '../../../packages/sdk/dist/full-fat/index.js'; +import '../../../packages/sdk/dist/full-fat/web-worker-0.js'; +import '../../../packages/sdk/dist/full-fat/web-worker-1.js'; + +export type BackgroundState = { + isReady: boolean; + address: string; + recipient: string; + messageLog: { type: string; message: string }[]; +}; + +const backgroundState: BackgroundState = { + isReady: false, + address: '', + recipient: '', + messageLog: [], +}; + +async function initBackground() { + // Initialize the Nym mixnet client. + let nymClient = await createNymMixnetClient().catch((err) => { + console.log(err); + }); + if (!nymClient) { + console.error('Oh no! Could not create client'); + return; + } + const nymApiUrl = 'https://validator.nymtech.net/api'; + const preferredGatewayIdentityKey = 'E3mvZTHQCdBvhfr178Swx9g4QG3kkRUun7YnToLMcMbM'; + + // subscribe to connect event, so that we can show the client's address + nymClient.events.subscribeToConnected((e) => { + if (e.args.address) { + backgroundState.address = e.args.address; + browser.runtime.sendMessage({ + type: 'displaySenderAddress', + message: backgroundState.address, + }); + } + }); + + // subscribe to message received events and show any string messages received + nymClient.events.subscribeToTextMessageReceivedEvent((e) => { + backgroundState.messageLog.push({ + type: 'received', + message: e.args.payload, + }); + browser.runtime.sendMessage({ + type: 'displayReceived', + message: e.args.payload, + }); + }); + + nymClient.events.subscribeToRawMessageReceivedEvent((e) => console.log('Received: ', e.args.payload)); + await nymClient.client.start({ + clientId: 'My awesome client', + nymApiUrl, + preferredGatewayIdentityKey, + }); + browser.runtime.onMessage.addListener(async (data) => { + switch (data.type) { + case 'nymClientSendMessage': + if (nymClient) { + await nymClient.client.send({ + payload: { + message: data.message, + mimeType: 'text/plain', + }, + recipient: data.recipient, + }); + backgroundState.messageLog.push({ + type: 'sent', + message: data.message, + }); + break; + } + } + }); + backgroundState.isReady = true; +} + +window.addEventListener('DOMContentLoaded', () => { + browser.runtime.onMessage.addListener((data) => { + switch (data.type) { + case 'popupReady': + if (backgroundState.isReady) { + browser.runtime.sendMessage({ + type: 'displaySenderAddress', + message: backgroundState.address, + }); + browser.runtime.sendMessage({ + type: 'displayMessageLog', + message: backgroundState.messageLog, + }); + browser.runtime.sendMessage({ + type: 'updateRecipient', + message: backgroundState.recipient, + }); + } else { + initBackground(); + } + break; + case 'updateRecipient': + backgroundState.recipient = data.message; + } + }); +}); diff --git a/sdk/typescript/examples/firefox-extension/src/dom-utils.ts b/sdk/typescript/examples/firefox-extension/src/dom-utils.ts new file mode 100644 index 0000000000..89b21bc0c5 --- /dev/null +++ b/sdk/typescript/examples/firefox-extension/src/dom-utils.ts @@ -0,0 +1,35 @@ +// dom-utils.js +// Contains utility functionality to help manipulate the DOM elements necessary to demonstrate the Nym example. + +import { BackgroundState } from './background'; +import { displayReceived, displaySend, displaySenderAddress } from '../../shared/dom-utils'; + +/** + * Create a Sphinx packet and send it to the mixnet through the gateway node. + * + * Message and recipient are taken from the values in the user interface. + * + * @param {Client} nymClient the nym client to use for message sending + */ +async function sendMessageTo() { + const message = (document.getElementById('message') as HTMLFormElement).value; + const recipient = (document.getElementById('recipient') as HTMLFormElement).value; + browser.runtime.sendMessage({ + type: 'nymClientSendMessage', + message, + recipient, + }); + displaySend(message); +} + +function displayMessageLog(messageLog: BackgroundState['messageLog']) { + for (let i = 0; i < messageLog.length; i++) { + if (messageLog[i].type === 'sent') { + displaySend(messageLog[i].message); + } else if (messageLog[i].type === 'received') { + displayReceived(messageLog[i].message); + } + } +} + +export { sendMessageTo, displaySend, displayReceived, displaySenderAddress, displayMessageLog }; diff --git a/sdk/typescript/examples/firefox-extension/src/popup.ts b/sdk/typescript/examples/firefox-extension/src/popup.ts new file mode 100644 index 0000000000..9c20100bd8 --- /dev/null +++ b/sdk/typescript/examples/firefox-extension/src/popup.ts @@ -0,0 +1,40 @@ +// Import the DOM utility functionality. +import { displaySenderAddress, displayReceived, sendMessageTo, displayMessageLog } from './dom-utils'; + +window.addEventListener('DOMContentLoaded', () => { + const sendButton = document.querySelector('#send-button') as HTMLButtonElement; + if (sendButton) { + sendButton.onclick = function () { + sendMessageTo(); + }; + } + const recipient = document.getElementById('recipient') as HTMLFormElement; + recipient.onchange = () => { + browser.runtime.sendMessage({ + type: 'updateRecipient', + message: recipient.value, + }); + }; + browser.runtime.onMessage.addListener((data) => { + switch (data.type) { + case 'displaySenderAddress': + displaySenderAddress(data.message); + break; + case 'displayReceived': + displayReceived(data.message); + break; + // case 'sendMessageTo': + // sendMessageTo(data.message); + // break; + case 'displayMessageLog': + displayMessageLog(data.message); + break; + case 'updateRecipient': + recipient.value = data.message; + } + }); + browser.runtime.sendMessage({ + type: 'popupReady', + message: '', + }); +}); diff --git a/sdk/typescript/examples/firefox-extension/tsconfig.json b/sdk/typescript/examples/firefox-extension/tsconfig.json new file mode 100644 index 0000000000..efe834e509 --- /dev/null +++ b/sdk/typescript/examples/firefox-extension/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "declaration": false, + "declarationMap": false + }, + "exclude": ["node_modules", "dist"] +} diff --git a/sdk/typescript/examples/node-tester/parcel/package.json b/sdk/typescript/examples/node-tester/parcel/package.json index 27c563a40e..61750e513c 100644 --- a/sdk/typescript/examples/node-tester/parcel/package.json +++ b/sdk/typescript/examples/node-tester/parcel/package.json @@ -6,7 +6,7 @@ "source": "src/index.html", "browserslist": "> 0.5%, last 2 versions, not dead", "dependencies": { - "@nymproject/sdk": "1" + "@nymproject/sdk": "1.2.0-rc.1" }, "devDependencies": { "@types/jest": "^27.0.1", diff --git a/sdk/typescript/examples/node-tester/plain-html/package.json b/sdk/typescript/examples/node-tester/plain-html/package.json index b80734f6d4..4dd3603ab4 100644 --- a/sdk/typescript/examples/node-tester/plain-html/package.json +++ b/sdk/typescript/examples/node-tester/plain-html/package.json @@ -4,7 +4,7 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "@nymproject/sdk": "1" + "@nymproject/sdk": "1.2.0-rc.1" }, "devDependencies": { "@babel/core": "^7.15.0", diff --git a/sdk/typescript/examples/node-tester/react/package.json b/sdk/typescript/examples/node-tester/react/package.json index d453a0c291..57d8a58ca0 100644 --- a/sdk/typescript/examples/node-tester/react/package.json +++ b/sdk/typescript/examples/node-tester/react/package.json @@ -8,7 +8,7 @@ "@emotion/styled": "^11.11.0", "@mui/icons-material": "^5.14.0", "@mui/material": "^5.14.0", - "@nymproject/sdk": "1", + "@nymproject/sdk": "1.2.0-rc.1", "parcel": "^2.9.3", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/ts-packages/react-webpack-with-theme-example/README.md b/sdk/typescript/examples/react/mui-theme/README.md similarity index 100% rename from ts-packages/react-webpack-with-theme-example/README.md rename to sdk/typescript/examples/react/mui-theme/README.md diff --git a/ts-packages/react-webpack-with-theme-example/package.json b/sdk/typescript/examples/react/mui-theme/package.json similarity index 100% rename from ts-packages/react-webpack-with-theme-example/package.json rename to sdk/typescript/examples/react/mui-theme/package.json diff --git a/ts-packages/react-webpack-with-theme-example/src/App.tsx b/sdk/typescript/examples/react/mui-theme/src/App.tsx similarity index 100% rename from ts-packages/react-webpack-with-theme-example/src/App.tsx rename to sdk/typescript/examples/react/mui-theme/src/App.tsx diff --git a/ts-packages/react-webpack-with-theme-example/src/ThemeToggle.tsx b/sdk/typescript/examples/react/mui-theme/src/ThemeToggle.tsx similarity index 100% rename from ts-packages/react-webpack-with-theme-example/src/ThemeToggle.tsx rename to sdk/typescript/examples/react/mui-theme/src/ThemeToggle.tsx diff --git a/ts-packages/react-webpack-with-theme-example/src/context/index.tsx b/sdk/typescript/examples/react/mui-theme/src/context/index.tsx similarity index 100% rename from ts-packages/react-webpack-with-theme-example/src/context/index.tsx rename to sdk/typescript/examples/react/mui-theme/src/context/index.tsx diff --git a/ts-packages/react-webpack-with-theme-example/src/index.html b/sdk/typescript/examples/react/mui-theme/src/index.html similarity index 100% rename from ts-packages/react-webpack-with-theme-example/src/index.html rename to sdk/typescript/examples/react/mui-theme/src/index.html diff --git a/ts-packages/react-webpack-with-theme-example/src/index.tsx b/sdk/typescript/examples/react/mui-theme/src/index.tsx similarity index 100% rename from ts-packages/react-webpack-with-theme-example/src/index.tsx rename to sdk/typescript/examples/react/mui-theme/src/index.tsx diff --git a/ts-packages/react-webpack-with-theme-example/src/tests/App.test.tsx b/sdk/typescript/examples/react/mui-theme/src/tests/App.test.tsx similarity index 100% rename from ts-packages/react-webpack-with-theme-example/src/tests/App.test.tsx rename to sdk/typescript/examples/react/mui-theme/src/tests/App.test.tsx diff --git a/ts-packages/react-components/src/theme/mui-theme.d.ts b/sdk/typescript/examples/react/mui-theme/src/theme/mui-theme.d.ts similarity index 100% rename from ts-packages/react-components/src/theme/mui-theme.d.ts rename to sdk/typescript/examples/react/mui-theme/src/theme/mui-theme.d.ts diff --git a/ts-packages/mui-theme/src/typings/FC.d.ts b/sdk/typescript/examples/react/mui-theme/src/typings/FC.d.ts similarity index 100% rename from ts-packages/mui-theme/src/typings/FC.d.ts rename to sdk/typescript/examples/react/mui-theme/src/typings/FC.d.ts diff --git a/ts-packages/react-webpack-with-theme-example/tsconfig.json b/sdk/typescript/examples/react/mui-theme/tsconfig.json similarity index 100% rename from ts-packages/react-webpack-with-theme-example/tsconfig.json rename to sdk/typescript/examples/react/mui-theme/tsconfig.json diff --git a/ts-packages/react-webpack-with-theme-example/tsconfig.prod.json b/sdk/typescript/examples/react/mui-theme/tsconfig.prod.json similarity index 100% rename from ts-packages/react-webpack-with-theme-example/tsconfig.prod.json rename to sdk/typescript/examples/react/mui-theme/tsconfig.prod.json diff --git a/ts-packages/react-webpack-with-theme-example/webpack.common.js b/sdk/typescript/examples/react/mui-theme/webpack.common.js similarity index 100% rename from ts-packages/react-webpack-with-theme-example/webpack.common.js rename to sdk/typescript/examples/react/mui-theme/webpack.common.js diff --git a/ts-packages/react-webpack-with-theme-example/webpack.config.js b/sdk/typescript/examples/react/mui-theme/webpack.config.js similarity index 100% rename from ts-packages/react-webpack-with-theme-example/webpack.config.js rename to sdk/typescript/examples/react/mui-theme/webpack.config.js diff --git a/ts-packages/react-webpack-with-theme-example/webpack.prod.js b/sdk/typescript/examples/react/mui-theme/webpack.prod.js similarity index 100% rename from ts-packages/react-webpack-with-theme-example/webpack.prod.js rename to sdk/typescript/examples/react/mui-theme/webpack.prod.js diff --git a/ts-packages/react-webpack-with-theme-example/yarn-error.log b/sdk/typescript/examples/react/mui-theme/yarn-error.log similarity index 100% rename from ts-packages/react-webpack-with-theme-example/yarn-error.log rename to sdk/typescript/examples/react/mui-theme/yarn-error.log diff --git a/sdk/typescript/examples/react/sdk-react/package.json b/sdk/typescript/examples/react/sdk-react/package.json new file mode 100644 index 0000000000..1c4a84f5ce --- /dev/null +++ b/sdk/typescript/examples/react/sdk-react/package.json @@ -0,0 +1,43 @@ +{ + "name": "@nymproject/sdk-example-sdk-react", + "version": "1.0.0", + "license": "Apache-2.0", + "source": "src/index.html", + "browserslist": "> 0.5%, last 2 versions, not dead", + "dependencies": { + "@nymproject/sdk": "file:../../../packages/sdk", + "@nymproject/sdk-react": "file:../../../packages/sdk-react" + }, + "devDependencies": { + "@types/jest": "^27.0.1", + "@types/node": "^16.7.13", + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.13.0", + "eslint": "^8.10.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-root-import": "^1.0.4", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jest": "^26.1.1", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-prettier": "^4.0.0", + "jest": "^27.1.0", + "mini-css-extract-plugin": "^2.2.2", + "npm-run-all": "^4.1.5", + "prettier": "^2.8.7", + "ts-jest": "^27.0.5", + "typescript": "^4.6.2" + }, + "scripts": { + "start": "npx parcel", + "build": "npx parcel build --no-optimize", + "build:serve": "npx serve dist", + "test": "jest", + "test:watch": "jest --watch", + "tsc": "tsc", + "tsc:watch": "tsc --watch", + "lint": "eslint src", + "lint:fix": "eslint src --fix" + } +} diff --git a/sdk/typescript/examples/react/sdk-react/src/App.tsx b/sdk/typescript/examples/react/sdk-react/src/App.tsx new file mode 100644 index 0000000000..999df1798e --- /dev/null +++ b/sdk/typescript/examples/react/sdk-react/src/App.tsx @@ -0,0 +1,97 @@ +import * as React from 'react'; +import { MixnetContextProvider, useMixnetContext } from '@nymproject/sdk-react'; +import type { EventHandlerFn, StringMessageReceivedEvent } from '@nymproject/sdk'; + +export const Content: FCWithChildren = () => { + const { isReady, address, sendTextMessage, events } = useMixnetContext(); + const log = React.useRef([]); + const [trigger, setTrigger] = React.useState(new Date()); + const formElementRef = React.createRef(); + + const appendLog = (type: React.ReactNode, node?: React.ReactNode) => { + const timestamp = new Date().toLocaleTimeString(); + log.current.push( +
    +
    + {timestamp} {type} +
    + {node || null} +
    +
    , + ); + setTrigger(new Date()); + }; + + const handleMessage = React.useCallback>((e) => { + appendLog( + ⬅️ Received, +
    +
    {e.args.payload}
    +
    , + ); + }, []); + + React.useEffect(() => { + if (!events || !isReady) { + return undefined; + } + + appendLog(Connected); + + const unsubscribeFn = events.subscribeToTextMessageReceivedEvent(handleMessage); + + // when unmounting unsubscribe will be called + return unsubscribeFn; + }, [isReady]); + + const handleSend = async () => { + if (!formElementRef.current || !address) { + return; + } + + const message = formElementRef.current.value; + + appendLog( + ➡️️ Sent, +
    +
    {message}
    +
    , + ); + setTrigger(new Date()); + + await sendTextMessage({ payload: message, recipient: address }); + }; + + if (!isReady) { + return ( +
    +

    Nym SDK Mixnet React Context

    +
    Loading...
    +
    + ); + } + + return ( +
    +

    Nym SDK Mixnet React Context

    +
    +

    + Client address: {address} +

    +

    + + +

    +
    +

    Logs

    + {log.current.map((item) => ( + <>{item} + ))} +
    + ); +}; +export const App: FCWithChildren = () => ( + + + +); diff --git a/sdk/typescript/examples/react/sdk-react/src/index.html b/sdk/typescript/examples/react/sdk-react/src/index.html new file mode 100644 index 0000000000..7e8b531e5f --- /dev/null +++ b/sdk/typescript/examples/react/sdk-react/src/index.html @@ -0,0 +1,20 @@ + + + + + + + Nym WebAssembly Demo + + + + + +
    + + + diff --git a/sdk/typescript/examples/react/sdk-react/src/index.tsx b/sdk/typescript/examples/react/sdk-react/src/index.tsx new file mode 100644 index 0000000000..595758331e --- /dev/null +++ b/sdk/typescript/examples/react/sdk-react/src/index.tsx @@ -0,0 +1,7 @@ +import React from 'react'; +import { createRoot } from 'react-dom/client'; +import { App } from './App'; + +const container = document.getElementById('app'); +const root = createRoot(container!); // createRoot(container!) if you use TypeScript +root.render(); diff --git a/ts-packages/react-components/src/typings/FC.d.ts b/sdk/typescript/examples/react/sdk-react/src/typings/FC.d.ts similarity index 100% rename from ts-packages/react-components/src/typings/FC.d.ts rename to sdk/typescript/examples/react/sdk-react/src/typings/FC.d.ts diff --git a/sdk/typescript/examples/react/sdk-react/tsconfig.json b/sdk/typescript/examples/react/sdk-react/tsconfig.json new file mode 100644 index 0000000000..86902367db --- /dev/null +++ b/sdk/typescript/examples/react/sdk-react/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "outDir": "./dist" + }, + "include": ["src/**/*.ts", "src/**/*.tsx"], + "exclude": ["node_modules", "build", "dist"] +} diff --git a/sdk/typescript/examples/chat-app/plain-html/src/dom-utils.ts b/sdk/typescript/examples/shared/dom-utils.ts similarity index 58% rename from sdk/typescript/examples/chat-app/plain-html/src/dom-utils.ts rename to sdk/typescript/examples/shared/dom-utils.ts index 7e98532ea3..3025373f82 100644 --- a/sdk/typescript/examples/chat-app/plain-html/src/dom-utils.ts +++ b/sdk/typescript/examples/shared/dom-utils.ts @@ -7,6 +7,7 @@ import { NymMixnetClient, MimeTypes } from '@nymproject/sdk'; * * @param {Client} nymClient the nym client to use for message sending */ + export async function sendMessageTo(nym: NymMixnetClient) { const message = (document.getElementById('message') as HTMLFormElement).value; const recipient = (document.getElementById('recipient') as HTMLFormElement).value; @@ -15,22 +16,33 @@ export async function sendMessageTo(nym: NymMixnetClient) { displaySend(message); } +const createISOTimeStamp = () => new Date().toISOString().substring(11, 16); + +const createChatEntry = ({ message, sendOrReceive }: { message: string; sendOrReceive: 'SEND' | 'RECEIVE' }) => { + const timestamp = createISOTimeStamp(); + console.log(timestamp); + + const sendDiv = document.createElement('div'); + const paragraph = document.createElement('p'); + paragraph.setAttribute('style', `color: ${sendOrReceive === 'SEND' ? 'blue' : 'green'}`); + const paragraphContent = document.createTextNode( + `${timestamp} ${sendOrReceive === 'SEND' ? 'sent' : 'received'} >>> ${message}`, + ); + paragraph.appendChild(paragraphContent); + + sendDiv.appendChild(paragraph); + document.getElementById('output')?.appendChild(sendDiv); +}; + /** * Display messages that have been sent up the websocket. Colours them blue. * * @param {string} message */ -function displaySend(message: string) { - const timestamp = new Date().toISOString().substr(11, 12); - const sendDiv = document.createElement('div'); - const paragraph = document.createElement('p'); - paragraph.setAttribute('style', 'color: blue'); - const paragraphContent = document.createTextNode(`${timestamp} sent >>> ${message}`); - paragraph.appendChild(paragraphContent); - - sendDiv.appendChild(paragraph); - document.getElementById('output')?.appendChild(sendDiv); +export function displaySend(message: string) { + createChatEntry({ message, sendOrReceive: 'SEND' }); + return undefined; } /** @@ -38,24 +50,16 @@ function displaySend(message: string) { * * @param {string} message */ -export function displayReceived(message: string) { - const content = message; - const timestamp = new Date().toLocaleTimeString(); - const receivedDiv = document.createElement('div'); - const paragraph = document.createElement('p'); - paragraph.setAttribute('style', 'color: green'); - const paragraphContent = document.createTextNode(`${timestamp} received >>> ${content}`); - // const paragraphContent = document.createTextNode(timestamp + " received >>> " + content + ((replySurb != null) ? "Reply SURB was attached here (but we can't do anything with it yet" : " (NO REPLY-SURB AVAILABLE)")) - paragraph.appendChild(paragraphContent); - receivedDiv.appendChild(paragraph); - document.getElementById('output')?.appendChild(receivedDiv); +export function displayReceived(message: string) { + createChatEntry({ message, sendOrReceive: 'RECEIVE' }); + return undefined; } /** * Display the nymClient's sender address in the user interface * - * @param {Client} nymClient + * @param {string} address */ export function displaySenderAddress(address: string) { (document.getElementById('sender') as HTMLFormElement).value = address; diff --git a/sdk/typescript/examples/chat-app/parcel/src/index.ts b/sdk/typescript/examples/shared/index.ts similarity index 89% rename from sdk/typescript/examples/chat-app/parcel/src/index.ts rename to sdk/typescript/examples/shared/index.ts index 3871d1c0a7..16fffd3ac9 100644 --- a/sdk/typescript/examples/chat-app/parcel/src/index.ts +++ b/sdk/typescript/examples/shared/index.ts @@ -29,9 +29,9 @@ async function main() { displayReceived(e.args.payload); }); - const sendButton: HTMLButtonElement = document.querySelector('#send-button') as HTMLButtonElement; + const sendButton = document.querySelector('#send-button'); if (sendButton) { - sendButton.onclick = function () { + (sendButton as HTMLButtonElement).onclick = function () { if (nym) { sendMessageTo(nym); } diff --git a/sdk/typescript/packages/dom-utils/README.md b/sdk/typescript/packages/dom-utils/README.md new file mode 100644 index 0000000000..2cbde69fe2 --- /dev/null +++ b/sdk/typescript/packages/dom-utils/README.md @@ -0,0 +1,7 @@ +# Nym DOM Utils + +This package manipulates the DOM without any frameworks. + +## Usage + +TODO diff --git a/sdk/typescript/examples/chat-app/parcel/src/dom-utils.ts b/sdk/typescript/packages/dom-utils/index.ts similarity index 62% rename from sdk/typescript/examples/chat-app/parcel/src/dom-utils.ts rename to sdk/typescript/packages/dom-utils/index.ts index 7e98532ea3..cc7d70c6b3 100644 --- a/sdk/typescript/examples/chat-app/parcel/src/dom-utils.ts +++ b/sdk/typescript/packages/dom-utils/index.ts @@ -12,25 +12,32 @@ export async function sendMessageTo(nym: NymMixnetClient) { const recipient = (document.getElementById('recipient') as HTMLFormElement).value; await nym.client.send({ payload: { message, mimeType: MimeTypes.TextPlain }, recipient }); - displaySend(message); + createChatEntry({message, sendOrReceive: "SEND"}); } +const createISOTimeStamp = () => new Date().toISOString().substring(11, 12); + +const createChatEntry = ({message, sendOrReceive}: {message: string, sendOrReceive: "SEND" | "RECEIVE"}) => { + const timestamp = createISOTimeStamp(); + + const sendDiv = document.createElement('div'); + const paragraph = document.createElement('p'); + paragraph.setAttribute('style', `color: ${sendOrReceive === "SEND" ? "blue" : "green"}`); + const paragraphContent = document.createTextNode(`${timestamp} sent >>> ${message}`); + paragraph.appendChild(paragraphContent); + + sendDiv.appendChild(paragraph); + document.getElementById('output')?.appendChild(sendDiv); + /** * Display messages that have been sent up the websocket. Colours them blue. * * @param {string} message */ + function displaySend(message: string) { - const timestamp = new Date().toISOString().substr(11, 12); - - const sendDiv = document.createElement('div'); - const paragraph = document.createElement('p'); - paragraph.setAttribute('style', 'color: blue'); - const paragraphContent = document.createTextNode(`${timestamp} sent >>> ${message}`); - paragraph.appendChild(paragraphContent); - - sendDiv.appendChild(paragraph); - document.getElementById('output')?.appendChild(sendDiv); + createChatEntry({message, sendOrReceive: "SEND"}); + return undefined } /** @@ -38,18 +45,10 @@ function displaySend(message: string) { * * @param {string} message */ -export function displayReceived(message: string) { - const content = message; - const timestamp = new Date().toLocaleTimeString(); - const receivedDiv = document.createElement('div'); - const paragraph = document.createElement('p'); - paragraph.setAttribute('style', 'color: green'); - const paragraphContent = document.createTextNode(`${timestamp} received >>> ${content}`); - // const paragraphContent = document.createTextNode(timestamp + " received >>> " + content + ((replySurb != null) ? "Reply SURB was attached here (but we can't do anything with it yet" : " (NO REPLY-SURB AVAILABLE)")) - paragraph.appendChild(paragraphContent); - receivedDiv.appendChild(paragraph); - document.getElementById('output')?.appendChild(receivedDiv); +export function displayReceived(message: string) { + return createChatEntry({message, sendOrReceive: "RECEIVE"}); + return undefined } /** diff --git a/sdk/typescript/packages/mix-fetch/.babelrc b/sdk/typescript/packages/mix-fetch/.babelrc new file mode 100644 index 0000000000..0ef5ffc214 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/env"] +} diff --git a/sdk/typescript/packages/mix-fetch/.gitignore b/sdk/typescript/packages/mix-fetch/.gitignore new file mode 100644 index 0000000000..71c42dc754 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/.gitignore @@ -0,0 +1,2 @@ +src/worker/*.js +docs diff --git a/sdk/typescript/packages/mix-fetch/README-CommonJS-full-fat.md b/sdk/typescript/packages/mix-fetch/README-CommonJS-full-fat.md new file mode 100644 index 0000000000..d22f063aeb --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/README-CommonJS-full-fat.md @@ -0,0 +1,16 @@ +# Nym MixFetch + +This package is a drop-in replacement for `fetch` to send HTTP requests over the Nym Mixnet. + +## Usage + +```js +const { createMixFetch } = require('@nymproject/mix-fetch'); + +... + +const mixFetch = await createMixFetch(); + +const response = await mixFetch('https://nymtech.net'); +const html = await response.text(); +``` diff --git a/sdk/typescript/packages/mix-fetch/README-CommonJS.md b/sdk/typescript/packages/mix-fetch/README-CommonJS.md new file mode 100644 index 0000000000..d22f063aeb --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/README-CommonJS.md @@ -0,0 +1,16 @@ +# Nym MixFetch + +This package is a drop-in replacement for `fetch` to send HTTP requests over the Nym Mixnet. + +## Usage + +```js +const { createMixFetch } = require('@nymproject/mix-fetch'); + +... + +const mixFetch = await createMixFetch(); + +const response = await mixFetch('https://nymtech.net'); +const html = await response.text(); +``` diff --git a/sdk/typescript/packages/mix-fetch/README-full-fat.md b/sdk/typescript/packages/mix-fetch/README-full-fat.md new file mode 100644 index 0000000000..abb83e2a20 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/README-full-fat.md @@ -0,0 +1,16 @@ +# Nym MixFetch + +This package is a drop-in replacement for `fetch` to send HTTP requests over the Nym Mixnet. + +## Usage + +```js +import { createMixFetch } from '@nymproject/mix-fetch'; + +... + +const mixFetch = await createMixFetch(); + +const response = await mixFetch('https://nymtech.net'); +const html = await response.text(); +``` diff --git a/sdk/typescript/packages/mix-fetch/README.md b/sdk/typescript/packages/mix-fetch/README.md new file mode 100644 index 0000000000..8772e69ffd --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/README.md @@ -0,0 +1,19 @@ +# Nym MixFetch + +This package is a drop-in replacement for `fetch` to send HTTP requests over the Nym Mixnet. + +## Usage + +Use `mixFetch` in your own project with: + +```js +import { createMixFetch } from '@nymproject/mix-fetch'; + +... + +const mixFetch = await createMixFetch(); + +const response = await mixFetch('https://nymtech.net'); +const html = await response.text(); +``` + diff --git a/sdk/typescript/packages/mix-fetch/internal-dev/README.md b/sdk/typescript/packages/mix-fetch/internal-dev/README.md new file mode 100644 index 0000000000..21c25c7d90 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/internal-dev/README.md @@ -0,0 +1,44 @@ +# MixFetch Internal Tester + +This project is for use by Nym developers only. Use at your own risk! + +## Getting started + +From the root of this repository run: + +``` +yarn +make sdk-wasm-build +``` + +Then: + +``` +cd sdk/typescript/packages/mix-fetch +``` + +You can run in watch mode: + +``` +yarn start +``` + +Or do a single build: + +``` +yarn build:dev:esm +``` + +Then, in another terminal: + +``` +cd sdk/typescript/packages/mix-fetch/internal-dev/parcel +yarn && yarn start +``` + +If you have trouble with changes not propagating: + +``` +rm -rf node_modules && yarn && yarn start +``` + diff --git a/sdk/typescript/packages/mix-fetch/internal-dev/package.json b/sdk/typescript/packages/mix-fetch/internal-dev/package.json new file mode 100644 index 0000000000..549143b0d1 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/internal-dev/package.json @@ -0,0 +1,57 @@ +{ + "name": "@nymproject/mix-fetch-tester-webpack", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "@nymproject/mix-fetch": ">=1.2.0-rc.2 || ^1" + }, + "devDependencies": { + "@babel/core": "^7.22.10", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/preset-env": "^7.22.10", + "@babel/preset-typescript": "^7.22.5", + "@types/jest": "^27.0.1", + "@types/node": "^16.7.13", + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.13.0", + "babel-loader": "^9.1.3", + "babel-plugin-root-import": "^6.6.0", + "clean-webpack-plugin": "^4.0.0", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^5.0.1", + "dotenv-webpack": "^8.0.1", + "eslint": "^8.10.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-root-import": "^1.0.4", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jest": "^26.1.1", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-prettier": "^4.0.0", + "file-loader": "^6.2.0", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "html-webpack-plugin": "^5.5.3", + "jest": "^27.1.0", + "mini-css-extract-plugin": "^2.7.6", + "npm-run-all": "^4.1.5", + "prettier": "^2.8.7", + "style-loader": "^3.3.3", + "thread-loader": "^4.0.2", + "ts-jest": "^27.0.5", + "ts-loader": "^9.4.4", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^4.6.2", + "url-loader": "^4.1.1", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.9.0" + }, + "scripts": { + "start": "webpack serve --progress --port 3000", + "build": "webpack build --progress --config webpack.prod.js", + "serve": "npx serve dist" + } +} diff --git a/sdk/typescript/packages/mix-fetch/internal-dev/parcel/package.json b/sdk/typescript/packages/mix-fetch/internal-dev/parcel/package.json new file mode 100644 index 0000000000..d0ae96d225 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/internal-dev/parcel/package.json @@ -0,0 +1,14 @@ +{ + "name": "@nymproject/mix-fetch-tester-parcel", + "version": "1.0.0", + "license": "Apache-2.0", + "source": "../src/index.html", + "dependencies": { + "@nymproject/mix-fetch": ">=1.2.0-rc.2 || ^1" + }, + "scripts": { + "start": "npx parcel --no-cache", + "build": "npx parcel build --no-cache --no-content-hash", + "serve": "npx serve dist" + } +} diff --git a/sdk/typescript/packages/mix-fetch/internal-dev/src/index.html b/sdk/typescript/packages/mix-fetch/internal-dev/src/index.html new file mode 100644 index 0000000000..7ed4ee38f4 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/internal-dev/src/index.html @@ -0,0 +1,18 @@ + + + + + + + Internal Tester + + + + +

    Internal tester

    +

    Open dev tools to see more output and errors

    +
    
    +
    + + + diff --git a/sdk/typescript/packages/mix-fetch/internal-dev/src/index.ts b/sdk/typescript/packages/mix-fetch/internal-dev/src/index.ts new file mode 100644 index 0000000000..d6804dbd4d --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/internal-dev/src/index.ts @@ -0,0 +1,72 @@ +import { createMixFetch } from '@nymproject/mix-fetch'; + +function appendOutput(value: string) { + const el = document.getElementById('output') as HTMLPreElement; + const text = document.createTextNode(`${value}\n`); + el.appendChild(text); +} + +function appendImageOutput(url: string) { + const el = document.getElementById('outputImage') as HTMLPreElement; + const imgNode = document.createElement('img'); + imgNode.src = url; + el.appendChild(imgNode); +} + +/** + * The main entry point + */ +async function main() { + appendOutput('Tester is starting up...'); + + // const addr = + // 'EVdJ66jqpoVzmktVecy5UJxsTCEWo5gMn5zDZR7Hm8jy.GXNpoX7RcYcxKvBkV3dSHqC78WaPuWieweRPWzYqNhh5@GAjhJcrd6f1edaqUkfWCff6zdHoqo756qYrc2TfPuCXJ'; + const addr = undefined; + + appendOutput('About to set up mixFetch...'); + const { mixFetch } = await createMixFetch({ + preferredNetworkRequester: addr, + clientId: 'my-new-client-16', + clientOverride: { + coverTraffic: { disableLoopCoverTrafficStream: true }, + traffic: { disableMainPoissonPacketDistribution: true }, + }, + mixFetchOverride: { requestTimeoutMs: 60000 }, + responseBodyConfigMap: {}, + }); + (window as any).mixFetch = mixFetch; + + if (!(window as any).mixFetch) { + console.error('Oh no! Could not create mixFetch'); + appendOutput('Oh no! Could not create mixFetch'); + } else { + appendOutput('Ready!'); + } + + let url = 'https://nymtech.net/.wellknown/network-requester/standard-allowed-list.txt'; + appendOutput(`Using mixFetch to get ${url}...`); + const args = { mode: 'unsafe-ignore-cors' }; + + let resp = await mixFetch(url, args); + console.log({ resp }); + const text = await resp.text(); + + appendOutput(JSON.stringify(resp, null, 2)); + appendOutput(JSON.stringify({ text }, null, 2)); + + // get an image + url = 'https://nymtech.net/images/token/pie-classic-2.svg'; + resp = await mixFetch(url, args); + console.log({ resp }); + const buffer = await resp.arrayBuffer(); + const type = resp.headers.get('Content-Type') || 'image/svg'; + const blobUrl = URL.createObjectURL(new Blob([buffer], { type })); + appendOutput(JSON.stringify({ bufferBytes: buffer.byteLength, blobUrl }, null, 2)); + appendImageOutput(blobUrl); +} + +// wait for the html to load +window.addEventListener('DOMContentLoaded', () => { + // let's do this! + main(); +}); diff --git a/sdk/typescript/packages/mix-fetch/internal-dev/tsconfig.json b/sdk/typescript/packages/mix-fetch/internal-dev/tsconfig.json new file mode 100644 index 0000000000..4fdd59edbb --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/internal-dev/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "module": "ESNext", + "outDir": "./dist" + }, + "exclude": ["node_modules", "build", "dist"] +} diff --git a/sdk/typescript/packages/mix-fetch/internal-dev/webpack.common.js b/sdk/typescript/packages/mix-fetch/internal-dev/webpack.common.js new file mode 100644 index 0000000000..200d2ab28e --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/internal-dev/webpack.common.js @@ -0,0 +1,45 @@ +const path = require('path'); +const { mergeWithRules } = require('webpack-merge'); +const CopyPlugin = require('copy-webpack-plugin'); +const { webpackCommon } = require('../../../examples/.webpack/webpack.base'); + +console.log('mix-fetch package path is: ', path.dirname(require.resolve('@nymproject/mix-fetch/package.json'))); + +module.exports = mergeWithRules({ + module: { + rules: { + test: 'match', + use: 'replace', + }, + }, +})( + webpackCommon(__dirname, [ + { + inject: true, + filename: 'index.html', + template: path.resolve(__dirname, 'src/index.html'), + chunks: ['index'], + }, + ]), + { + entry: { + index: path.resolve(__dirname, 'src/index.ts'), + }, + output: { + path: path.resolve(__dirname, 'dist'), + publicPath: '/', + }, + plugins: [ + new CopyPlugin({ + patterns: [ + { + // copy the WASM files, because webpack doesn't do this automatically even though there are + // `new URL(..., import.meta.url)` statements in the web worker + from: path.resolve(path.dirname(require.resolve('@nymproject/mix-fetch/package.json')), 'dist/esm/*.wasm'), + to: '[name][ext]', + }, + ], + }), + ], + }, +); diff --git a/sdk/typescript/packages/mix-fetch/internal-dev/webpack.config.js b/sdk/typescript/packages/mix-fetch/internal-dev/webpack.config.js new file mode 100644 index 0000000000..085b2eac55 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/internal-dev/webpack.config.js @@ -0,0 +1,71 @@ +const { mergeWithRules } = require('webpack-merge'); +const webpack = require('webpack'); +const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); +const ReactRefreshTypeScript = require('react-refresh-typescript'); +const commonConfig = require('./webpack.common'); + +module.exports = mergeWithRules({ + module: { + rules: { + test: 'match', + use: 'replace', + }, + }, +})(commonConfig, { + mode: 'development', + devtool: 'inline-source-map', + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/, + options: { + getCustomTransformers: () => ({ + before: [ReactRefreshTypeScript()], + }), + // `ts-loader` does not work with HMR unless `transpileOnly` is used. + // If you need type checking, `ForkTsCheckerWebpackPlugin` is an alternative. + transpileOnly: true, + }, + }, + { + test: /\.wasm$/i, + type: 'asset/resource', + }, + ], + }, + plugins: [ + new ReactRefreshWebpackPlugin(), + + // this can be included automatically by the dev server, however build mode fails if missing + new webpack.HotModuleReplacementPlugin(), + ], + + target: 'web', + + devServer: { + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization', + }, + historyApiFallback: true, + }, + + // recommended for faster rebuild + optimization: { + runtimeChunk: true, + removeAvailableModules: false, + removeEmptyChunks: false, + splitChunks: false, + }, + + cache: { + type: 'filesystem', + buildDependencies: { + // restart on config change + config: ['./webpack.config.js'], + }, + }, +}); diff --git a/sdk/typescript/packages/mix-fetch/internal-dev/webpack.prod.js b/sdk/typescript/packages/mix-fetch/internal-dev/webpack.prod.js new file mode 100644 index 0000000000..c92239179a --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/internal-dev/webpack.prod.js @@ -0,0 +1,42 @@ +const { mergeWithRules } = require('webpack-merge'); +const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const commonConfig = require('./webpack.common'); + +module.exports = mergeWithRules({ + module: { + rules: { + test: 'match', + use: 'replace', + }, + }, +})(commonConfig, { + mode: 'production', + + // TODO: no source maps, add back + devtool: false, + + module: { + rules: [ + { + test: /\.css$/, + use: [MiniCssExtractPlugin.loader, 'css-loader'], + }, + ], + }, + optimization: { + minimizer: ['...', new CssMinimizerPlugin()], + splitChunks: { + chunks: 'all', + }, + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: '[name].[contenthash].css', + }), + ], + output: { + pathinfo: false, + filename: '[name].[contenthash].js', + }, +}); diff --git a/sdk/typescript/packages/mix-fetch/jest.config.mjs b/sdk/typescript/packages/mix-fetch/jest.config.mjs new file mode 100644 index 0000000000..ed5b112c72 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/jest.config.mjs @@ -0,0 +1,15 @@ +import preset from 'ts-jest/presets/index.js' + +/** @type {import('ts-jest').JestConfigWithTsJest} */ +export default { + ...preset.defaults, + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: 'tsconfig.jest.json', + useESM: true, + }, + ], + }, +} diff --git a/sdk/typescript/packages/mix-fetch/package.json b/sdk/typescript/packages/mix-fetch/package.json new file mode 100644 index 0000000000..e5779983e3 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/package.json @@ -0,0 +1,83 @@ +{ + "name": "@nymproject/mix-fetch", + "version": "1.2.0-rc.2", + "description": "This package is a drop-in replacement for `fetch` to send HTTP requests over the Nym Mixnet.", + "license": "Apache-2.0", + "author": "Nym Technologies SA", + "files": [ + "dist/esm/worker.js", + "dist/cjs/worker.js", + "dist/**/*" + ], + "main": "dist/cjs/index.js", + "browser": "dist/esm/index.js", + "scripts": { + "build": "scripts/build-prod.sh", + "build:dev": "scripts/build.sh", + "build:dev:esm": "MIX_FETCH_DEV_MODE=true scripts/build-dev-esm.sh", + "build:dev:esm-no-inline": "scripts/build-dev-esm.sh", + "build:worker": "rollup -c rollup-worker.config.mjs", + "clean": "rimraf dist", + "docs:dev": "run-p docs:watch docs:serve ", + "docs:generate": "typedoc", + "docs:generate:prod": "typedoc --basePath ./docs/tsdoc/nymproject/sdk/", + "docs:prod:build": "scripts/build-prod-docs-collect.sh", + "docs:serve": "reload -b -d ./docs -p 3000", + "docs:watch": "nodemon --ext ts --watch './src/**/*' --watch './typedoc.json' --exec \"yarn docs:generate\"", + "lint": "eslint src", + "lint:fix": "eslint src --fix", + "start": "tsc -w", + "start:dev": "nodemon --watch src -e ts,json --exec 'yarn build:dev:esm'", + "test": "node --experimental-vm-modules --no-warnings node_modules/jest/bin/jest.js -c=jest.config.mjs --no-cache", + "tsc": "tsc --noEmit true" + }, + "dependencies": { + "@nymproject/mix-fetch-wasm": ">=1.2.0-rc.0 || 1", + "comlink": "^4.3.1" + }, + "devDependencies": { + "@babel/core": "^7.15.0", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/preset-env": "^7.15.0", + "@babel/preset-react": "^7.14.5", + "@babel/preset-typescript": "^7.15.0", + "@nymproject/eslint-config-react-typescript": "^1.0.0", + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-inject": "^5.0.3", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.0.1", + "@rollup/plugin-replace": "^5.0.2", + "@rollup/plugin-terser": "^0.2.1", + "@rollup/plugin-typescript": "^10.0.1", + "@rollup/plugin-wasm": "^6.1.1", + "@types/jest": "^27.0.1", + "@types/node": "^16.7.13", + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.13.0", + "eslint": "^8.10.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-root-import": "^1.0.4", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jest": "^26.1.1", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.29.2", + "eslint-plugin-react-hooks": "^4.3.0", + "jest": "^29.5.0", + "nodemon": "^2.0.21", + "reload": "^3.2.1", + "rimraf": "^3.0.2", + "rollup": "^3.9.1", + "rollup-plugin-base64": "^1.0.1", + "rollup-plugin-web-worker-loader": "^1.6.1", + "ts-jest": "^29.1.0", + "ts-loader": "^9.4.2", + "typedoc": "^0.24.8", + "typescript": "^4.8.4" + }, + "private": false, + "type": "module", + "types": "./dist/esm/index.d.ts" +} diff --git a/sdk/typescript/packages/mix-fetch/rollup-cjs-full-fat.config.mjs b/sdk/typescript/packages/mix-fetch/rollup-cjs-full-fat.config.mjs new file mode 100644 index 0000000000..d4c6e39e99 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/rollup-cjs-full-fat.config.mjs @@ -0,0 +1,8 @@ +import { getConfig } from './rollup/cjs.mjs'; + +export default { + ...getConfig({ + inline: true, + outputDir: 'dist/cjs-full-fat', + }), +}; diff --git a/sdk/typescript/packages/mix-fetch/rollup-cjs.config.mjs b/sdk/typescript/packages/mix-fetch/rollup-cjs.config.mjs new file mode 100644 index 0000000000..a12e5bdb7a --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/rollup-cjs.config.mjs @@ -0,0 +1,5 @@ +import { getConfig } from './rollup/cjs.mjs'; + +export default { + ...getConfig({ inline: false }), +}; diff --git a/sdk/typescript/packages/mix-fetch/rollup-esm-full-fat.config.mjs b/sdk/typescript/packages/mix-fetch/rollup-esm-full-fat.config.mjs new file mode 100644 index 0000000000..ea80b1997b --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/rollup-esm-full-fat.config.mjs @@ -0,0 +1,8 @@ +import { getConfig } from './rollup/esm.mjs'; + +export default { + ...getConfig({ + inline: true, + outputDir: 'dist/esm-full-fat', + }), +}; diff --git a/sdk/typescript/packages/mix-fetch/rollup-esm.config.mjs b/sdk/typescript/packages/mix-fetch/rollup-esm.config.mjs new file mode 100644 index 0000000000..fe7b0082bb --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/rollup-esm.config.mjs @@ -0,0 +1,8 @@ +import { getConfig } from './rollup/esm.mjs'; + +export default { + ...getConfig({ + // by default, the web worker will not be inlined, in local development mode it will be + inline: process.env.MIX_FETCH_DEV_MODE === 'true', + }), +}; diff --git a/sdk/typescript/packages/mix-fetch/rollup-worker-new.config.mjs b/sdk/typescript/packages/mix-fetch/rollup-worker-new.config.mjs new file mode 100644 index 0000000000..54d6fd774b --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/rollup-worker-new.config.mjs @@ -0,0 +1,37 @@ +import typescript from '@rollup/plugin-typescript'; +import resolve from '@rollup/plugin-node-resolve'; +import { wasm } from '@rollup/plugin-wasm'; +import replace from '@rollup/plugin-replace'; + +const extensions = ['.js', '.jsx', '.ts', '.tsx']; + +export default { + input: 'src/worker/index.ts', + output: { + dir: 'dist', + format: process.env.MIX_FETCH_BUNDLE_INLINE_WORKER === true ? 'cjs' : 'es', + // format: 'cjs', + }, + plugins: [ + resolve({ extensions }), + // this is some nasty monkey patching that removes the WASM URL (because it is handled by the `wasm` plugin) + replace({ + values: { "input = new URL('mix_fetch_wasm_bg.wasm', import.meta.url);": 'input = undefined;' }, + delimiters: ['', ''], + preventAssignment: true, + }), + wasm({ + targetEnv: 'browser', + fileName: '[name].wasm', + // force the wasm plugin to embed the wasm bundle - this means no downstream bundlers have to worry about handling it + maxFileSize: process.env.MIX_FETCH_BUNDLE_INLINE_WASM === 'true' ? 10000000 : undefined, + }), + typescript({ + compilerOptions: { + declaration: false, + target: process.env.MIX_FETCH_BUNDLE_INLINE_WORKER === true ? 'es5' : 'es6', + // target: 'es5', + }, + }), + ], +}; diff --git a/sdk/typescript/packages/mix-fetch/rollup-worker.config.mjs b/sdk/typescript/packages/mix-fetch/rollup-worker.config.mjs new file mode 100644 index 0000000000..54d6fd774b --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/rollup-worker.config.mjs @@ -0,0 +1,37 @@ +import typescript from '@rollup/plugin-typescript'; +import resolve from '@rollup/plugin-node-resolve'; +import { wasm } from '@rollup/plugin-wasm'; +import replace from '@rollup/plugin-replace'; + +const extensions = ['.js', '.jsx', '.ts', '.tsx']; + +export default { + input: 'src/worker/index.ts', + output: { + dir: 'dist', + format: process.env.MIX_FETCH_BUNDLE_INLINE_WORKER === true ? 'cjs' : 'es', + // format: 'cjs', + }, + plugins: [ + resolve({ extensions }), + // this is some nasty monkey patching that removes the WASM URL (because it is handled by the `wasm` plugin) + replace({ + values: { "input = new URL('mix_fetch_wasm_bg.wasm', import.meta.url);": 'input = undefined;' }, + delimiters: ['', ''], + preventAssignment: true, + }), + wasm({ + targetEnv: 'browser', + fileName: '[name].wasm', + // force the wasm plugin to embed the wasm bundle - this means no downstream bundlers have to worry about handling it + maxFileSize: process.env.MIX_FETCH_BUNDLE_INLINE_WASM === 'true' ? 10000000 : undefined, + }), + typescript({ + compilerOptions: { + declaration: false, + target: process.env.MIX_FETCH_BUNDLE_INLINE_WORKER === true ? 'es5' : 'es6', + // target: 'es5', + }, + }), + ], +}; diff --git a/sdk/typescript/packages/mix-fetch/rollup/cjs.mjs b/sdk/typescript/packages/mix-fetch/rollup/cjs.mjs new file mode 100644 index 0000000000..4f76b89648 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/rollup/cjs.mjs @@ -0,0 +1,30 @@ +import typescript from '@rollup/plugin-typescript'; +import resolve from '@rollup/plugin-node-resolve'; +import { wasm } from '@rollup/plugin-wasm'; +import webWorkerLoader from 'rollup-plugin-web-worker-loader'; + +const extensions = ['.js', '.jsx', '.ts', '.tsx']; + +/** + * Gets the config for bundling the package as a CommonJS module. + * + * @param opts Options: + * `{ inline: boolean }` - set inline to true to inline the web worker in the main bundle + * `{ outputDir: string }` - override the destination + */ +export const getConfig = (opts) => ({ + input: 'src/index.ts', + output: { + dir: opts.outputDir || 'dist/cjs', + format: 'cjs', + }, + plugins: [ + webWorkerLoader({ targetPlatform: 'browser', inline: opts.inline }), // the inline param is used here + resolve({ extensions }), + wasm({ maxFileSize: 10000000, targetEnv: 'browser' }), + typescript({ + compilerOptions: { outDir: opts.outputDir || 'dist/cjs', target: 'es5' }, + exclude: ['worker/*'], + }), + ], +}); diff --git a/sdk/typescript/packages/mix-fetch/rollup/esm.mjs b/sdk/typescript/packages/mix-fetch/rollup/esm.mjs new file mode 100644 index 0000000000..e2b5efea66 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/rollup/esm.mjs @@ -0,0 +1,41 @@ +import typescript from '@rollup/plugin-typescript'; +import resolve from '@rollup/plugin-node-resolve'; +import webWorkerLoader from 'rollup-plugin-web-worker-loader'; +import replace from '@rollup/plugin-replace'; + +const extensions = ['.js', '.jsx', '.ts', '.tsx']; + +/** + * Gets the config for bundling the package as an ES Module. + * + * @param opts Options: + * `{ inline: boolean }` - set inline to true to inline the web worker in the main bundle + * `{ outputDir: string }` - override the destination * + */ +export const getConfig = (opts) => ({ + input: 'src/index.ts', + output: { + dir: opts.outputDir || 'dist/esm', + format: 'es', + }, + plugins: [ + webWorkerLoader({ targetPlatform: 'browser', inline: opts.inline }), // the inline param is used here + replace({ + // when loading the web worker as a full ES module, tell pass `new Worker({ type: 'module'})` to tell + // the browser to load and allow imports inside the worker code. Also load as a URL so relative paths work. + values: opts.inline + ? undefined + : { + "createURLWorkerFactory('web-worker-0.js')": + "createURLWorkerFactory(new URL('web-worker-0.js', import.meta.url))", + }, + delimiters: ['', ''], + preventAssignment: true, + }), + resolve({ extensions }), + typescript({ + exclude: ['worker/*'], + compilerOptions: { outDir: opts.outputDir || 'dist/esm' }, + }), + ], +}); diff --git a/sdk/typescript/packages/mix-fetch/scripts/build-dev-esm.sh b/sdk/typescript/packages/mix-fetch/scripts/build-dev-esm.sh new file mode 100755 index 0000000000..60ffc7e90f --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/scripts/build-dev-esm.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +#------------------------------------------------------- +# WEB WORKER (mix-fetch WASM) +#------------------------------------------------------- +# The web worker needs to be bundled because the WASM bundle needs to be loaded synchronously and all dependencies +# must be included in the worker script (because it is not loaded as an ES Module) + +# build the worker +rollup -c rollup-worker.config.mjs + +# move it next to the Typescript `src/index.ts` so it can be inlined by rollup +rm -f src/worker/*.js +rm -f src/worker/*.wasm +mv dist/index.js src/worker/worker.js + +# move WASM files out of build area +mkdir -p dist/worker +mv dist/*.wasm dist/worker + +#------------------------------------------------------- +# ESM +#------------------------------------------------------- + +# build the SDK as a ESM bundle +rollup -c rollup-esm.config.mjs + +# move WASM files into place +cp dist/worker/*.wasm dist/esm +node scripts/postBuildReplace.mjs dist + +#------------------------------------------------------- +# CLEAN UP +#------------------------------------------------------- + +# remove typings that aren't needed +rm -rf dist/esm/worker + +# clear staging area +rm -rf dist/worker + + diff --git a/sdk/typescript/packages/mix-fetch/scripts/build-prod-docs-collect.sh b/sdk/typescript/packages/mix-fetch/scripts/build-prod-docs-collect.sh new file mode 100755 index 0000000000..f672185300 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/scripts/build-prod-docs-collect.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +rm -rf ../../../../dist/ts/docs/tsdoc/nymproject/mix-fetch || true + +# run the build +yarn docs:generate:prod + +# move the output outside of the yarn/npm workspaces +mkdir -p ../../../../dist/ts/docs/tsdoc/nymproject +mv docs ../../../../dist/ts/docs/tsdoc/nymproject/mix-fetch + +echo "Output can be found in:" +realpath ../../../../dist/ts/docs/tsdoc/nymproject/mix-fetch diff --git a/sdk/typescript/packages/mix-fetch/scripts/build-prod.sh b/sdk/typescript/packages/mix-fetch/scripts/build-prod.sh new file mode 100755 index 0000000000..b56d1e0472 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/scripts/build-prod.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +rm -rf dist || true +rm -rf ../../../../dist/ts/sdk/mix-fetch || true + +# run the build +scripts/build.sh +node scripts/buildPackageJson.mjs + +# move the output outside of the yarn/npm workspaces +mkdir -p ../../../../dist/ts/sdk +mv dist ../../../../dist/ts/sdk +mv ../../../../dist/ts/sdk/dist ../../../../dist/ts/sdk/mix-fetch + +echo "Output can be found in:" +realpath ../../../../dist/ts/sdk/mix-fetch diff --git a/sdk/typescript/packages/mix-fetch/scripts/build.sh b/sdk/typescript/packages/mix-fetch/scripts/build.sh new file mode 100755 index 0000000000..14aeba0085 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/scripts/build.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +rm -rf dist || true + +#------------------------------------------------------- +# WEB WORKER (mix-fetch WASM) +#------------------------------------------------------- +# The web worker needs to be bundled because the WASM bundle needs to be loaded synchronously and all dependencies +# must be included in the worker script (because it is not loaded as an ES Module) + +# build the worker +rollup -c rollup-worker.config.mjs + +# move it next to the Typescript `src/index.ts` so it can be inlined by rollup +rm -f src/worker/*.js +rm -f src/worker/*.wasm +mv dist/index.js src/worker/worker.js + +# move WASM files out of build area +mkdir -p dist/worker +mv dist/*.wasm dist/worker + +#------------------------------------------------------- +# ESM +#------------------------------------------------------- + +# build the SDK as a ESM bundle +rollup -c rollup-esm.config.mjs + +#------------------------------------------------------- +# COMMON JS +#------------------------------------------------------- +# Some old build systems cannot fully handle ESM or ES2021, so build +# a CommonJS bundle targeting ES5 + +# build the SDK as a CommonJS bundle +rollup -c rollup-cjs.config.mjs + +# move WASM files into place +cp dist/worker/*.wasm dist/esm +node scripts/postBuildReplace.mjs dist + +#------------------------------------------------------- +# ESM (full-fat) +#------------------------------------------------------- + +# build the SDK as a ESM bundle (with worker inlined as a blob) +rollup -c rollup-esm-full-fat.config.mjs + +#------------------------------------------------------- +# COMMON JS (full-fat) +#------------------------------------------------------- +# Some old build systems cannot fully handle ESM or ES2021, so build +# a CommonJS bundle targeting ES5 + +# build the SDK as a CommonJS bundle (with worker inlined as a blob) +rollup -c rollup-cjs-full-fat.config.mjs + +#------------------------------------------------------- +# CLEAN UP +#------------------------------------------------------- + +rm -rf dist/cjs/worker +rm -rf dist/esm/worker +rm -rf dist/cjs-full-fat/worker +rm -rf dist/esm-full-fat/worker + +# copy README +cp README.md dist/esm +cp README-CommonJS.md dist/cjs/README.md +cp README-CommonJS-full-fat.md dist/cjs-full-fat/README.md +cp README-full-fat.md dist/esm-full-fat/README.md + + diff --git a/sdk/typescript/packages/mix-fetch/scripts/buildPackageJson.mjs b/sdk/typescript/packages/mix-fetch/scripts/buildPackageJson.mjs new file mode 100644 index 0000000000..3fc5a7b5b2 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/scripts/buildPackageJson.mjs @@ -0,0 +1,29 @@ +import * as fs from 'fs'; + +// parse the package.json from the SDK, so we can keep fields like the name and version +const json = JSON.parse(fs.readFileSync('package.json').toString()); + +// defaults (NB: these are in the output file locations) +const browser = 'index.js'; +const main = 'index.js'; +const types = 'index.d.ts'; + +const getPackageJson = (type, suffix) => ({ + name: `${json.name}${suffix ? `-${suffix}` : ''}`, + version: json.version, + license: json.license, + author: json.author, + type, + browser, + main, + types, +}); + +fs.writeFileSync('dist/cjs/package.json', JSON.stringify(getPackageJson('commonjs', 'commonjs'), null, 2)); +fs.writeFileSync('dist/esm/package.json', JSON.stringify(getPackageJson('module'), null, 2)); + +fs.writeFileSync( + 'dist/cjs-full-fat/package.json', + JSON.stringify(getPackageJson('commonjs', 'commonjs-full-fat'), null, 2), +); +fs.writeFileSync('dist/esm-full-fat/package.json', JSON.stringify(getPackageJson('module', 'full-fat'), null, 2)); diff --git a/sdk/typescript/packages/mix-fetch/scripts/postBuildReplace.mjs b/sdk/typescript/packages/mix-fetch/scripts/postBuildReplace.mjs new file mode 100644 index 0000000000..f3e307c96a --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/scripts/postBuildReplace.mjs @@ -0,0 +1,39 @@ +import fs from 'fs'; +import path from 'path'; + +// first level is a list of file names to process, then for each copying the @rollup/replace plugin syntax here: +// key is what to search for, value is what to replace it with +const replaceConfig = { + 'esm/web-worker-0.js': { + // add `import.meta.url` to make WASM file relative to the worker JS file + "_loadWasmModule(0, 'mix_fetch_wasm_bg.wasm',": + "_loadWasmModule(0, new URL('mix_fetch_wasm_bg.wasm', import.meta.url),", + "_loadWasmModule(0, 'go_conn.wasm',": "_loadWasmModule(0, new URL('go_conn.wasm', import.meta.url),", + }, + 'esm/index.js': { + // tell the browser the worker is a module, so it should provide `import.meta.url` needed above + 'const worker = new WorkerFactory();': "const worker = new WorkerFactory({ type: 'module' });", + }, +}; + +const basePathToFindFilesIn = process.argv[2]; + +console.log(`Replacing files in "${path.resolve(basePathToFindFilesIn)}"...`); + +Object.keys(replaceConfig).forEach((filename) => { + const absFilename = path.resolve(basePathToFindFilesIn, filename); + const content = fs.readFileSync(absFilename).toString(); + + console.log(`Replacing values in "${absFilename}"...`); + + const replacementMap = replaceConfig[filename]; + + let newContent = content; + Object.keys(replacementMap).forEach((toFind) => { + const toReplace = replacementMap[toFind]; + newContent = newContent.replaceAll(toFind, toReplace); + fs.writeFileSync(absFilename, newContent); + }); + + console.log('Done'); +}); diff --git a/sdk/typescript/packages/sdk/scripts/publish.sh b/sdk/typescript/packages/mix-fetch/scripts/publish.sh similarity index 100% rename from sdk/typescript/packages/sdk/scripts/publish.sh rename to sdk/typescript/packages/mix-fetch/scripts/publish.sh diff --git a/sdk/typescript/packages/mix-fetch/src/create-mix-fetch.ts b/sdk/typescript/packages/mix-fetch/src/create-mix-fetch.ts new file mode 100644 index 0000000000..d45b74704e --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/src/create-mix-fetch.ts @@ -0,0 +1,76 @@ +import InlineWasmWebWorker from 'web-worker:./worker/worker'; +import * as Comlink from 'comlink'; +import type { IMixFetchWebWorker } from './types'; +import { EventKinds, IMixFetch } from './types'; + +const createWorker = async () => + new Promise((resolve, reject) => { + // rollup will inline the built worker script, so that when the SDK is used in + // other projects, they will not need to mess around trying to bundle it + // however, it will make this SDK bundle bigger because of Base64 inline data + const worker = new InlineWasmWebWorker(); + + worker.addEventListener('error', reject); + worker.addEventListener( + 'message', + (msg) => { + worker.removeEventListener('error', reject); + if (msg.data?.kind === EventKinds.Loaded) { + resolve(worker); + } else { + reject(msg); + } + }, + { once: true }, + ); + }); + +const convertHeaders = (headers: any): Headers => { + const out = new Headers(); + Object.keys(headers).forEach((key) => { + out.append(key, headers[key]); + }); + return out; +}; + +/** + * Use this method to initialise `mixFetch`. + * + * @returns An instance of `mixFetch` that you can use to make your requests using the same interface as `fetch`. + */ +export const createMixFetch = async (): Promise => { + // start the worker + const worker = await createWorker(); + + // bind with Comlink + const wrappedWorker = Comlink.wrap(worker); + + // handle the responses + const mixFetchWebWorker: IMixFetch = { + setupMixFetch: wrappedWorker.setupMixFetch, + mixFetch: async (url: string, args: any) => { + const workerResponse = await wrappedWorker.mixFetch(url, args); + if (!workerResponse) { + throw new Error('No response received'); + } + console.log({ workerResponse }); + const { headers: headersRaw, status, statusText } = workerResponse; + + // reconstruct the Headers object instance from a plain object + const headers = convertHeaders(headersRaw); + + // handle blobs + if (workerResponse.body.blobUrl) { + const blob = await (await fetch(workerResponse.body.blobUrl)).blob(); + const body = await blob.arrayBuffer(); + return new Response(body, { headers, status, statusText }); + } + + // handle everything else + const body = Object.values(workerResponse.body)[0]; // we are expecting only one value to be set in `.body` + return new Response(body, { headers, status, statusText }); + }, + }; + + return mixFetchWebWorker; +}; diff --git a/sdk/typescript/packages/mix-fetch/src/index.ts b/sdk/typescript/packages/mix-fetch/src/index.ts new file mode 100644 index 0000000000..701b30daa6 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/src/index.ts @@ -0,0 +1,42 @@ +/* eslint-disable no-underscore-dangle */ +import type { SetupMixFetchOps, IMixFetchFn, IMixFetch } from './types'; +import { createMixFetch as createMixFetchInternal } from './create-mix-fetch'; + +export * from './types'; + +declare global { + interface Window { + /** + * Keep a singleton of the mixFetch interface on the `window` object. + */ + __mixFetchGlobal?: IMixFetch; + } +} + +/** + * Create a global mixFetch instance and optionally configure settings. + * + * @param opts Optional settings + */ +export const createMixFetch = async (opts?: SetupMixFetchOps) => { + if (!window.__mixFetchGlobal) { + // load the worker and set up mixFetch with defaults + window.__mixFetchGlobal = await createMixFetchInternal(); + await window.__mixFetchGlobal.setupMixFetch(opts); + } + return window.__mixFetchGlobal; +}; + +/** + * mixFetch is a drop-in replacement for the standard `fetch` interface. + * + * @param url The URL to fetch from. + * @param args Fetch options. + */ +export const mixFetch: IMixFetchFn = async (url, args) => { + // ensure mixFetch instance exists + const instance = await createMixFetch(); + + // execute user request + return instance.mixFetch(url, args); +}; diff --git a/sdk/typescript/packages/mix-fetch/src/types.ts b/sdk/typescript/packages/mix-fetch/src/types.ts new file mode 100644 index 0000000000..56aa56cb96 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/src/types.ts @@ -0,0 +1,96 @@ +import type { MixFetchOpts } from '@nymproject/mix-fetch-wasm'; + +type IMixFetchWorkerFn = (url: string, args: any) => Promise; + +// export type IMixFetchFn = typeof fetch; +export type IMixFetchFn = (url: string, args: any) => Promise; + +export type SetupMixFetchOps = MixFetchOpts & { + responseBodyConfigMap?: ResponseBodyConfigMap; +}; + +export interface IMixFetchWebWorker { + mixFetch: IMixFetchWorkerFn; + setupMixFetch: (opts?: SetupMixFetchOps) => Promise; +} + +export interface IMixFetch { + mixFetch: IMixFetchFn; + setupMixFetch: (opts?: SetupMixFetchOps) => Promise; +} + +export enum EventKinds { + Loaded = 'Loaded', +} + +export interface LoadedEvent { + kind: EventKinds.Loaded; + args: { + loaded: true; + }; +} + +export interface ResponseBody { + uint8array?: Uint8Array; + json?: any; + text?: string; + formData?: any; + blobUrl?: string; +} + +export type ResponseBodyMethod = 'uint8array' | 'json' | 'text' | 'formData' | 'blob'; + +export interface ResponseBodyConfigMap { + /** + * Set the response `Content-Type`s to decode as uint8array. + */ + uint8array?: Array; + + /** + * Set the response `Content-Type`s to decode with the `json()` response body method. + */ + json?: Array; + + /** + * Set the response `Content-Type`s to decode with the `text()` response body method. + */ + text?: Array; + + /** + * Set the response `Content-Type`s to decode with the `formData()` response body method. + */ + formData?: Array; + + /** + * Set the response `Content-Type`s to decode with the `blob()` response body method. + */ + blob?: Array; + /** + * Set this to the default fallback method. Set to `undefined` if you want to ignore unknown types. + */ + + fallback?: ResponseBodyMethod; +} + +/** + * Default values for the handling of response bodies. + */ +export const ResponseBodyConfigMapDefaults: ResponseBodyConfigMap = { + uint8array: ['application/octet-stream'], + json: ['application/json', 'text/json'], + text: ['text/plain', /test\/plain\+.*/, 'text/html', /test\/html\+.*/], + formData: ['application/x-www-form-urlencoded', 'multipart/form-data'], + blob: [/image\/.*/, /video\/.*/], + fallback: 'blob', +}; + +export interface MixFetchWebWorkerResponse { + body: ResponseBody; + url: string; + headers: any; + status: number; + statusText: string; + type: string; + ok: boolean; + redirected: boolean; +} diff --git a/sdk/typescript/packages/mix-fetch/src/worker/handle-response-mime-types.test.ts b/sdk/typescript/packages/mix-fetch/src/worker/handle-response-mime-types.test.ts new file mode 100644 index 0000000000..68c96e4999 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/src/worker/handle-response-mime-types.test.ts @@ -0,0 +1,45 @@ +import { handleResponseMimeTypes } from './handle-response-mime-types'; + +describe('handleResponseMimeTypes', () => { + test('gracefully handles empty values', async () => { + const resp = await handleResponseMimeTypes(new Response()); + expect(Object.values(resp)).toHaveLength(0); + }); + + test('handles text', async () => { + const TEXT = 'This is text'; + const resp = await handleResponseMimeTypes( + new Response(TEXT, { headers: new Headers([['Content-Type', 'text/plain']]) }), + ); + expect(resp.text).toBe(TEXT); + }); + test('handles images', async () => { + const DATA = new Uint8Array([0, 1, 2, 3]).buffer; + const resp = await handleResponseMimeTypes( + new Response(DATA, { headers: new Headers([['Content-Type', 'image/jpeg']]) }), + ); + expect(resp.blobUrl).toBeDefined(); + }); + test('handles videos', async () => { + const DATA = new Uint8Array([0, 1, 2, 3]).buffer; + const resp = await handleResponseMimeTypes( + new Response(DATA, { headers: new Headers([['Content-Type', 'video/mpeg4']]) }), + ); + expect(resp.blobUrl).toBeDefined(); + }); + test('handles form data when URL encoded', async () => { + const formData = 'foo=bar&baz=42'; + const resp = await handleResponseMimeTypes( + new Response(formData, { headers: new Headers([['Content-Type', 'application/x-www-form-urlencoded']]) }), + ); + expect(resp.formData.foo).toBe('bar'); + expect(resp.formData.baz).toBe('42'); + }); + test('handles JSON data', async () => { + const json = '{ "foo": "bar", "baz": 42 }'; + const resp = await handleResponseMimeTypes( + new Response(json, { headers: new Headers([['Content-Type', 'application/json']]) }), + ); + expect(resp.text).toBe(json); + }); +}); diff --git a/sdk/typescript/packages/mix-fetch/src/worker/handle-response-mime-types.ts b/sdk/typescript/packages/mix-fetch/src/worker/handle-response-mime-types.ts new file mode 100644 index 0000000000..abcaa845f7 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/src/worker/handle-response-mime-types.ts @@ -0,0 +1,111 @@ +import type { ResponseBody, ResponseBodyConfigMap, ResponseBodyMethod } from '../types'; +import { ResponseBodyConfigMapDefaults } from '../types'; + +const getContentType = (response?: Response) => { + if (!response) { + return undefined; + } + + // this is what should be returned in the headers + if (response.headers.has('Content-Type')) { + return response.headers.get('Content-Type') as string; + } + + // handle weird servers that use lowercase headers + if (response.headers.has('content-type')) { + return response.headers.get('content-type') as string; + } + + // the Content-Type/content-type header is not part of the response + return undefined; +}; + +const doHandleResponseMethod = async (response: Response, method?: ResponseBodyMethod): Promise => { + switch (method) { + case 'uint8array': + return { + uint8array: new Uint8Array(await response.arrayBuffer()), + }; + case 'json': + case 'text': + return { text: await response.text() }; + case 'blob': { + const blob = await response.blob(); + const blobUrl = URL.createObjectURL(blob); + return { blobUrl }; + } + case 'formData': { + const formData: any = {}; + const data = await response.formData(); + // eslint-disable-next-line no-restricted-syntax + for (const pair of data.entries()) { + const [key, value] = pair; + formData[key] = value; + } + return { formData }; + } + default: + return {}; + } +}; + +const testIfIncluded = (value?: string, tests?: Array): boolean => { + if (!tests) { + return false; + } + if (!value) { + return false; + } + + for (let i = 0; i < tests.length; i += 1) { + const test = tests[i]; + if (typeof test === 'string' && value === test) { + return true; + } + if ((test as RegExp).test && (test as RegExp).test(value)) { + return true; + } + } + + // default return is false, because nothing above matched + return false; +}; + +export const handleResponseMimeTypes = async ( + response: Response, + config?: ResponseBodyConfigMap, +): Promise => { + // combine the user supplied config with the default + const finalConfig: ResponseBodyConfigMap = { ...ResponseBodyConfigMapDefaults, ...config }; + + const contentType = getContentType(response); + + // check if the headers say what the content type are, otherwise return the bytes of the response as a blob + if (!contentType) { + // no content type, or body, so the response is only the status, e.g. GET + if (!response.body) { + return {}; + } + + // handle fallback method + return doHandleResponseMethod(response, config?.fallback || 'blob'); + } + + if (testIfIncluded(contentType, finalConfig.uint8array)) { + return doHandleResponseMethod(response, 'uint8array'); + } + if (testIfIncluded(contentType, finalConfig.json)) { + return doHandleResponseMethod(response, 'json'); + } + if (testIfIncluded(contentType, finalConfig.text)) { + return doHandleResponseMethod(response, 'text'); + } + if (testIfIncluded(contentType, finalConfig.formData)) { + return doHandleResponseMethod(response, 'formData'); + } + if (testIfIncluded(contentType, finalConfig.blob)) { + return doHandleResponseMethod(response, 'blob'); + } + + return {}; +}; diff --git a/sdk/typescript/packages/mix-fetch/src/worker/index.ts b/sdk/typescript/packages/mix-fetch/src/worker/index.ts new file mode 100644 index 0000000000..4fd508b348 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/src/worker/index.ts @@ -0,0 +1,9 @@ +import { loadWasm } from './wasm-loading'; +import { run } from './main'; + +async function main() { + await loadWasm(); + await run(); +} + +main().catch((e: any) => console.error('Unhandled exception in mixFetch worker', e)); diff --git a/sdk/typescript/packages/mix-fetch/src/worker/main.ts b/sdk/typescript/packages/mix-fetch/src/worker/main.ts new file mode 100644 index 0000000000..fee270b055 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/src/worker/main.ts @@ -0,0 +1,64 @@ +/* eslint-disable no-restricted-globals */ +import { setupMixFetch } from '@nymproject/mix-fetch-wasm'; +import * as Comlink from 'comlink'; +import type { IMixFetchWebWorker, LoadedEvent } from '../types'; +import { EventKinds, ResponseBodyConfigMap, ResponseBodyConfigMapDefaults } from '../types'; +import { handleResponseMimeTypes } from './handle-response-mime-types'; + +/** + * Helper method to send typed messages. + * @param event The strongly typed message to send back to the calling thread. + */ +// eslint-disable-next-line no-restricted-globals +const postMessageWithType = (event: E) => self.postMessage(event); +export async function run() { + const { mixFetch } = self as any; + let responseBodyConfigMap: ResponseBodyConfigMap = ResponseBodyConfigMapDefaults; + + const mixFetchWebWorker: IMixFetchWebWorker = { + mixFetch: async (url, args) => { + console.log('[Worker] --- mixFetch ---', { url, args }); + + const response: Response = await mixFetch(url, args); + + console.log('[Worker]', { response, json: JSON.stringify(response, null, 2) }); + + const bodyResponse = await handleResponseMimeTypes(response, responseBodyConfigMap); + console.log('[Worker]', { bodyResponse }); + + const headers: any = {}; + response.headers.forEach((value, key) => { + headers[key] = value; + }); + + const output = { + body: bodyResponse, + url: response.url, + headers, + status: response.status, + statusText: response.statusText, + type: response.type, + ok: response.ok, + redirected: response.redirected, + }; + + console.log('[Worker]', { output }); + + return output; + }, + setupMixFetch: async (opts) => { + console.log('[Worker] --- setupMixFetch ---', { opts }); + if (opts?.responseBodyConfigMap) { + responseBodyConfigMap = opts.responseBodyConfigMap; + } + await setupMixFetch(opts || {}); + }, + }; + + // start comlink listening for messages and handle them above + Comlink.expose(mixFetchWebWorker); + + // notify any listeners that the web worker has loaded - HOWEVER, mixFetch hasn't been setup and the client started + // call `setupMixFetch` from the main thread to start the Nym client + postMessageWithType({ kind: EventKinds.Loaded, args: { loaded: true } }); +} diff --git a/sdk/typescript/packages/mix-fetch/src/worker/wasm-loading.ts b/sdk/typescript/packages/mix-fetch/src/worker/wasm-loading.ts new file mode 100644 index 0000000000..1fa64b4c5d --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/src/worker/wasm-loading.ts @@ -0,0 +1,87 @@ +/* eslint-disable @typescript-eslint/naming-convention,no-restricted-globals */ +/// + +// Copyright 2020-2023 Nym Technologies SA +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +// Rollup will replace wasmBytes with a function that loads the WASM bundle from a base64 string embedded in the output. +// +// Doing it this way, saves having to support a large variety of bundlers and their quirks. +// +// @ts-ignore +// eslint-disable-next-line import/no-extraneous-dependencies +import getMixFetchWasmBytes from '@nymproject/mix-fetch-wasm/mix_fetch_wasm_bg.wasm'; + +// @ts-ignore +// eslint-disable-next-line import/no-extraneous-dependencies +import getGoConnectionWasmBytes from '@nymproject/mix-fetch-wasm/go_conn.wasm'; + +// wasm_bindgen creates a global variable (with the exports attached) that is in scope after `importScripts` +import init, { + set_panic_hook, + send_client_data, + start_new_mixnet_connection, + mix_fetch_initialised, + finish_mixnet_connection, +} from '@nymproject/mix-fetch-wasm'; + +// see `typings/wasm_exec.d.ts` for the defintion of the `class Go` in global scope +import '@nymproject/mix-fetch-wasm/wasm_exec'; + +async function loadGoWasm() { + // rollup will provide a function to get the Go connection WASM bytes here + const bytes = await getGoConnectionWasmBytes(); + + // @ts-ignore + const go = new Go(); // Defined in wasm_exec.js + + // the WebAssembly runtime will parse the bytes and then start the Go runtime + const wasmObj = await WebAssembly.instantiate(bytes, go.importObject); + go.run(wasmObj); +} + +function setupRsGoBridge() { + const rsGoBridge = { + send_client_data, + start_new_mixnet_connection, + mix_fetch_initialised, + finish_mixnet_connection, + }; + + // (note: reason for intermediate `__rs_go_bridge__` object is to decrease global scope bloat + // and to discourage users from trying to call those methods directly) + // eslint-disable-next-line no-underscore-dangle + (self as any).__rs_go_bridge__ = rsGoBridge; +} + +export async function loadWasm() { + // rollup with provide a function to get the mixFetch WASM bytes + const bytes = await getMixFetchWasmBytes(); + + // load rust WASM package + await init(bytes); + console.log('Loaded RUST WASM'); + + // load go WASM package + await loadGoWasm(); + console.log('Loaded GO WASM'); + + // sets up better stack traces in case of in-rust panics + set_panic_hook(); + + setupRsGoBridge(); + + // goWasmSetLogging('trace'); +} diff --git a/sdk/typescript/packages/mix-fetch/tsconfig.jest.json b/sdk/typescript/packages/mix-fetch/tsconfig.jest.json new file mode 100644 index 0000000000..2e6284589e --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/tsconfig.jest.json @@ -0,0 +1,43 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "lib": [ + "es2021", + "dom", + "dom.iterable", + "esnext", + "webworker" + ], + "module": "CommonJS", + "target": "es5", + "strict": true, + "moduleResolution": "node", + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "declaration": true, + "baseUrl": ".", + "esModuleInterop": true, + "allowJs": true, + "downlevelIteration": true + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "jest.*", + "webpack.config.js", + "webpack.prod.js", + "webpack.common.js", + "node_modules", + "**/node_modules", + "dist", + "**/dist", + "scripts", + "jest", + "__tests__", + "**/__tests__", + "__jest__", + "**/__jest__", + "config/*" + ] +} diff --git a/sdk/typescript/packages/mix-fetch/tsconfig.json b/sdk/typescript/packages/mix-fetch/tsconfig.json new file mode 100644 index 0000000000..de7de44877 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/tsconfig.json @@ -0,0 +1,45 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "lib": [ + "es2021", + "dom", + "dom.iterable", + "esnext", + "webworker" + ], + "outDir": "./dist/", + "module": "esnext", + "target": "esnext", + "allowJs": false, + "strict": true, + "moduleResolution": "node", + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "declaration": true, + "baseUrl": ".", + "downlevelIteration": true + }, + "include": [ + "src/**/*.ts", + "src/*.ts", + "typings" + ], + "exclude": [ + "jest.config.js", + "webpack.config.js", + "webpack.prod.js", + "webpack.common.js", + "node_modules", + "**/node_modules", + "dist", + "**/dist", + "scripts", + "jest", + "__tests__", + "**/__tests__", + "__jest__", + "**/__jest__", + "config/*", + ] +} diff --git a/sdk/typescript/packages/mix-fetch/typedoc.json b/sdk/typescript/packages/mix-fetch/typedoc.json new file mode 100644 index 0000000000..46a91d8237 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/typedoc.json @@ -0,0 +1,32 @@ +{ + "sort": ["kind"], + "entryPoints": ["./src/index.ts"], + "out": "./docs", + "exclude": ["./src/worker/**"], + "kindSortOrder": [ + "Function", + "Interface", + "TypeAlias", + "Reference", + "Project", + "Module", + "Namespace", + "Enum", + "EnumMember", + "Class", + "Constructor", + "Property", + "Variable", + "Accessor", + "Method", + "ObjectLiteral", + "Parameter", + "TypeParameter", + "TypeLiteral", + "CallSignature", + "ConstructorSignature", + "IndexSignature", + "GetSignature", + "SetSignature" + ] +} diff --git a/sdk/typescript/packages/mix-fetch/typings/rollup-worker.d.ts b/sdk/typescript/packages/mix-fetch/typings/rollup-worker.d.ts new file mode 100644 index 0000000000..ead3d9e1f4 --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/typings/rollup-worker.d.ts @@ -0,0 +1,4 @@ +declare module 'web-worker:*' { + const WorkerFactory: new () => Worker; + export default WorkerFactory; +} diff --git a/sdk/typescript/packages/mix-fetch/typings/wasm_exec.d.ts b/sdk/typescript/packages/mix-fetch/typings/wasm_exec.d.ts new file mode 100644 index 0000000000..9424fd386b --- /dev/null +++ b/sdk/typescript/packages/mix-fetch/typings/wasm_exec.d.ts @@ -0,0 +1,11 @@ +declare module '@nymproject/mix-fetch-wasm/wasm_exec' { + export declare global { + class Go { + constructor(); + + importObject: any; + + run(goWasm: any); + } + } +} diff --git a/ts-packages/mui-theme/README.md b/sdk/typescript/packages/mui-theme/README.md similarity index 100% rename from ts-packages/mui-theme/README.md rename to sdk/typescript/packages/mui-theme/README.md diff --git a/ts-packages/mui-theme/package.json b/sdk/typescript/packages/mui-theme/package.json similarity index 97% rename from ts-packages/mui-theme/package.json rename to sdk/typescript/packages/mui-theme/package.json index c1f33a412e..1e74b7cb22 100644 --- a/ts-packages/mui-theme/package.json +++ b/sdk/typescript/packages/mui-theme/package.json @@ -37,6 +37,7 @@ "clean": "rimraf dist", "build": "tsc --noEmit false", "watch": "tsc --noEmit false -w", + "tsc": "tsc --noEmit true", "lint": "eslint src", "lint:fix": "eslint src --fix" } diff --git a/ts-packages/mui-theme/src/index.ts b/sdk/typescript/packages/mui-theme/src/index.ts similarity index 100% rename from ts-packages/mui-theme/src/index.ts rename to sdk/typescript/packages/mui-theme/src/index.ts diff --git a/ts-packages/mui-theme/src/theme/common.ts b/sdk/typescript/packages/mui-theme/src/theme/common.ts similarity index 100% rename from ts-packages/mui-theme/src/theme/common.ts rename to sdk/typescript/packages/mui-theme/src/theme/common.ts diff --git a/ts-packages/mui-theme/src/theme/index.tsx b/sdk/typescript/packages/mui-theme/src/theme/index.tsx similarity index 100% rename from ts-packages/mui-theme/src/theme/index.tsx rename to sdk/typescript/packages/mui-theme/src/theme/index.tsx diff --git a/ts-packages/mui-theme/src/theme/network-explorer.ts b/sdk/typescript/packages/mui-theme/src/theme/network-explorer.ts similarity index 100% rename from ts-packages/mui-theme/src/theme/network-explorer.ts rename to sdk/typescript/packages/mui-theme/src/theme/network-explorer.ts diff --git a/ts-packages/mui-theme/src/theme/theme.ts b/sdk/typescript/packages/mui-theme/src/theme/theme.ts similarity index 100% rename from ts-packages/mui-theme/src/theme/theme.ts rename to sdk/typescript/packages/mui-theme/src/theme/theme.ts diff --git a/ts-packages/mui-theme/src/theme/utils.ts b/sdk/typescript/packages/mui-theme/src/theme/utils.ts similarity index 100% rename from ts-packages/mui-theme/src/theme/utils.ts rename to sdk/typescript/packages/mui-theme/src/theme/utils.ts diff --git a/ts-packages/mui-theme/src/theme/wallet.ts b/sdk/typescript/packages/mui-theme/src/theme/wallet.ts similarity index 100% rename from ts-packages/mui-theme/src/theme/wallet.ts rename to sdk/typescript/packages/mui-theme/src/theme/wallet.ts diff --git a/ts-packages/react-webpack-with-theme-example/src/typings/FC.d.ts b/sdk/typescript/packages/mui-theme/src/typings/FC.d.ts similarity index 100% rename from ts-packages/react-webpack-with-theme-example/src/typings/FC.d.ts rename to sdk/typescript/packages/mui-theme/src/typings/FC.d.ts diff --git a/ts-packages/mui-theme/template/mui-theme.d.ts b/sdk/typescript/packages/mui-theme/template/mui-theme.d.ts similarity index 100% rename from ts-packages/mui-theme/template/mui-theme.d.ts rename to sdk/typescript/packages/mui-theme/template/mui-theme.d.ts diff --git a/ts-packages/mui-theme/tsconfig.json b/sdk/typescript/packages/mui-theme/tsconfig.json similarity index 86% rename from ts-packages/mui-theme/tsconfig.json rename to sdk/typescript/packages/mui-theme/tsconfig.json index adabac7c0e..2ce06c54b9 100644 --- a/ts-packages/mui-theme/tsconfig.json +++ b/sdk/typescript/packages/mui-theme/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../tsconfig.json", + "extends": "../../tsconfig.json", "compilerOptions": { "baseUrl": "./", "outDir": "./dist", diff --git a/sdk/typescript/packages/node-tester/.babelrc b/sdk/typescript/packages/node-tester/.babelrc new file mode 100644 index 0000000000..0ef5ffc214 --- /dev/null +++ b/sdk/typescript/packages/node-tester/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/env"] +} diff --git a/sdk/typescript/packages/node-tester/.gitignore b/sdk/typescript/packages/node-tester/.gitignore new file mode 100644 index 0000000000..d0b3e5e3ff --- /dev/null +++ b/sdk/typescript/packages/node-tester/.gitignore @@ -0,0 +1 @@ +src/worker.js diff --git a/sdk/typescript/packages/node-tester/README-CommonJS-full-fat.md b/sdk/typescript/packages/node-tester/README-CommonJS-full-fat.md new file mode 100644 index 0000000000..cc17ad4fb3 --- /dev/null +++ b/sdk/typescript/packages/node-tester/README-CommonJS-full-fat.md @@ -0,0 +1,7 @@ +# Nym Node Tester + +This package provides a WASM library to test if a Nym node can process packets. + +## Usage + +TODO diff --git a/sdk/typescript/packages/node-tester/README-CommonJS.md b/sdk/typescript/packages/node-tester/README-CommonJS.md new file mode 100644 index 0000000000..cc17ad4fb3 --- /dev/null +++ b/sdk/typescript/packages/node-tester/README-CommonJS.md @@ -0,0 +1,7 @@ +# Nym Node Tester + +This package provides a WASM library to test if a Nym node can process packets. + +## Usage + +TODO diff --git a/sdk/typescript/packages/node-tester/README-full-fat.md b/sdk/typescript/packages/node-tester/README-full-fat.md new file mode 100644 index 0000000000..cc17ad4fb3 --- /dev/null +++ b/sdk/typescript/packages/node-tester/README-full-fat.md @@ -0,0 +1,7 @@ +# Nym Node Tester + +This package provides a WASM library to test if a Nym node can process packets. + +## Usage + +TODO diff --git a/sdk/typescript/packages/node-tester/README.md b/sdk/typescript/packages/node-tester/README.md new file mode 100644 index 0000000000..cc17ad4fb3 --- /dev/null +++ b/sdk/typescript/packages/node-tester/README.md @@ -0,0 +1,7 @@ +# Nym Node Tester + +This package provides a WASM library to test if a Nym node can process packets. + +## Usage + +TODO diff --git a/sdk/typescript/packages/node-tester/jest.config.mjs b/sdk/typescript/packages/node-tester/jest.config.mjs new file mode 100644 index 0000000000..ed5b112c72 --- /dev/null +++ b/sdk/typescript/packages/node-tester/jest.config.mjs @@ -0,0 +1,15 @@ +import preset from 'ts-jest/presets/index.js' + +/** @type {import('ts-jest').JestConfigWithTsJest} */ +export default { + ...preset.defaults, + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: 'tsconfig.jest.json', + useESM: true, + }, + ], + }, +} diff --git a/sdk/typescript/packages/node-tester/package.json b/sdk/typescript/packages/node-tester/package.json new file mode 100644 index 0000000000..33ab25cbbf --- /dev/null +++ b/sdk/typescript/packages/node-tester/package.json @@ -0,0 +1,74 @@ +{ + "name": "@nymproject/node-tester", + "version": "1.2.0-rc.2", + "description": "This package provides a tester that can send test packets to mixnode that is part of the Nym Mixnet.", + "license": "Apache-2.0", + "author": "Nym Technologies SA", + "files": [ + "dist/esm/worker.js", + "dist/cjs/worker.js", + "dist/**/*" + ], + "main": "dist/cjs/index.js", + "browser": "dist/esm/index.js", + "scripts": { + "build": "scripts/build-prod.sh", + "build:dev": "scripts/build.sh", + "build:dev:esm": "scripts/build-dev-esm.sh", + "build:worker": "rollup -c rollup-worker.config.mjs", + "clean": "rimraf dist", + "lint": "eslint src", + "lint:fix": "eslint src --fix", + "start": "tsc -w", + "start:dev": "nodemon --watch src -e ts,json --exec 'yarn build:dev:esm'", + "test": "node --experimental-vm-modules --no-warnings node_modules/jest/bin/jest.js -c=jest.config.mjs --no-cache", + "tsc": "tsc --noEmit true" + }, + "dependencies": { + "@nymproject/nym-node-tester-wasm": ">=1.2.0-rc.0 || ^1", + "comlink": "^4.3.1" + }, + "devDependencies": { + "@babel/core": "^7.15.0", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/preset-env": "^7.15.0", + "@babel/preset-react": "^7.14.5", + "@babel/preset-typescript": "^7.15.0", + "@nymproject/eslint-config-react-typescript": "^1.0.0", + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-inject": "^5.0.3", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.0.1", + "@rollup/plugin-replace": "^5.0.2", + "@rollup/plugin-terser": "^0.2.1", + "@rollup/plugin-typescript": "^10.0.1", + "@rollup/plugin-wasm": "^6.1.1", + "@types/jest": "^27.0.1", + "@types/node": "^16.7.13", + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.13.0", + "eslint": "^8.10.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-root-import": "^1.0.4", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jest": "^26.1.1", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.29.2", + "eslint-plugin-react-hooks": "^4.3.0", + "jest": "^29.5.0", + "nodemon": "^2.0.21", + "rimraf": "^3.0.2", + "rollup": "^3.9.1", + "rollup-plugin-base64": "^1.0.1", + "rollup-plugin-web-worker-loader": "^1.6.1", + "ts-jest": "^29.1.0", + "ts-loader": "^9.4.2", + "typescript": "^4.8.4" + }, + "private": false, + "type": "module", + "types": "./dist/esm/index.d.ts" +} \ No newline at end of file diff --git a/sdk/typescript/packages/node-tester/rollup-cjs-full-fat.config.mjs b/sdk/typescript/packages/node-tester/rollup-cjs-full-fat.config.mjs new file mode 100644 index 0000000000..d4c6e39e99 --- /dev/null +++ b/sdk/typescript/packages/node-tester/rollup-cjs-full-fat.config.mjs @@ -0,0 +1,8 @@ +import { getConfig } from './rollup/cjs.mjs'; + +export default { + ...getConfig({ + inline: true, + outputDir: 'dist/cjs-full-fat', + }), +}; diff --git a/sdk/typescript/packages/node-tester/rollup-cjs.config.mjs b/sdk/typescript/packages/node-tester/rollup-cjs.config.mjs new file mode 100644 index 0000000000..a12e5bdb7a --- /dev/null +++ b/sdk/typescript/packages/node-tester/rollup-cjs.config.mjs @@ -0,0 +1,5 @@ +import { getConfig } from './rollup/cjs.mjs'; + +export default { + ...getConfig({ inline: false }), +}; diff --git a/sdk/typescript/packages/node-tester/rollup-esm-full-fat.config.mjs b/sdk/typescript/packages/node-tester/rollup-esm-full-fat.config.mjs new file mode 100644 index 0000000000..ea80b1997b --- /dev/null +++ b/sdk/typescript/packages/node-tester/rollup-esm-full-fat.config.mjs @@ -0,0 +1,8 @@ +import { getConfig } from './rollup/esm.mjs'; + +export default { + ...getConfig({ + inline: true, + outputDir: 'dist/esm-full-fat', + }), +}; diff --git a/sdk/typescript/packages/node-tester/rollup-esm.config.mjs b/sdk/typescript/packages/node-tester/rollup-esm.config.mjs new file mode 100644 index 0000000000..fe7b0082bb --- /dev/null +++ b/sdk/typescript/packages/node-tester/rollup-esm.config.mjs @@ -0,0 +1,8 @@ +import { getConfig } from './rollup/esm.mjs'; + +export default { + ...getConfig({ + // by default, the web worker will not be inlined, in local development mode it will be + inline: process.env.MIX_FETCH_DEV_MODE === 'true', + }), +}; diff --git a/sdk/typescript/packages/sdk/rollup-node-tester-worker.config.mjs b/sdk/typescript/packages/node-tester/rollup-worker.config.mjs similarity index 79% rename from sdk/typescript/packages/sdk/rollup-node-tester-worker.config.mjs rename to sdk/typescript/packages/node-tester/rollup-worker.config.mjs index 5f18e7ce33..b34376618c 100644 --- a/sdk/typescript/packages/sdk/rollup-node-tester-worker.config.mjs +++ b/sdk/typescript/packages/node-tester/rollup-worker.config.mjs @@ -3,10 +3,12 @@ import resolve from '@rollup/plugin-node-resolve'; import { wasm } from '@rollup/plugin-wasm'; import replace from '@rollup/plugin-replace'; -const extensions = ['.js', '.jsx', '.ts', '.tsx']; +const extensions = [ + '.js', '.jsx', '.ts', '.tsx', +]; export default { - input: 'src/mixnet/node-tester/worker.ts', + input: 'src/worker.ts', output: { dir: 'dist', format: 'cjs', @@ -15,7 +17,7 @@ export default { resolve({ extensions }), // this is some nasty monkey patching that removes the WASM URL (because it is handled by the `wasm` plugin) replace({ - values: { "input = new URL('nym_client_wasm_bg.wasm', import.meta.url);": 'input = undefined;' }, + values: { 'input = new URL(\'mix_fetch_wasm_bg.wasm\', import.meta.url);': 'input = undefined;' }, delimiters: ['', ''], preventAssignment: true, }), diff --git a/sdk/typescript/packages/node-tester/rollup/cjs.mjs b/sdk/typescript/packages/node-tester/rollup/cjs.mjs new file mode 100644 index 0000000000..18c6f5e8c0 --- /dev/null +++ b/sdk/typescript/packages/node-tester/rollup/cjs.mjs @@ -0,0 +1,30 @@ +import typescript from '@rollup/plugin-typescript'; +import resolve from '@rollup/plugin-node-resolve'; +import { wasm } from '@rollup/plugin-wasm'; +import webWorkerLoader from 'rollup-plugin-web-worker-loader'; + +const extensions = ['.js', '.jsx', '.ts', '.tsx']; + +/** + * Gets the config for bundling the package as a CommonJS module. + * + * @param opts Options: + * `{ inline: boolean }` - set inline to true to inline the web worker in the main bundle + * `{ outputDir: string }` - override the destination + */ +export const getConfig = (opts) => ({ + input: 'src/index.ts', + output: { + dir: opts.outputDir || 'dist/cjs', + format: 'cjs', + }, + plugins: [ + webWorkerLoader({ targetPlatform: 'browser', inline: opts.inline }), // the inline param is used here + resolve({ extensions }), + wasm({ maxFileSize: 10000000, targetEnv: 'browser' }), + typescript({ + compilerOptions: { outDir: opts.outputDir || 'dist/cjs', target: 'es5' }, + exclude: ['worker.ts'], + }), + ], +}); diff --git a/sdk/typescript/packages/node-tester/rollup/esm.mjs b/sdk/typescript/packages/node-tester/rollup/esm.mjs new file mode 100644 index 0000000000..b47cf1ac05 --- /dev/null +++ b/sdk/typescript/packages/node-tester/rollup/esm.mjs @@ -0,0 +1,28 @@ +import typescript from '@rollup/plugin-typescript'; +import resolve from '@rollup/plugin-node-resolve'; +import webWorkerLoader from 'rollup-plugin-web-worker-loader'; + +const extensions = ['.js', '.jsx', '.ts', '.tsx']; + +/** + * Gets the config for bundling the package as an ES Module. + * + * @param opts Options: + * `{ inline: boolean }` - set inline to true to inline the web worker in the main bundle + * `{ outputDir: string }` - override the destination * + */ +export const getConfig = (opts) => ({ + input: 'src/index.ts', + output: { + dir: opts.outputDir || 'dist/esm', + format: 'es', + }, + plugins: [ + webWorkerLoader({ targetPlatform: 'browser', inline: opts.inline }), // the inline param is used here + resolve({ extensions }), + typescript({ + exclude: ['worker.ts'], + compilerOptions: { outDir: opts.outputDir || 'dist/esm' }, + }), + ], +}); diff --git a/sdk/typescript/packages/node-tester/scripts/build-dev-esm.sh b/sdk/typescript/packages/node-tester/scripts/build-dev-esm.sh new file mode 100755 index 0000000000..26970fc4e6 --- /dev/null +++ b/sdk/typescript/packages/node-tester/scripts/build-dev-esm.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +#------------------------------------------------------- +# WEB WORKER (node-tester WASM) +#------------------------------------------------------- +# The web worker needs to be bundled because the WASM bundle needs to be loaded synchronously and all dependencies +# must be included in the worker script (because it is not loaded as an ES Module) + +# build the worker +rollup -c rollup-worker.config.mjs + +# move it next to the Typescript `src/index.ts` so it can be inlined by rollup +cp dist/worker.js src/worker.js +rm dist/worker.js + +#------------------------------------------------------- +# ESM +#------------------------------------------------------- + +# build the SDK as a ESM bundle +rollup -c rollup-esm.config.mjs + +#------------------------------------------------------- +# CLEAN UP +#------------------------------------------------------- + +rm -rf dist/esm/worker + + diff --git a/sdk/typescript/packages/node-tester/scripts/build-prod.sh b/sdk/typescript/packages/node-tester/scripts/build-prod.sh new file mode 100755 index 0000000000..74a173acc8 --- /dev/null +++ b/sdk/typescript/packages/node-tester/scripts/build-prod.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +rm -rf dist || true +rm -rf ../../../../dist/ts/sdk/node-tester || true + +# run the build +scripts/build.sh +node scripts/buildPackageJson.mjs + +# move the output outside of the yarn/npm workspaces +mkdir -p ../../../../dist/ts/sdk +mv dist ../../../../dist/ts/sdk +mv ../../../../dist/ts/sdk/dist ../../../../dist/ts/sdk/node-tester + +echo "Output can be found in:" +realpath ../../../../dist/ts/sdk/node-tester diff --git a/sdk/typescript/packages/node-tester/scripts/build.sh b/sdk/typescript/packages/node-tester/scripts/build.sh new file mode 100755 index 0000000000..64ed2e4381 --- /dev/null +++ b/sdk/typescript/packages/node-tester/scripts/build.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +rm -rf dist || true + +#------------------------------------------------------- +# WEB WORKER (mix-fetch WASM) +#------------------------------------------------------- +# The web worker needs to be bundled because the WASM bundle needs to be loaded synchronously and all dependencies +# must be included in the worker script (because it is not loaded as an ES Module) + +# build the worker +rollup -c rollup-worker.config.mjs + +# move it next to the Typescript `src/index.ts` so it can be inlined by rollup +rm -f src/worker.js +mv dist/worker.js src/worker.js + +#------------------------------------------------------- +# ESM +#------------------------------------------------------- + +# build the SDK as a ESM bundle +rollup -c rollup-esm.config.mjs + +#------------------------------------------------------- +# COMMON JS +#------------------------------------------------------- +# Some old build systems cannot fully handle ESM or ES2021, so build +# a CommonJS bundle targeting ES5 + +# build the SDK as a CommonJS bundle +rollup -c rollup-cjs.config.mjs + +#------------------------------------------------------- +# ESM (full-fat) +#------------------------------------------------------- + +# build the SDK as a ESM bundle (with worker inlined as a blob) +rollup -c rollup-esm-full-fat.config.mjs + +#------------------------------------------------------- +# COMMON JS (full-fat) +#------------------------------------------------------- +# Some old build systems cannot fully handle ESM or ES2021, so build +# a CommonJS bundle targeting ES5 + +# build the SDK as a CommonJS bundle (with worker inlined as a blob) +rollup -c rollup-cjs-full-fat.config.mjs + +#------------------------------------------------------- +# CLEAN UP +#------------------------------------------------------- + +rm -rf dist/cjs/worker +rm -rf dist/esm/worker +rm -rf dist/cjs-full-fat/worker +rm -rf dist/esm-full-fat/worker + +# copy README +cp README.md dist/esm +cp README-CommonJS.md dist/cjs/README.md +cp README-CommonJS-full-fat.md dist/cjs-full-fat/README.md +cp README-full-fat.md dist/esm-full-fat/README.md + + diff --git a/sdk/typescript/packages/node-tester/scripts/buildPackageJson.mjs b/sdk/typescript/packages/node-tester/scripts/buildPackageJson.mjs new file mode 100644 index 0000000000..3fc5a7b5b2 --- /dev/null +++ b/sdk/typescript/packages/node-tester/scripts/buildPackageJson.mjs @@ -0,0 +1,29 @@ +import * as fs from 'fs'; + +// parse the package.json from the SDK, so we can keep fields like the name and version +const json = JSON.parse(fs.readFileSync('package.json').toString()); + +// defaults (NB: these are in the output file locations) +const browser = 'index.js'; +const main = 'index.js'; +const types = 'index.d.ts'; + +const getPackageJson = (type, suffix) => ({ + name: `${json.name}${suffix ? `-${suffix}` : ''}`, + version: json.version, + license: json.license, + author: json.author, + type, + browser, + main, + types, +}); + +fs.writeFileSync('dist/cjs/package.json', JSON.stringify(getPackageJson('commonjs', 'commonjs'), null, 2)); +fs.writeFileSync('dist/esm/package.json', JSON.stringify(getPackageJson('module'), null, 2)); + +fs.writeFileSync( + 'dist/cjs-full-fat/package.json', + JSON.stringify(getPackageJson('commonjs', 'commonjs-full-fat'), null, 2), +); +fs.writeFileSync('dist/esm-full-fat/package.json', JSON.stringify(getPackageJson('module', 'full-fat'), null, 2)); diff --git a/sdk/typescript/packages/node-tester/scripts/publish.sh b/sdk/typescript/packages/node-tester/scripts/publish.sh new file mode 100755 index 0000000000..f08bcf3068 --- /dev/null +++ b/sdk/typescript/packages/node-tester/scripts/publish.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +yarn +yarn build +cd ../../../../dist/ts/sdk/node-tester + +cd cjs +echo "Publishing CommonJS package to NPM.." +npm publish --access=public +cd .. + +cd esm +echo "Publishing ESM package to NPM.." +npm publish --access=public +cd .. diff --git a/sdk/typescript/packages/sdk/src/mixnet/node-tester/index.ts b/sdk/typescript/packages/node-tester/src/index.ts similarity index 98% rename from sdk/typescript/packages/sdk/src/mixnet/node-tester/index.ts rename to sdk/typescript/packages/node-tester/src/index.ts index 04e52ee579..230ed9490a 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/node-tester/index.ts +++ b/sdk/typescript/packages/node-tester/src/index.ts @@ -48,3 +48,5 @@ const createWorker = async () => { once: true }, ); }); + +export * from './types'; diff --git a/sdk/typescript/packages/sdk/src/mixnet/node-tester/types.ts b/sdk/typescript/packages/node-tester/src/types.ts similarity index 100% rename from sdk/typescript/packages/sdk/src/mixnet/node-tester/types.ts rename to sdk/typescript/packages/node-tester/src/types.ts diff --git a/sdk/typescript/packages/sdk/src/mixnet/node-tester/worker.ts b/sdk/typescript/packages/node-tester/src/worker.ts similarity index 91% rename from sdk/typescript/packages/sdk/src/mixnet/node-tester/worker.ts rename to sdk/typescript/packages/node-tester/src/worker.ts index ec51afd3ce..2251ac3909 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/node-tester/worker.ts +++ b/sdk/typescript/packages/node-tester/src/worker.ts @@ -21,10 +21,10 @@ import * as Comlink from 'comlink'; // // @ts-ignore // eslint-disable-next-line import/no-extraneous-dependencies -import wasmBytes from '@nymproject/nym-client-wasm/nym_client_wasm_bg.wasm'; +import wasmBytes from '@nymproject/nym-node-tester-wasm/nym_node_tester_wasm_bg.wasm'; /* eslint-disable no-restricted-globals */ -import init, { NymNodeTester, current_network_topology, NodeTestResult } from '@nymproject/nym-client-wasm'; +import init, { NymNodeTester, NodeTestResult } from '@nymproject/nym-node-tester-wasm/nym_node_tester_wasm'; import type { INodeTesterWorkerAsync, NodeTesterLoadedEvent } from './types'; import { NodeTesterEventKinds } from './types'; @@ -37,10 +37,8 @@ const postMessageWithType = (event: E) => self.postMessage(event); console.log('[Nym WASM client] Starting Nym WASM web worker...'); -const buildTester = async (validatorUrl: string, nodeTesterId?: string): Promise => { - const topology = await current_network_topology(validatorUrl); - return new NymNodeTester(topology, nodeTesterId); -}; +const buildTester = async (validatorUrl: string, nodeTesterId?: string): Promise => + new NymNodeTester({ nymApi: validatorUrl, id: nodeTesterId }); async function main() { const importResult = await init(wasmBytes()); diff --git a/sdk/typescript/packages/node-tester/tsconfig.jest.json b/sdk/typescript/packages/node-tester/tsconfig.jest.json new file mode 100644 index 0000000000..2e6284589e --- /dev/null +++ b/sdk/typescript/packages/node-tester/tsconfig.jest.json @@ -0,0 +1,43 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "lib": [ + "es2021", + "dom", + "dom.iterable", + "esnext", + "webworker" + ], + "module": "CommonJS", + "target": "es5", + "strict": true, + "moduleResolution": "node", + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "declaration": true, + "baseUrl": ".", + "esModuleInterop": true, + "allowJs": true, + "downlevelIteration": true + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "jest.*", + "webpack.config.js", + "webpack.prod.js", + "webpack.common.js", + "node_modules", + "**/node_modules", + "dist", + "**/dist", + "scripts", + "jest", + "__tests__", + "**/__tests__", + "__jest__", + "**/__jest__", + "config/*" + ] +} diff --git a/sdk/typescript/packages/node-tester/tsconfig.json b/sdk/typescript/packages/node-tester/tsconfig.json new file mode 100644 index 0000000000..de7de44877 --- /dev/null +++ b/sdk/typescript/packages/node-tester/tsconfig.json @@ -0,0 +1,45 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "lib": [ + "es2021", + "dom", + "dom.iterable", + "esnext", + "webworker" + ], + "outDir": "./dist/", + "module": "esnext", + "target": "esnext", + "allowJs": false, + "strict": true, + "moduleResolution": "node", + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "declaration": true, + "baseUrl": ".", + "downlevelIteration": true + }, + "include": [ + "src/**/*.ts", + "src/*.ts", + "typings" + ], + "exclude": [ + "jest.config.js", + "webpack.config.js", + "webpack.prod.js", + "webpack.common.js", + "node_modules", + "**/node_modules", + "dist", + "**/dist", + "scripts", + "jest", + "__tests__", + "**/__tests__", + "__jest__", + "**/__jest__", + "config/*", + ] +} diff --git a/sdk/typescript/packages/node-tester/typings/rollup-worker.d.ts b/sdk/typescript/packages/node-tester/typings/rollup-worker.d.ts new file mode 100644 index 0000000000..ead3d9e1f4 --- /dev/null +++ b/sdk/typescript/packages/node-tester/typings/rollup-worker.d.ts @@ -0,0 +1,4 @@ +declare module 'web-worker:*' { + const WorkerFactory: new () => Worker; + export default WorkerFactory; +} diff --git a/sdk/typescript/packages/nym-client-wasm/BUILD.md b/sdk/typescript/packages/nym-client-wasm/BUILD.md deleted file mode 100644 index f3d393c9b8..0000000000 --- a/sdk/typescript/packages/nym-client-wasm/BUILD.md +++ /dev/null @@ -1,39 +0,0 @@ -# `@nym-project/nym-client-wasm` - -This package contains a WASM client for using the Nym mixnet. - -## Usage - -You should use `@nym-project/sdk` instead of using this package directory. - -If you want to use it directly, you'll need to configure bundling and interop as suits your project. - -## Build - -The build process is a bit nasty. This is necessary to make the package easier to consume. - -Build the package by running the following from this directory: - -``` -scripts/build.sh -``` - -The following files will be copied into this directory, so that it becomes a package that can be used by the `@nym-project/sdk` package: - -``` -nym_client_wasm.d.ts -nym_client_wasm.js -nym_client_wasm_bg.wasm -nym_client_wasm_bg.wasm.d.ts -package.json -``` - -## Publish to `npm` - -First build the package with the instructions above. - -Publish to `npm` with: - -``` -npm publish -``` \ No newline at end of file diff --git a/sdk/typescript/packages/nym-client-wasm/scripts/build.sh b/sdk/typescript/packages/nym-client-wasm/scripts/build.sh deleted file mode 100755 index 5db2aea640..0000000000 --- a/sdk/typescript/packages/nym-client-wasm/scripts/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash - -set -o errexit -set -o nounset -set -o pipefail - -# change to the same directory as the script, then go up one -cd "$(dirname "$0")" -cd .. - -# clear out any files and suppress missing file errors -rm -f nym_client_wasm* package.json || true - -# let wasm-pack build the files and put them in the output location rather than `./pkg` -cd ../../../../clients/webassembly -wasm-pack build --scope nymproject --target web --out-dir ../../sdk/typescript/packages/nym-client-wasm - -# run wasm-opt manually to circumvent wasm-pack issues with Apple Silicon -cd ../../sdk/typescript/packages/nym-client-wasm -wasm-opt -O4 nym_client_wasm_bg.wasm -o nym_client_wasm_bg.wasm - -# clean up some files that come with the build -rm README.md LICENSE_APACHE diff --git a/ts-packages/react-components/.eslintrc.json b/sdk/typescript/packages/react-components/.eslintrc.json similarity index 100% rename from ts-packages/react-components/.eslintrc.json rename to sdk/typescript/packages/react-components/.eslintrc.json diff --git a/ts-packages/react-components/.storybook/main.js b/sdk/typescript/packages/react-components/.storybook/main.js similarity index 100% rename from ts-packages/react-components/.storybook/main.js rename to sdk/typescript/packages/react-components/.storybook/main.js diff --git a/ts-packages/react-components/.storybook/preview.js b/sdk/typescript/packages/react-components/.storybook/preview.js similarity index 100% rename from ts-packages/react-components/.storybook/preview.js rename to sdk/typescript/packages/react-components/.storybook/preview.js diff --git a/ts-packages/react-components/README.md b/sdk/typescript/packages/react-components/README.md similarity index 100% rename from ts-packages/react-components/README.md rename to sdk/typescript/packages/react-components/README.md diff --git a/ts-packages/react-components/package.json b/sdk/typescript/packages/react-components/package.json similarity index 98% rename from ts-packages/react-components/package.json rename to sdk/typescript/packages/react-components/package.json index 47fd5dd87c..6322ded2af 100644 --- a/ts-packages/react-components/package.json +++ b/sdk/typescript/packages/react-components/package.json @@ -82,6 +82,7 @@ }, "scripts": { "clean": "rimraf dist", + "tsc": "tsc --noEmit true", "build": "tsc --noEmit false", "watch": "tsc --noEmit false -w", "lint": "eslint src .storybook", diff --git a/ts-packages/react-components/src/components/account/WalletAddressFormField.stories.tsx b/sdk/typescript/packages/react-components/src/components/account/WalletAddressFormField.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/account/WalletAddressFormField.stories.tsx rename to sdk/typescript/packages/react-components/src/components/account/WalletAddressFormField.stories.tsx diff --git a/ts-packages/react-components/src/components/account/WalletAddressFormField.tsx b/sdk/typescript/packages/react-components/src/components/account/WalletAddressFormField.tsx similarity index 100% rename from ts-packages/react-components/src/components/account/WalletAddressFormField.tsx rename to sdk/typescript/packages/react-components/src/components/account/WalletAddressFormField.tsx diff --git a/ts-packages/react-components/src/components/banners/MaintenanceBanner.tsx b/sdk/typescript/packages/react-components/src/components/banners/MaintenanceBanner.tsx similarity index 100% rename from ts-packages/react-components/src/components/banners/MaintenanceBanner.tsx rename to sdk/typescript/packages/react-components/src/components/banners/MaintenanceBanner.tsx diff --git a/ts-packages/react-components/src/components/client-address/ClientAddress.stories.tsx b/sdk/typescript/packages/react-components/src/components/client-address/ClientAddress.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/client-address/ClientAddress.stories.tsx rename to sdk/typescript/packages/react-components/src/components/client-address/ClientAddress.stories.tsx diff --git a/ts-packages/react-components/src/components/client-address/ClientAddress.tsx b/sdk/typescript/packages/react-components/src/components/client-address/ClientAddress.tsx similarity index 100% rename from ts-packages/react-components/src/components/client-address/ClientAddress.tsx rename to sdk/typescript/packages/react-components/src/components/client-address/ClientAddress.tsx diff --git a/ts-packages/react-components/src/components/clipboard/CopyToClipboard.stories.tsx b/sdk/typescript/packages/react-components/src/components/clipboard/CopyToClipboard.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/clipboard/CopyToClipboard.stories.tsx rename to sdk/typescript/packages/react-components/src/components/clipboard/CopyToClipboard.stories.tsx diff --git a/ts-packages/react-components/src/components/clipboard/CopyToClipboard.tsx b/sdk/typescript/packages/react-components/src/components/clipboard/CopyToClipboard.tsx similarity index 100% rename from ts-packages/react-components/src/components/clipboard/CopyToClipboard.tsx rename to sdk/typescript/packages/react-components/src/components/clipboard/CopyToClipboard.tsx diff --git a/ts-packages/react-components/src/components/coins/CoinMark.stories.tsx b/sdk/typescript/packages/react-components/src/components/coins/CoinMark.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/coins/CoinMark.stories.tsx rename to sdk/typescript/packages/react-components/src/components/coins/CoinMark.stories.tsx diff --git a/ts-packages/react-components/src/components/coins/CoinMark.tsx b/sdk/typescript/packages/react-components/src/components/coins/CoinMark.tsx similarity index 100% rename from ts-packages/react-components/src/components/coins/CoinMark.tsx rename to sdk/typescript/packages/react-components/src/components/coins/CoinMark.tsx diff --git a/ts-packages/react-components/src/components/coins/CoinMarkTestnet.stories.tsx b/sdk/typescript/packages/react-components/src/components/coins/CoinMarkTestnet.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/coins/CoinMarkTestnet.stories.tsx rename to sdk/typescript/packages/react-components/src/components/coins/CoinMarkTestnet.stories.tsx diff --git a/ts-packages/react-components/src/components/coins/CoinMarkTestnet.tsx b/sdk/typescript/packages/react-components/src/components/coins/CoinMarkTestnet.tsx similarity index 100% rename from ts-packages/react-components/src/components/coins/CoinMarkTestnet.tsx rename to sdk/typescript/packages/react-components/src/components/coins/CoinMarkTestnet.tsx diff --git a/ts-packages/react-components/src/components/currency/Currency.stories.tsx b/sdk/typescript/packages/react-components/src/components/currency/Currency.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/currency/Currency.stories.tsx rename to sdk/typescript/packages/react-components/src/components/currency/Currency.stories.tsx diff --git a/ts-packages/react-components/src/components/currency/Currency.tsx b/sdk/typescript/packages/react-components/src/components/currency/Currency.tsx similarity index 100% rename from ts-packages/react-components/src/components/currency/Currency.tsx rename to sdk/typescript/packages/react-components/src/components/currency/Currency.tsx diff --git a/ts-packages/react-components/src/components/currency/CurrencyAmount.stories.tsx b/sdk/typescript/packages/react-components/src/components/currency/CurrencyAmount.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/currency/CurrencyAmount.stories.tsx rename to sdk/typescript/packages/react-components/src/components/currency/CurrencyAmount.stories.tsx diff --git a/ts-packages/react-components/src/components/currency/CurrencyAmount.tsx b/sdk/typescript/packages/react-components/src/components/currency/CurrencyAmount.tsx similarity index 100% rename from ts-packages/react-components/src/components/currency/CurrencyAmount.tsx rename to sdk/typescript/packages/react-components/src/components/currency/CurrencyAmount.tsx diff --git a/ts-packages/react-components/src/components/currency/CurrencyFormField.stories.tsx b/sdk/typescript/packages/react-components/src/components/currency/CurrencyFormField.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/currency/CurrencyFormField.stories.tsx rename to sdk/typescript/packages/react-components/src/components/currency/CurrencyFormField.stories.tsx diff --git a/ts-packages/react-components/src/components/currency/CurrencyFormField.tsx b/sdk/typescript/packages/react-components/src/components/currency/CurrencyFormField.tsx similarity index 100% rename from ts-packages/react-components/src/components/currency/CurrencyFormField.tsx rename to sdk/typescript/packages/react-components/src/components/currency/CurrencyFormField.tsx diff --git a/ts-packages/react-components/src/components/currency/CurrencyWithCoinMark.tsx b/sdk/typescript/packages/react-components/src/components/currency/CurrencyWithCoinMark.tsx similarity index 100% rename from ts-packages/react-components/src/components/currency/CurrencyWithCoinMark.tsx rename to sdk/typescript/packages/react-components/src/components/currency/CurrencyWithCoinMark.tsx diff --git a/ts-packages/react-components/src/components/link/Link.stories.tsx b/sdk/typescript/packages/react-components/src/components/link/Link.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/link/Link.stories.tsx rename to sdk/typescript/packages/react-components/src/components/link/Link.stories.tsx diff --git a/ts-packages/react-components/src/components/link/Link.tsx b/sdk/typescript/packages/react-components/src/components/link/Link.tsx similarity index 100% rename from ts-packages/react-components/src/components/link/Link.tsx rename to sdk/typescript/packages/react-components/src/components/link/Link.tsx diff --git a/ts-packages/react-components/src/components/logo/Logo.stories.tsx b/sdk/typescript/packages/react-components/src/components/logo/Logo.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/logo/Logo.stories.tsx rename to sdk/typescript/packages/react-components/src/components/logo/Logo.stories.tsx diff --git a/ts-packages/react-components/src/components/logo/LogoProps.ts b/sdk/typescript/packages/react-components/src/components/logo/LogoProps.ts similarity index 100% rename from ts-packages/react-components/src/components/logo/LogoProps.ts rename to sdk/typescript/packages/react-components/src/components/logo/LogoProps.ts diff --git a/ts-packages/react-components/src/components/logo/NymIcon.tsx b/sdk/typescript/packages/react-components/src/components/logo/NymIcon.tsx similarity index 100% rename from ts-packages/react-components/src/components/logo/NymIcon.tsx rename to sdk/typescript/packages/react-components/src/components/logo/NymIcon.tsx diff --git a/ts-packages/react-components/src/components/logo/NymLogo.tsx b/sdk/typescript/packages/react-components/src/components/logo/NymLogo.tsx similarity index 100% rename from ts-packages/react-components/src/components/logo/NymLogo.tsx rename to sdk/typescript/packages/react-components/src/components/logo/NymLogo.tsx diff --git a/ts-packages/react-components/src/components/logo/NymLogoBW.tsx b/sdk/typescript/packages/react-components/src/components/logo/NymLogoBW.tsx similarity index 100% rename from ts-packages/react-components/src/components/logo/NymLogoBW.tsx rename to sdk/typescript/packages/react-components/src/components/logo/NymLogoBW.tsx diff --git a/ts-packages/react-components/src/components/logo/NymWordmark.tsx b/sdk/typescript/packages/react-components/src/components/logo/NymWordmark.tsx similarity index 100% rename from ts-packages/react-components/src/components/logo/NymWordmark.tsx rename to sdk/typescript/packages/react-components/src/components/logo/NymWordmark.tsx diff --git a/ts-packages/react-components/src/components/mixnodes/IdentityKeyFormField.stories.tsx b/sdk/typescript/packages/react-components/src/components/mixnodes/IdentityKeyFormField.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/mixnodes/IdentityKeyFormField.stories.tsx rename to sdk/typescript/packages/react-components/src/components/mixnodes/IdentityKeyFormField.stories.tsx diff --git a/ts-packages/react-components/src/components/mixnodes/IdentityKeyFormField.tsx b/sdk/typescript/packages/react-components/src/components/mixnodes/IdentityKeyFormField.tsx similarity index 100% rename from ts-packages/react-components/src/components/mixnodes/IdentityKeyFormField.tsx rename to sdk/typescript/packages/react-components/src/components/mixnodes/IdentityKeyFormField.tsx diff --git a/ts-packages/react-components/src/components/networks/NetworkSelector.stories.tsx b/sdk/typescript/packages/react-components/src/components/networks/NetworkSelector.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/networks/NetworkSelector.stories.tsx rename to sdk/typescript/packages/react-components/src/components/networks/NetworkSelector.stories.tsx diff --git a/ts-packages/react-components/src/components/networks/NetworkSelector.tsx b/sdk/typescript/packages/react-components/src/components/networks/NetworkSelector.tsx similarity index 100% rename from ts-packages/react-components/src/components/networks/NetworkSelector.tsx rename to sdk/typescript/packages/react-components/src/components/networks/NetworkSelector.tsx diff --git a/ts-packages/react-components/src/components/password-strength/PasswordStrength.tsx b/sdk/typescript/packages/react-components/src/components/password-strength/PasswordStrength.tsx similarity index 100% rename from ts-packages/react-components/src/components/password-strength/PasswordStrength.tsx rename to sdk/typescript/packages/react-components/src/components/password-strength/PasswordStrength.tsx diff --git a/ts-packages/react-components/src/components/textfields/Mnemonic.tsx b/sdk/typescript/packages/react-components/src/components/textfields/Mnemonic.tsx similarity index 100% rename from ts-packages/react-components/src/components/textfields/Mnemonic.tsx rename to sdk/typescript/packages/react-components/src/components/textfields/Mnemonic.tsx diff --git a/ts-packages/react-components/src/components/textfields/Password.tsx b/sdk/typescript/packages/react-components/src/components/textfields/Password.tsx similarity index 100% rename from ts-packages/react-components/src/components/textfields/Password.tsx rename to sdk/typescript/packages/react-components/src/components/textfields/Password.tsx diff --git a/ts-packages/react-components/src/components/tooltip/Tooltip.stories.tsx b/sdk/typescript/packages/react-components/src/components/tooltip/Tooltip.stories.tsx similarity index 100% rename from ts-packages/react-components/src/components/tooltip/Tooltip.stories.tsx rename to sdk/typescript/packages/react-components/src/components/tooltip/Tooltip.stories.tsx diff --git a/ts-packages/react-components/src/components/tooltip/Tooltip.tsx b/sdk/typescript/packages/react-components/src/components/tooltip/Tooltip.tsx similarity index 100% rename from ts-packages/react-components/src/components/tooltip/Tooltip.tsx rename to sdk/typescript/packages/react-components/src/components/tooltip/Tooltip.tsx diff --git a/ts-packages/react-components/src/components/warnings/Error.tsx b/sdk/typescript/packages/react-components/src/components/warnings/Error.tsx similarity index 100% rename from ts-packages/react-components/src/components/warnings/Error.tsx rename to sdk/typescript/packages/react-components/src/components/warnings/Error.tsx diff --git a/ts-packages/react-components/src/hooks/useIsMounted.ts b/sdk/typescript/packages/react-components/src/hooks/useIsMounted.ts similarity index 100% rename from ts-packages/react-components/src/hooks/useIsMounted.ts rename to sdk/typescript/packages/react-components/src/hooks/useIsMounted.ts diff --git a/ts-packages/react-components/src/index.ts b/sdk/typescript/packages/react-components/src/index.ts similarity index 100% rename from ts-packages/react-components/src/index.ts rename to sdk/typescript/packages/react-components/src/index.ts diff --git a/ts-packages/react-components/src/playground/Playground.tsx b/sdk/typescript/packages/react-components/src/playground/Playground.tsx similarity index 100% rename from ts-packages/react-components/src/playground/Playground.tsx rename to sdk/typescript/packages/react-components/src/playground/Playground.tsx diff --git a/ts-packages/react-components/src/playground/buttons.tsx b/sdk/typescript/packages/react-components/src/playground/buttons.tsx similarity index 100% rename from ts-packages/react-components/src/playground/buttons.tsx rename to sdk/typescript/packages/react-components/src/playground/buttons.tsx diff --git a/ts-packages/react-components/src/playground/checkboxes.tsx b/sdk/typescript/packages/react-components/src/playground/checkboxes.tsx similarity index 100% rename from ts-packages/react-components/src/playground/checkboxes.tsx rename to sdk/typescript/packages/react-components/src/playground/checkboxes.tsx diff --git a/ts-packages/react-components/src/playground/fonts.tsx b/sdk/typescript/packages/react-components/src/playground/fonts.tsx similarity index 100% rename from ts-packages/react-components/src/playground/fonts.tsx rename to sdk/typescript/packages/react-components/src/playground/fonts.tsx diff --git a/ts-packages/react-components/src/playground/switches.tsx b/sdk/typescript/packages/react-components/src/playground/switches.tsx similarity index 100% rename from ts-packages/react-components/src/playground/switches.tsx rename to sdk/typescript/packages/react-components/src/playground/switches.tsx diff --git a/ts-packages/react-components/src/playground/theme.tsx b/sdk/typescript/packages/react-components/src/playground/theme.tsx similarity index 100% rename from ts-packages/react-components/src/playground/theme.tsx rename to sdk/typescript/packages/react-components/src/playground/theme.tsx diff --git a/ts-packages/react-components/src/playground/theme/MUIThemeExplorer.tsx b/sdk/typescript/packages/react-components/src/playground/theme/MUIThemeExplorer.tsx similarity index 100% rename from ts-packages/react-components/src/playground/theme/MUIThemeExplorer.tsx rename to sdk/typescript/packages/react-components/src/playground/theme/MUIThemeExplorer.tsx diff --git a/ts-packages/react-components/src/playground/theme/PaletteSwatches.tsx b/sdk/typescript/packages/react-components/src/playground/theme/PaletteSwatches.tsx similarity index 100% rename from ts-packages/react-components/src/playground/theme/PaletteSwatches.tsx rename to sdk/typescript/packages/react-components/src/playground/theme/PaletteSwatches.tsx diff --git a/ts-packages/react-components/src/stories/Introduction.stories.mdx b/sdk/typescript/packages/react-components/src/stories/Introduction.stories.mdx similarity index 100% rename from ts-packages/react-components/src/stories/Introduction.stories.mdx rename to sdk/typescript/packages/react-components/src/stories/Introduction.stories.mdx diff --git a/ts-packages/react-components/src/stories/Playground.stories.tsx b/sdk/typescript/packages/react-components/src/stories/Playground.stories.tsx similarity index 100% rename from ts-packages/react-components/src/stories/Playground.stories.tsx rename to sdk/typescript/packages/react-components/src/stories/Playground.stories.tsx diff --git a/ts-packages/react-webpack-with-theme-example/src/theme/mui-theme.d.ts b/sdk/typescript/packages/react-components/src/theme/mui-theme.d.ts similarity index 100% rename from ts-packages/react-webpack-with-theme-example/src/theme/mui-theme.d.ts rename to sdk/typescript/packages/react-components/src/theme/mui-theme.d.ts diff --git a/sdk/typescript/packages/react-components/src/typings/FC.d.ts b/sdk/typescript/packages/react-components/src/typings/FC.d.ts new file mode 100644 index 0000000000..08ebdfa298 --- /dev/null +++ b/sdk/typescript/packages/react-components/src/typings/FC.d.ts @@ -0,0 +1 @@ +declare type FCWithChildren

    = React.FC>; diff --git a/ts-packages/react-components/src/typings/jpeg.d.ts b/sdk/typescript/packages/react-components/src/typings/jpeg.d.ts similarity index 100% rename from ts-packages/react-components/src/typings/jpeg.d.ts rename to sdk/typescript/packages/react-components/src/typings/jpeg.d.ts diff --git a/ts-packages/react-components/src/typings/json.d.ts b/sdk/typescript/packages/react-components/src/typings/json.d.ts similarity index 100% rename from ts-packages/react-components/src/typings/json.d.ts rename to sdk/typescript/packages/react-components/src/typings/json.d.ts diff --git a/ts-packages/react-components/src/typings/png.d.ts b/sdk/typescript/packages/react-components/src/typings/png.d.ts similarity index 100% rename from ts-packages/react-components/src/typings/png.d.ts rename to sdk/typescript/packages/react-components/src/typings/png.d.ts diff --git a/ts-packages/react-components/src/typings/svg.d.ts b/sdk/typescript/packages/react-components/src/typings/svg.d.ts similarity index 100% rename from ts-packages/react-components/src/typings/svg.d.ts rename to sdk/typescript/packages/react-components/src/typings/svg.d.ts diff --git a/ts-packages/react-components/tsconfig.eslint.json b/sdk/typescript/packages/react-components/tsconfig.eslint.json similarity index 100% rename from ts-packages/react-components/tsconfig.eslint.json rename to sdk/typescript/packages/react-components/tsconfig.eslint.json diff --git a/ts-packages/react-components/tsconfig.json b/sdk/typescript/packages/react-components/tsconfig.json similarity index 88% rename from ts-packages/react-components/tsconfig.json rename to sdk/typescript/packages/react-components/tsconfig.json index f35b798197..89d869a823 100644 --- a/ts-packages/react-components/tsconfig.json +++ b/sdk/typescript/packages/react-components/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../tsconfig.json", + "extends": "../../tsconfig.json", "compilerOptions": { "jsx": "react-jsx", "noEmit": true, diff --git a/sdk/typescript/packages/sdk-react/.eslintrc.json b/sdk/typescript/packages/sdk-react/.eslintrc.json new file mode 100644 index 0000000000..83e95d88a7 --- /dev/null +++ b/sdk/typescript/packages/sdk-react/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "parserOptions": { + "project": "./tsconfig.eslint.json" + } +} diff --git a/sdk/typescript/packages/sdk-react/README.md b/sdk/typescript/packages/sdk-react/README.md new file mode 100644 index 0000000000..ebc7451f0f --- /dev/null +++ b/sdk/typescript/packages/sdk-react/README.md @@ -0,0 +1,7 @@ +# Nym SDK React + +This package provides useful React components to interact with the Nym Mixnet: + +- a provider and hook to send messages over the Mixnet +- a provider and hook to manage Coconut credentials +- a provider and hook to sign and broadcast messages to send to the Nyx blockchain RPC nodes diff --git a/sdk/typescript/packages/sdk-react/package.json b/sdk/typescript/packages/sdk-react/package.json new file mode 100644 index 0000000000..4dcad819d5 --- /dev/null +++ b/sdk/typescript/packages/sdk-react/package.json @@ -0,0 +1,69 @@ +{ + "name": "@nymproject/sdk-react", + "version": "1.2.0-rc.2", + "license": "Apache-2.0", + "author": "Nym Technologies SA", + "files": [ + "dist/**/*" + ], + "browser": "dist/index.js", + "scripts": { + "build": "tsc --noEmit false", + "clean": "rimraf dist", + "lint": "eslint src", + "lint:fix": "eslint src --fix", + "start": "tsc --noEmit true -w", + "storybook": "start-storybook -p 6006", + "storybook:build": "build-storybook", + "test": "node --experimental-vm-modules --no-warnings node_modules/jest/bin/jest.js -c=jest.config.mjs --no-cache", + "tsc": "tsc --noEmit true" + }, + "dependencies": { + "@nymproject/sdk": ">=1.2.0-rc.1 || ^1" + }, + "devDependencies": { + "@babel/core": "^7.17.5", + "@nymproject/eslint-config-react-typescript": "^1.0.0", + "@storybook/addon-actions": "^6.5.8", + "@storybook/addon-essentials": "^6.5.8", + "@storybook/addon-interactions": "^6.5.8", + "@storybook/addon-links": "^6.5.8", + "@storybook/builder-webpack5": "^6.5.8", + "@storybook/manager-webpack5": "^6.5.8", + "@storybook/react": "^6.5.15", + "@storybook/testing-library": "^0.0.9", + "@svgr/webpack": "^6.1.1", + "@types/flat": "^5.0.2", + "@types/react": "^18.0.26", + "@types/react-dom": "^18.0.10", + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.13.0", + "babel-loader": "^8.2.3", + "babel-plugin-root-import": "^5.1.0", + "eslint": "^8.10.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-root-import": "^1.0.4", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jest": "^26.1.1", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.29.2", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-storybook": "^0.5.12", + "jest": "^27.1.0", + "prettier": "^2.8.7", + "rimraf": "^3.0.2", + "ts-jest": "^27.0.5", + "tsconfig-paths-webpack-plugin": "^3.5.2", + "typescript": "^4.6.2" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "private": false, + "type": "module", + "types": "./dist/index.d.ts" +} diff --git a/sdk/typescript/packages/sdk-react/src/context/index.tsx b/sdk/typescript/packages/sdk-react/src/context/index.tsx new file mode 100644 index 0000000000..7e66b2c765 --- /dev/null +++ b/sdk/typescript/packages/sdk-react/src/context/index.tsx @@ -0,0 +1 @@ +export * from './mixnet'; diff --git a/sdk/typescript/packages/sdk-react/src/context/mixnet.tsx b/sdk/typescript/packages/sdk-react/src/context/mixnet.tsx new file mode 100644 index 0000000000..8698f4c1bf --- /dev/null +++ b/sdk/typescript/packages/sdk-react/src/context/mixnet.tsx @@ -0,0 +1,109 @@ +import * as React from 'react'; +import { createNymMixnetClient, Events, MimeTypes, NymClientConfig, NymMixnetClient } from '@nymproject/sdk'; + +export interface BinaryMessageHeaders { + filename: string; + mimeType: string; +} + +export const parseBinaryMessageHeaders = (headers: string): BinaryMessageHeaders => + JSON.parse(headers) as BinaryMessageHeaders; + +interface State { + // data + isReady: boolean; + address?: string; + events?: Events; + + // methods + sendTextMessage: (args: { payload: string; recipient: string }) => Promise; + sendBinaryMessage: (args: { payload: Uint8Array; recipient: string; headers: BinaryMessageHeaders }) => Promise; +} + +const MixnetContext = React.createContext(undefined); + +export const useMixnetContext = (): State => { + const context = React.useContext(MixnetContext); + + if (!context) { + throw new Error('Please include a `import { MixnetContextProvider } from "./context"` before using this hook'); + } + + return context; +}; + +export const MixnetContextProvider: FCWithChildren<{ + clientId?: string; + nymApiUrl?: string; + preferredGatewayIdentityKey?: string; +}> = ({ + clientId = 'MyNymClientId', + nymApiUrl = 'https://validator.nymtech.net/api', + preferredGatewayIdentityKey = 'E3mvZTHQCdBvhfr178Swx9g4QG3kkRUun7YnToLMcMbM', // this gateway has WSS + children, +}) => { + const [isReady, setReady] = React.useState(false); + const [address, setAddress] = React.useState(); + + const nym = React.useRef(null); + + React.useEffect(() => { + // on mount of the provider, create the client + (async () => { + nym.current = await createNymMixnetClient(); + if (nym.current?.events) { + nym.current.events.subscribeToConnected((e) => { + setAddress(e.args.address); + setReady(true); + }); + } + if (nym.current?.client) { + nym.current.client + .start({ + clientId, + nymApiUrl, + preferredGatewayIdentityKey, + }) + .catch((e) => console.error('Failed to start client', e)); + } + })(); + + // + }, []); + + const sendTextMessage = async (args: { payload: string; recipient: string }) => { + if (!nym.current?.client) { + console.error('Nym client has not initialised. Please wrap in useEffect on `isReady` prop of this context.'); + return; + } + await nym.current.client.send({ + recipient: args.recipient, + payload: { message: args.payload, mimeType: MimeTypes.TextPlain }, + }); + }; + + const sendBinaryMessage = async (args: { payload: Uint8Array; recipient: string; headers: BinaryMessageHeaders }) => { + if (!nym.current?.client) { + console.error('Nym client has not initialised. Please wrap in useEffect on `isReady` prop of this context.'); + return; + } + // convert headers to JSON + await nym.current.client.send({ + recipient: args.recipient, + payload: { message: args.payload, mimeType: 'application/octet-stream', headers: JSON.stringify(args.headers) }, + }); + }; + + const value = React.useMemo( + () => ({ + isReady, + events: nym.current?.events, + address, + sendTextMessage, + sendBinaryMessage, + }), + [isReady, nym.current, address], + ); + + return {children}; +}; diff --git a/sdk/typescript/packages/sdk-react/src/index.ts b/sdk/typescript/packages/sdk-react/src/index.ts new file mode 100644 index 0000000000..c38e8e8215 --- /dev/null +++ b/sdk/typescript/packages/sdk-react/src/index.ts @@ -0,0 +1 @@ +export * from './context'; diff --git a/sdk/typescript/packages/sdk-react/src/typings/FC.d.ts b/sdk/typescript/packages/sdk-react/src/typings/FC.d.ts new file mode 100644 index 0000000000..08ebdfa298 --- /dev/null +++ b/sdk/typescript/packages/sdk-react/src/typings/FC.d.ts @@ -0,0 +1 @@ +declare type FCWithChildren

    = React.FC>; diff --git a/sdk/typescript/packages/sdk-react/tsconfig.eslint.json b/sdk/typescript/packages/sdk-react/tsconfig.eslint.json new file mode 100644 index 0000000000..3421e6f3c7 --- /dev/null +++ b/sdk/typescript/packages/sdk-react/tsconfig.eslint.json @@ -0,0 +1,19 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "noEmit": true + }, + "include": [ + ".storybook/*.js", + "src/**/*.js", + "src/**/*.jsx", + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.stories.*", + ], + "exclude": [ + "node_modules", + "dist" + ] +} diff --git a/sdk/typescript/packages/sdk-react/tsconfig.json b/sdk/typescript/packages/sdk-react/tsconfig.json new file mode 100644 index 0000000000..89d869a823 --- /dev/null +++ b/sdk/typescript/packages/sdk-react/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "noEmit": true, + "outDir": "./dist", + "declarationDir": "./dist" + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx" + ], + "exclude": [ + "node_modules", + "dist", + "src/stories", + "**/*.stories.*" + ] +} diff --git a/sdk/typescript/packages/sdk/.eslintrc.json b/sdk/typescript/packages/sdk/.eslintrc.json new file mode 100644 index 0000000000..83e95d88a7 --- /dev/null +++ b/sdk/typescript/packages/sdk/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "parserOptions": { + "project": "./tsconfig.eslint.json" + } +} diff --git a/sdk/typescript/packages/sdk/.gitignore b/sdk/typescript/packages/sdk/.gitignore index ed481bbc45..fbdf512d0d 100644 --- a/sdk/typescript/packages/sdk/.gitignore +++ b/sdk/typescript/packages/sdk/.gitignore @@ -1,3 +1,2 @@ src/mixnet/wasm/worker.js -src/mixnet/node-tester/worker.js -docs/ \ No newline at end of file +docs/ diff --git a/sdk/typescript/packages/sdk/README-CommonJS-full-fat.md b/sdk/typescript/packages/sdk/README-CommonJS-full-fat.md new file mode 100644 index 0000000000..8d5582a164 --- /dev/null +++ b/sdk/typescript/packages/sdk/README-CommonJS-full-fat.md @@ -0,0 +1,62 @@ +# Nym SDK (Typescript) CommonJS and ES5 + +``` +⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠ +⚠ WARNING: ES5 & CommonJS with inline blobs ⚠ +⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠ +``` + +### Please note: this is a CommonJS package targeting ES5. Use this for older projects or when you have bundling issues. It includes inline blobs that will interfere with CSPs that disallow them. + +If you are looking for an ESM version please use https://www.npmjs.com/package/@nymproject/sdk. + +---------------------------- + +The Nym SDK for Typescript will get you creating apps that can use the Nym Mixnet and Coconut credentials quickly. + +## TL;DR + +Include the SDK in your project: + +``` +npm install @nymproject/sdk-commonjs +``` + +Open a connection to a Gateway on the Nym Mixnet: + +```ts +import { createNymMixnetClient } from '@nymproject/sdk-commonjs'; + +const main = async () => { + const nym = await createNymMixnetClient(); + + const nymApiUrl = 'https://validator.nymtech.net/api'; + + // show message payload content when received + nym.events.subscribeToTextMessageReceivedEvent((e) => { + console.log('Got a message: ', e.args.payload); + }); + + // start the client and connect to a gateway + await nym.client.start({ + clientId: 'My awesome client', + nymApiUrl, + }); + + // send a message to yourself + const payload = 'Hello mixnet'; + const recipient = nym.client.selfAddress(); + nym.client.send({ payload, recipient }); + +}; +``` + +This will start the WASM client on a worker thread, so that your code can stay nice and snappy. + +Send a message to another user (you will need to know their address at a Gateway): + +```ts + const payload = 'Hello mixnet'; + const recipient = '<< RECIPIENT ADDRESS GOES HERE >>'; + await nym.client.send({ payload, recipient }); +``` diff --git a/sdk/typescript/packages/sdk/README-full-fat.md b/sdk/typescript/packages/sdk/README-full-fat.md new file mode 100644 index 0000000000..5abd214313 --- /dev/null +++ b/sdk/typescript/packages/sdk/README-full-fat.md @@ -0,0 +1,62 @@ +# Nym SDK (Typescript) + +``` +⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠ +⚠ WARNING: ESM with inline blobs ⚠ +⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠ +``` + +### Please note: this is a CommonJS package targeting ES5. Use this for older projects or when you have bundling issues. It includes inline blobs that will interfere with CSPs that disallow them. + +If you are looking for an ESM version please use https://www.npmjs.com/package/@nymproject/sdk. + +---------------------------- + +The Nym SDK for Typescript will get you creating apps that can use the Nym Mixnet and Coconut credentials quickly. + +## TL;DR + +Include the SDK in your project: + +``` +npm install @nymproject/sdk +``` + +Open a connection to a Gateway on the Nym Mixnet: + +```ts +import { createNymMixnetClient } from '@nymproject/sdk'; + +const main = async () => { + const nym = await createNymMixnetClient(); + + const nymApiUrl = 'https://validator.nymtech.net/api'; + + // show message payload content when received + nym.events.subscribeToTextMessageReceivedEvent((e) => { + console.log('Got a message: ', e.args.payload); + }); + + // start the client and connect to a gateway + await nym.client.start({ + clientId: 'My awesome client', + nymApiUrl, + }); + + // send a message to yourself + const payload = 'Hello mixnet'; + const recipient = nym.client.selfAddress(); + nym.client.send({ payload, recipient }); + +}; +``` + +This will start the WASM client on a worker thread, so that your code can stay nice and snappy. + +Send a message to another user (you will need to know their address at a Gateway): + +```ts + const payload = 'Hello mixnet'; + const recipient = '<< RECIPIENT ADDRESS GOES HERE >>'; + await nym.client.send({ payload, recipient }); +``` diff --git a/sdk/typescript/packages/sdk/package.json b/sdk/typescript/packages/sdk/package.json index 17d2c9d116..b6aa91c84b 100644 --- a/sdk/typescript/packages/sdk/package.json +++ b/sdk/typescript/packages/sdk/package.json @@ -1,45 +1,37 @@ { "name": "@nymproject/sdk", - "version": "1.1.9-rc0", + "version": "1.2.0-rc.2", "license": "Apache-2.0", "author": "Nym Technologies SA", - "type": "module", - "browser": "dist/esm/index.js", - "main": "dist/cjs/index.js", - "types": "./dist/esm/index.d.ts", "files": [ "dist/esm/worker.js", "dist/cjs/worker.js", "dist/**/*" ], + "main": "dist/cjs/index.js", + "browser": "dist/esm/index.js", "scripts": { - "start": "tsc -w", + "build": "scripts/build-prod.sh", + "build:dev": "scripts/build.sh", + "build:dev:esm": "scripts/build-dev-esm.sh", + "build:worker": "rollup -c rollup-worker.config.mjs", "clean": "rimraf dist", - "typecheck": "tsc --noEmit true", + "docs:dev": "run-p docs:watch docs:serve ", + "docs:generate": "typedoc", + "docs:generate:prod": "typedoc --basePath ./docs/tsdoc/nymproject/sdk/", + "docs:prod:build": "scripts/build-prod-docs-collect.sh", + "docs:serve": "reload -b -d ./docs -p 3000", + "docs:watch": "nodemon --ext ts --watch './src/**/*' --watch './typedoc.json' --exec \"yarn docs:generate\"", "lint": "eslint src", "lint:fix": "eslint src --fix", - "build:dependencies": "run-s build:dependencies:nym-client-wasm build:dependencies:ts-packages", - "build:dependencies:ts-packages": "cd ../../../.. && yarn && yarn build", - "build:dependencies:nym-client-wasm": "../nym-client-wasm/scripts/build.sh", - "prebuild": "yarn build:dependencies", - "build": "yarn build:only-this", - "build:only-this": "scripts/build-prod.sh", - "prebuild:dev": "yarn build:dependencies", - "build:dev": "yarn build:dev:only-this", - "build:dev:only-this": "scripts/build.sh", - "build:local": "run-s build:dependencies:nym-client-wasm build:dev:only-this", - "docs:watch": "nodemon --ext ts --watch './src/**/*' --watch './typedoc.json' --exec \"yarn docs:generate\"", - "docs:generate": "typedoc", - "docs:serve": "reload -b -d ./docs -p 3000", - "docs:dev": "run-p docs:watch docs:serve ", - "test": "node --experimental-vm-modules --no-warnings node_modules/jest/bin/jest.js -c=jest.config.mjs --no-cache" + "start": "tsc -w", + "start:dev": "nodemon --watch src -e ts,json --exec 'yarn build:dev:esm'", + "test": "node --experimental-vm-modules --no-warnings node_modules/jest/bin/jest.js -c=jest.config.mjs --no-cache", + "tsc": "tsc --noEmit true" }, "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@nymproject/nym-client-wasm": "1", - "comlink": "^4.3.1", - "lerna": "^6.6.2", - "node-gyp": "^9.3.1" + "@nymproject/nym-client-wasm": ">=1.2.0-rc.0 || ^1", + "comlink": "^4.3.1" }, "devDependencies": { "@babel/core": "^7.15.0", @@ -55,6 +47,7 @@ "@rollup/plugin-replace": "^5.0.2", "@rollup/plugin-terser": "^0.2.1", "@rollup/plugin-typescript": "^10.0.1", + "@rollup/plugin-url": "^8.0.1", "@rollup/plugin-wasm": "^6.1.1", "@types/jest": "^27.0.1", "@types/node": "^16.7.13", @@ -79,7 +72,11 @@ "rollup-plugin-base64": "^1.0.1", "rollup-plugin-web-worker-loader": "^1.6.1", "ts-jest": "^29.1.0", + "ts-loader": "^9.4.2", "typedoc": "^0.24.8", "typescript": "^4.8.4" - } + }, + "private": false, + "type": "module", + "types": "./dist/esm/index.d.ts" } diff --git a/sdk/typescript/packages/sdk/rollup-cjs-full-fat.config.mjs b/sdk/typescript/packages/sdk/rollup-cjs-full-fat.config.mjs new file mode 100644 index 0000000000..d4c6e39e99 --- /dev/null +++ b/sdk/typescript/packages/sdk/rollup-cjs-full-fat.config.mjs @@ -0,0 +1,8 @@ +import { getConfig } from './rollup/cjs.mjs'; + +export default { + ...getConfig({ + inline: true, + outputDir: 'dist/cjs-full-fat', + }), +}; diff --git a/sdk/typescript/packages/sdk/rollup-cjs.config.mjs b/sdk/typescript/packages/sdk/rollup-cjs.config.mjs index 9f6d102d3d..a12e5bdb7a 100644 --- a/sdk/typescript/packages/sdk/rollup-cjs.config.mjs +++ b/sdk/typescript/packages/sdk/rollup-cjs.config.mjs @@ -1,23 +1,5 @@ -import typescript from '@rollup/plugin-typescript'; -import resolve from '@rollup/plugin-node-resolve'; -import { wasm } from '@rollup/plugin-wasm'; -import webWorkerLoader from 'rollup-plugin-web-worker-loader'; - -const extensions = ['.js', '.jsx', '.ts', '.tsx']; +import { getConfig } from './rollup/cjs.mjs'; export default { - input: 'src/index.ts', - output: { - dir: 'dist/cjs', - format: 'cjs', - }, - plugins: [ - webWorkerLoader({ targetPlatform: 'browser', inline: true }), - resolve({ extensions }), - wasm({ maxFileSize: 10000000, targetEnv: 'browser' }), - typescript({ - compilerOptions: { outDir: 'dist/cjs', target: 'es5' }, - exclude: ['mixnet/wasm/worker.ts', 'mixnet/node-tester/worker.ts'], - }), - ], + ...getConfig({ inline: false }), }; diff --git a/sdk/typescript/packages/sdk/rollup-esm-full-fat.config.mjs b/sdk/typescript/packages/sdk/rollup-esm-full-fat.config.mjs new file mode 100644 index 0000000000..ea80b1997b --- /dev/null +++ b/sdk/typescript/packages/sdk/rollup-esm-full-fat.config.mjs @@ -0,0 +1,8 @@ +import { getConfig } from './rollup/esm.mjs'; + +export default { + ...getConfig({ + inline: true, + outputDir: 'dist/esm-full-fat', + }), +}; diff --git a/sdk/typescript/packages/sdk/rollup-esm.config.mjs b/sdk/typescript/packages/sdk/rollup-esm.config.mjs index 3ad4c148fc..fa8d42b2ea 100644 --- a/sdk/typescript/packages/sdk/rollup-esm.config.mjs +++ b/sdk/typescript/packages/sdk/rollup-esm.config.mjs @@ -1,21 +1,7 @@ -import typescript from '@rollup/plugin-typescript'; -import resolve from '@rollup/plugin-node-resolve'; -import webWorkerLoader from 'rollup-plugin-web-worker-loader'; - -const extensions = ['.js', '.jsx', '.ts', '.tsx']; +import { getConfig } from './rollup/esm.mjs'; export default { - input: 'src/index.ts', - output: { - dir: 'dist/esm', - format: 'es', - }, - plugins: [ - webWorkerLoader({ targetPlatform: 'browser', inline: true }), - resolve({ extensions }), - typescript({ - exclude: ['mixnet/wasm/worker.ts', 'mixnet/node-tester/worker.ts'], - compilerOptions: { outDir: 'dist/esm' }, - }), - ], + ...getConfig({ + inline: false, + }), }; diff --git a/sdk/typescript/packages/sdk/rollup-worker.config.mjs b/sdk/typescript/packages/sdk/rollup-worker.config.mjs index e49bc592d4..61aab0b862 100644 --- a/sdk/typescript/packages/sdk/rollup-worker.config.mjs +++ b/sdk/typescript/packages/sdk/rollup-worker.config.mjs @@ -3,9 +3,7 @@ import resolve from '@rollup/plugin-node-resolve'; import { wasm } from '@rollup/plugin-wasm'; import replace from '@rollup/plugin-replace'; -const extensions = [ - '.js', '.jsx', '.ts', '.tsx', -]; +const extensions = ['.js', '.jsx', '.ts', '.tsx']; export default { input: 'src/mixnet/wasm/worker.ts', @@ -17,7 +15,7 @@ export default { resolve({ extensions }), // this is some nasty monkey patching that removes the WASM URL (because it is handled by the `wasm` plugin) replace({ - values: { 'input = new URL(\'nym_client_wasm_bg.wasm\', import.meta.url);': 'input = undefined;' }, + values: { "input = new URL('nym_client_wasm_bg.wasm', import.meta.url);": 'input = undefined;' }, delimiters: ['', ''], preventAssignment: true, }), diff --git a/sdk/typescript/packages/sdk/rollup/cjs.mjs b/sdk/typescript/packages/sdk/rollup/cjs.mjs new file mode 100644 index 0000000000..b08f3e0f0d --- /dev/null +++ b/sdk/typescript/packages/sdk/rollup/cjs.mjs @@ -0,0 +1,30 @@ +import typescript from '@rollup/plugin-typescript'; +import resolve from '@rollup/plugin-node-resolve'; +import { wasm } from '@rollup/plugin-wasm'; +import webWorkerLoader from 'rollup-plugin-web-worker-loader'; + +const extensions = ['.js', '.jsx', '.ts', '.tsx']; + +/** + * Gets the config for bundling the package as a CommonJS module. + * + * @param opts Options: + * `{ inline: boolean }` - set inline to true to inline the web worker in the main bundle + * `{ outputDir: string }` - override the destination + */ +export const getConfig = (opts) => ({ + input: 'src/index.ts', + output: { + dir: opts.outputDir || 'dist/cjs', + format: 'cjs', + }, + plugins: [ + webWorkerLoader({ targetPlatform: 'browser', inline: opts.inline }), // the inline param is used here + resolve({ extensions }), + wasm({ maxFileSize: 10000000, targetEnv: 'browser' }), + typescript({ + compilerOptions: { outDir: opts.outputDir || 'dist/cjs', target: 'es5' }, + exclude: ['mixnet/wasm/worker.ts'], + }), + ], +}); diff --git a/sdk/typescript/packages/sdk/rollup/esm.mjs b/sdk/typescript/packages/sdk/rollup/esm.mjs new file mode 100644 index 0000000000..29cd641793 --- /dev/null +++ b/sdk/typescript/packages/sdk/rollup/esm.mjs @@ -0,0 +1,28 @@ +import typescript from '@rollup/plugin-typescript'; +import resolve from '@rollup/plugin-node-resolve'; +import webWorkerLoader from 'rollup-plugin-web-worker-loader'; + +const extensions = ['.js', '.jsx', '.ts', '.tsx']; + +/** + * Gets the config for bundling the package as an ES Module. + * + * @param opts Options: + * `{ inline: boolean }` - set inline to true to inline the web worker in the main bundle + * `{ outputDir: string }` - override the destination * + */ +export const getConfig = (opts) => ({ + input: 'src/index.ts', + output: { + dir: opts.outputDir || 'dist/esm', + format: 'es', + }, + plugins: [ + webWorkerLoader({ targetPlatform: 'browser', inline: opts.inline }), // the inline param is used here + resolve({ extensions }), + typescript({ + exclude: ['mixnet/wasm/worker.ts'], + compilerOptions: { outDir: opts.outputDir || 'dist/esm' }, + }), + ], +}); diff --git a/sdk/typescript/packages/sdk/scripts/build-dev-esm.sh b/sdk/typescript/packages/sdk/scripts/build-dev-esm.sh new file mode 100755 index 0000000000..d7ce2b9af6 --- /dev/null +++ b/sdk/typescript/packages/sdk/scripts/build-dev-esm.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +#------------------------------------------------------- +# WEB WORKER (SDK WASM) +#------------------------------------------------------- +# The web worker needs to be bundled because the WASM bundle needs to be loaded synchronously and all dependencies +# must be included in the worker script (because it is not loaded as an ES Module) + +# build the worker +rollup -c rollup-worker.config.mjs + +# move it next to the Typescript `src/index.ts` so it can be inlined by rollup +cp dist/worker.js src/worker/worker.js || true +rm dist/worker.js || true + +#------------------------------------------------------- +# ESM +#------------------------------------------------------- + +# build the SDK as a ESM bundle +rollup -c rollup-esm.config.mjs + +#------------------------------------------------------- +# CLEAN UP +#------------------------------------------------------- + +#rm -rf dist/esm/worker + + diff --git a/sdk/typescript/packages/sdk/scripts/build-prod-docs-collect.sh b/sdk/typescript/packages/sdk/scripts/build-prod-docs-collect.sh new file mode 100755 index 0000000000..9cd137bcde --- /dev/null +++ b/sdk/typescript/packages/sdk/scripts/build-prod-docs-collect.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +rm -rf ../../../../dist/ts/docs/tsdoc/nymproject/sdk || true + +# run the build +yarn docs:generate:prod + +# move the output outside of the yarn/npm workspaces +mkdir -p ../../../../dist/ts/docs/tsdoc/nymproject +mv docs ../../../../dist/ts/docs/tsdoc/nymproject/sdk + +echo "Output can be found in:" +realpath ../../../../dist/ts/docs/tsdoc/nymproject/sdk diff --git a/sdk/typescript/packages/sdk/scripts/build-prod.sh b/sdk/typescript/packages/sdk/scripts/build-prod.sh index f40998f1cc..1566948fd2 100755 --- a/sdk/typescript/packages/sdk/scripts/build-prod.sh +++ b/sdk/typescript/packages/sdk/scripts/build-prod.sh @@ -5,16 +5,16 @@ set -o nounset set -o pipefail rm -rf dist || true -rm -rf ../../../../dist || true +rm -rf ../../../../dist/ts/sdk/sdk || true # run the build scripts/build.sh node scripts/buildPackageJson.mjs # move the output outside of the yarn/npm workspaces -mkdir -p ../../../../dist -mv dist ../../../../dist -mv ../../../../dist/dist ../../../../dist/sdk +mkdir -p ../../../../dist/ts/sdk +mv dist ../../../../dist/ts/sdk +mv ../../../../dist/ts/sdk/dist ../../../../dist/ts/sdk/sdk echo "Output can be found in:" -realpath ../../../../dist/sdk +realpath ../../../../dist/ts/sdk/sdk diff --git a/sdk/typescript/packages/sdk/scripts/build.sh b/sdk/typescript/packages/sdk/scripts/build.sh index 05800b5c9d..bde7b47bdc 100755 --- a/sdk/typescript/packages/sdk/scripts/build.sh +++ b/sdk/typescript/packages/sdk/scripts/build.sh @@ -19,19 +19,6 @@ rollup -c rollup-worker.config.mjs rm -f src/mixnet/wasm/worker.js mv dist/worker.js src/mixnet/wasm/worker.js -#------------------------------------------------------- -# WEB WORKER (Node tester) -#------------------------------------------------------- -# The web worker needs to be bundled because the WASM bundle needs to be loaded synchronously and all dependencies -# must be included in the worker script (because it is not loaded as an ES Module) - -# build the worker -rollup -c rollup-node-tester-worker.config.mjs - -# move it next to the Typescript `mixnet/node-tester/index.ts` so it can be inlined by rollup -rm -f src/mixnet/node-tester/worker.js -mv dist/worker.js src/mixnet/node-tester/worker.js - #------------------------------------------------------- # ESM #------------------------------------------------------- @@ -49,11 +36,20 @@ rollup -c rollup-esm.config.mjs rollup -c rollup-cjs.config.mjs #------------------------------------------------------- -# FULL FAT +# ESM (full-fat) #------------------------------------------------------- -# build the SDK as a ESM bundle -rollup -c rollup-full-fat.config.mjs +# build the SDK as a ESM bundle (with worker inlined as a blob) +rollup -c rollup-esm-full-fat.config.mjs + +#------------------------------------------------------- +# COMMON JS (full-fat) +#------------------------------------------------------- +# Some old build systems cannot fully handle ESM or ES2021, so build +# a CommonJS bundle targeting ES5 + +# build the SDK as a CommonJS bundle (with worker inlined as a blob) +rollup -c rollup-cjs-full-fat.config.mjs #------------------------------------------------------- # CLEAN UP @@ -62,5 +58,7 @@ rollup -c rollup-full-fat.config.mjs # copy README cp README.md dist/esm cp README-CommonJS.md dist/cjs/README.md +cp README-full-fat.md dist/esm-full-fat +cp README-CommonJS-full-fat.md dist/cjs-full-fat/README.md diff --git a/sdk/typescript/packages/sdk/scripts/buildPackageJson.mjs b/sdk/typescript/packages/sdk/scripts/buildPackageJson.mjs index 91c9afd1b9..20026e5307 100644 --- a/sdk/typescript/packages/sdk/scripts/buildPackageJson.mjs +++ b/sdk/typescript/packages/sdk/scripts/buildPackageJson.mjs @@ -8,29 +8,20 @@ const browser = 'index.js'; const main = 'index.js'; const types = 'index.d.ts'; -// make a package.json for the CommonJS bundle -const packageJsonCommonJS = { - name: `${json.name}-commonjs`, +const getPackageJson = (type, suffix) => ({ + name: `${json.name}${suffix ? `-${suffix}`: ''}`, version: json.version, license: json.license, author: json.author, - type: 'commonjs', + type, browser, main, types, -}; +}); -// make a package.json for the ESM bundle -const packageJsonESM = { - name: json.name, - version: json.version, - license: json.license, - author: json.author, - type: 'module', - browser, - main, - types, -}; +fs.writeFileSync('dist/cjs/package.json', JSON.stringify(getPackageJson('commonjs', 'commonjs'), null, 2)); +fs.writeFileSync('dist/esm/package.json', JSON.stringify(getPackageJson('module'), null, 2)); + +fs.writeFileSync('dist/cjs-full-fat/package.json', JSON.stringify(getPackageJson('commonjs', 'commonjs-full-fat'), null, 2)); +fs.writeFileSync('dist/esm-full-fat/package.json', JSON.stringify(getPackageJson('module', 'full-fat'), null, 2)); -fs.writeFileSync('dist/cjs/package.json', JSON.stringify(packageJsonCommonJS, null, 2)); -fs.writeFileSync('dist/esm/package.json', JSON.stringify(packageJsonESM, null, 2)); diff --git a/sdk/typescript/packages/sdk/src/mixnet/index.ts b/sdk/typescript/packages/sdk/src/mixnet/index.ts index 2fb66914e6..3c4c661762 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/index.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/index.ts @@ -1,4 +1,2 @@ export * from './wasm'; export * from './wasm/types'; -export * from './node-tester'; -export * from './node-tester/types'; diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/types-from-wasm-pack.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/types-from-wasm-pack.ts deleted file mode 100644 index 25fbba452c..0000000000 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/types-from-wasm-pack.ts +++ /dev/null @@ -1,336 +0,0 @@ -/** - */ -export interface TopologyWasm { - free(): void; - /** - * Specifies whether the client should not refresh the network topology after obtaining - * the first valid instance. - * Supersedes `topology_refresh_rate_ms`. - */ - disable_refreshing: boolean; - /** - * The uniform delay every which clients are querying the directory server - * to try to obtain a compatible network topology to send sphinx packets through. - */ - topology_refresh_rate_ms: bigint; - /** - * During topology refresh, test packets are sent through every single possible network - * path. This timeout determines waiting period until it is decided that the packet - * did not reach its destination. - */ - topology_resolution_timeout_ms: bigint; -} -/** - */ -export interface TrafficWasm { - free(): void; - /** - * The parameter of Poisson distribution determining how long, on average, - * sent packet is going to be delayed at any given mix node. - * So for a packet going through three mix nodes, on average, it will take three times this value - * until the packet reaches its destination. - */ - average_packet_delay_ms: bigint; - /** - * Controls whether the main packet stream constantly produces packets according to the predefined - * poisson distribution. - */ - disable_main_poisson_packet_distribution: boolean; - /** - * The parameter of Poisson distribution determining how long, on average, - * it is going to take another 'real traffic stream' message to be sent. - * If no real packets are available and cover traffic is enabled, - * a loop cover message is sent instead in order to preserve the rate. - */ - message_sending_average_delay_ms: bigint; - /** - * Controls whether the sent sphinx packet use the NON-DEFAULT bigger size. - */ - use_extended_packet_size: boolean; - /** - * Controls whether the sent packets should use outfox as opposed to the default sphinx. - */ - use_outfox: boolean; -} -/** - */ -export interface WasmGateway { - free(): void; - /** - */ - clients_port: number; - /** - */ - host: string; - /** - */ - identity_key: string; - /** - */ - mix_port: number; - /** - */ - owner: string; - /** - */ - sphinx_key: string; - /** - */ - version: string; -} - -/** - */ -export interface ReplySurbsWasm { - free(): void; - /** - * Defines the maximum number of reply surbs a remote party is allowed to request from this client at once. - */ - maximum_allowed_reply_surb_request_size: number; - /** - * Defines maximum amount of time given reply key is going to be valid for. - * This is going to be superseded by key rotation once implemented. - */ - maximum_reply_key_age_ms: bigint; - /** - * Defines maximum amount of time given reply surb is going to be valid for. - * This is going to be superseded by key rotation once implemented. - */ - maximum_reply_surb_age_ms: bigint; - /** - * Defines maximum amount of time the client is going to wait for reply surbs before - * deciding it's never going to get them and would drop all pending messages - */ - maximum_reply_surb_drop_waiting_period_ms: bigint; - /** - * Defines the maximum number of reply surbs the client would request. - */ - maximum_reply_surb_request_size: number; - /** - * Defines maximum amount of time the client is going to wait for reply surbs before explicitly asking - * for more even though in theory they wouldn't need to. - */ - maximum_reply_surb_rerequest_waiting_period_ms: bigint; - /** - * Defines the maximum number of reply surbs the client wants to keep in its storage at any times. - */ - maximum_reply_surb_storage_threshold: number; - /** - * Defines the minimum number of reply surbs the client would request. - */ - minimum_reply_surb_request_size: number; - /** - * Defines the minimum number of reply surbs the client wants to keep in its storage at all times. - * It can only allow to go below that value if its to request additional reply surbs. - */ - minimum_reply_surb_storage_threshold: number; -} - -/** - */ -export interface GatewayConnectionWasm { - free(): void; - /** - * How long we're willing to wait for a response to a message sent to the gateway, - * before giving up on it. - */ - gateway_response_timeout_ms: bigint; -} - -/** - */ -export interface AcknowledgementsWasm { - free(): void; - /** - * Value added to the expected round trip time of an acknowledgement packet before - * it is assumed it was lost and retransmission of the data packet happens. - * In an ideal network with 0 latency, this value would have been 0. - */ - ack_wait_addition_ms: bigint; - /** - * Value multiplied with the expected round trip time of an acknowledgement packet before - * it is assumed it was lost and retransmission of the data packet happens. - * In an ideal network with 0 latency, this value would have been 1. - */ - ack_wait_multiplier: number; - /** - * The parameter of Poisson distribution determining how long, on average, - * sent acknowledgement is going to be delayed at any given mix node. - * So for an ack going through three mix nodes, on average, it will take three times this value - * until the packet reaches its destination. - */ - average_ack_delay_ms: bigint; -} - -/** - */ -export interface CoverTrafficWasm { - free(): void; - /** - * Specifies the ratio of `primary_packet_size` to `secondary_packet_size` used in cover traffic. - * Only applicable if `secondary_packet_size` is enabled. - */ - cover_traffic_primary_size_ratio: number; - /** - * Controls whether the dedicated loop cover traffic stream should be enabled. - * (and sending packets, on average, every [Self::loop_cover_traffic_average_delay]) - */ - disable_loop_cover_traffic_stream: boolean; - /** - * The parameter of Poisson distribution determining how long, on average, - * it is going to take for another loop cover traffic message to be sent. - */ - loop_cover_traffic_average_delay_ms: bigint; -} - -export interface Config { - free(): void; -} - -export interface DebugWasm { - free(): void; - /** - * Defines all configuration options related to acknowledgements, such as delays or wait timeouts. - */ - acknowledgements: AcknowledgementsWasm; - /** - * Defines all configuration options related to cover traffic stream(s). - */ - cover_traffic: CoverTrafficWasm; - /** - * Defines all configuration options related to the gateway connection. - */ - gateway_connection: GatewayConnectionWasm; - /** - * Defines all configuration options related to reply SURBs. - */ - reply_surbs: ReplySurbsWasm; - /** - * Defines all configuration options related topology, such as refresh rates or timeouts. - */ - topology: TopologyWasm; - /** - * Defines all configuration options related to traffic streams. - */ - traffic: TrafficWasm; -} -/** - */ -export interface GatewayEndpointConfig { - free(): void; - /** - * gateway_id specifies ID of the gateway to which the client should send messages. - * If initially omitted, a random gateway will be chosen from the available topology. - */ - gateway_id: string; - /** - * Address of the gateway listener to which all client requests should be sent. - */ - gateway_listener: string; - /** - * Address of the gateway owner to which the client should send messages. - */ - gateway_owner: string; -} -/** - */ -export interface NymClient { - free(): void; - /** - * @returns {string} - */ - self_address(): string; - /** - * The simplest message variant where no additional information is attached. - * You're simply sending your `data` to specified `recipient` without any tagging. - * - * Ends up with `NymMessage::Plain` variant - * @param {Uint8Array} message - * @param {string} recipient - * @returns {Promise} - */ - send_regular_message(message: Uint8Array, recipient: string): Promise; - /** - * Creates a message used for a duplex anonymous communication where the recipient - * will never learn of our true identity. This is achieved by carefully sending `reply_surbs`. - * - * Note that if reply_surbs is set to zero then - * this variant requires the client having sent some reply_surbs in the past - * (and thus the recipient also knowing our sender tag). - * - * Ends up with `NymMessage::Repliable` variant - * @param {Uint8Array} message - * @param {string} recipient - * @param {number} reply_surbs - * @returns {Promise} - */ - send_anonymous_message(message: Uint8Array, recipient: string, reply_surbs: number): Promise; - /** - * Attempt to use our internally received and stored `ReplySurb` to send the message back - * to specified recipient whilst not knowing its full identity (or even gateway). - * - * Ends up with `NymMessage::Reply` variant - * @param {Uint8Array} message - * @param {string} recipient_tag - * @returns {Promise} - */ - send_reply(message: Uint8Array, recipient_tag: string): Promise; -} - -export interface Topology { - free(): void; - /** - * Specifies whether the client should not refresh the network topology after obtaining - * the first valid instance. - * Supersedes `topology_refresh_rate_ms`. - */ - disable_refreshing: boolean; - /** - * The uniform delay every which clients are querying the directory server - * to try to obtain a compatible network topology to send sphinx packets through. - */ - topology_refresh_rate_ms: bigint; - /** - * During topology refresh, test packets are sent through every single possible network - * path. This timeout determines waiting period until it is decided that the packet - * did not reach its destination. - */ - topology_resolution_timeout_ms: bigint; -} - -export interface Traffic { - free(): void; - /** - * The parameter of Poisson distribution determining how long, on average, - * sent packet is going to be delayed at any given mix node. - * So for a packet going through three mix nodes, on average, it will take three times this value - * until the packet reaches its destination. - */ - average_packet_delay_ms: bigint; - /** - * Controls whether the main packet stream constantly produces packets according to the predefined - * poisson distribution. - */ - disable_main_poisson_packet_distribution: boolean; - /** - * The parameter of Poisson distribution determining how long, on average, - * it is going to take another 'real traffic stream' message to be sent. - * If no real packets are available and cover traffic is enabled, - * a loop cover message is sent instead in order to preserve the rate. - */ - message_sending_average_delay_ms: bigint; - /** - * Controls whether the sent sphinx packet use the NON-DEFAULT bigger size. - */ - use_extended_packet_size: boolean; -} - -/** - */ -export interface NymClientBuilder { - free(): void; - /** - * @returns {Promise>} - */ - start_client(): Promise>; -} diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts index 7df48ba73b..c395877f76 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts @@ -1,6 +1,4 @@ -import type { DebugWasm } from './types-from-wasm-pack'; - -export * from './types-from-wasm-pack'; +import type { DebugWasm } from '@nymproject/nym-client-wasm'; /** * diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts index f1755b5d1f..90330f37b5 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts @@ -18,9 +18,7 @@ import wasmBytes from '@nymproject/nym-client-wasm/nym_client_wasm_bg.wasm'; import init, { NymClient, NymClientBuilder, - Config, - get_gateway, - default_debug, + ClientConfig, decode_payload, parse_utf8_string, utf8_string_to_byte_array, @@ -65,7 +63,7 @@ class ClientWrapper { /** * Creates the WASM client and initialises it. */ - init = (config: Config, onRawPayloadHandler?: OnRawPayloadFn) => { + init = (config: ClientConfig, onRawPayloadHandler?: OnRawPayloadFn) => { const onMessageHandler = (message: Uint8Array) => { try { if (onRawPayloadHandler) { @@ -161,14 +159,8 @@ init(wasmBytes()) const wrapper = new ClientWrapper(); const startHandler = async (config: NymClientConfig) => { - // fetch the gateway details (randomly chosen if no preferred gateway is set) - const gatewayEndpoint = await get_gateway(config.nymApiUrl, config.preferredGatewayIdentityKey); - - // set a different gatewayListener in order to avoid workaround ws over https error - if (config.gatewayListener) gatewayEndpoint.gateway_listener = config.gatewayListener; - // create the client, passing handlers for events - wrapper.init(new Config(config.clientId, config.nymApiUrl, config.debug || default_debug()), async (message) => { + wrapper.init(new ClientConfig(config), async (message) => { // fire an event with the raw message postMessageWithType({ kind: EventKinds.RawMessageReceived, diff --git a/sdk/typescript/packages/sdk/tsconfig.eslint.json b/sdk/typescript/packages/sdk/tsconfig.eslint.json new file mode 100644 index 0000000000..f7973eb336 --- /dev/null +++ b/sdk/typescript/packages/sdk/tsconfig.eslint.json @@ -0,0 +1,19 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": true + }, + "include": [ + ".storybook/*.js", + "src/**/*.js", + "src/**/*.jsx", + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.stories.*", + "*.mjs", + ], + "exclude": [ + "node_modules", + "dist" + ] +} diff --git a/clients/validator/.eslintrc.json b/sdk/typescript/packages/validator-client/.eslintrc.json similarity index 100% rename from clients/validator/.eslintrc.json rename to sdk/typescript/packages/validator-client/.eslintrc.json diff --git a/clients/validator/.gitignore b/sdk/typescript/packages/validator-client/.gitignore similarity index 100% rename from clients/validator/.gitignore rename to sdk/typescript/packages/validator-client/.gitignore diff --git a/clients/validator/.npmignore b/sdk/typescript/packages/validator-client/.npmignore similarity index 100% rename from clients/validator/.npmignore rename to sdk/typescript/packages/validator-client/.npmignore diff --git a/clients/validator/.nvmrc b/sdk/typescript/packages/validator-client/.nvmrc similarity index 100% rename from clients/validator/.nvmrc rename to sdk/typescript/packages/validator-client/.nvmrc diff --git a/clients/validator/.nycrc.json b/sdk/typescript/packages/validator-client/.nycrc.json similarity index 100% rename from clients/validator/.nycrc.json rename to sdk/typescript/packages/validator-client/.nycrc.json diff --git a/clients/validator/.prettierrc b/sdk/typescript/packages/validator-client/.prettierrc similarity index 100% rename from clients/validator/.prettierrc rename to sdk/typescript/packages/validator-client/.prettierrc diff --git a/clients/validator/LICENSE b/sdk/typescript/packages/validator-client/LICENSE similarity index 100% rename from clients/validator/LICENSE rename to sdk/typescript/packages/validator-client/LICENSE diff --git a/clients/validator/README.md b/sdk/typescript/packages/validator-client/README.md similarity index 100% rename from clients/validator/README.md rename to sdk/typescript/packages/validator-client/README.md diff --git a/clients/validator/package.json b/sdk/typescript/packages/validator-client/package.json similarity index 93% rename from clients/validator/package.json rename to sdk/typescript/packages/validator-client/package.json index 386a94fe23..2f3eb4e02e 100644 --- a/clients/validator/package.json +++ b/sdk/typescript/packages/validator-client/package.json @@ -1,33 +1,31 @@ { "name": "@nymproject/nym-validator-client", - "version": "0.19.0", + "version": "1.2.0-rc.2", "description": "A TypeScript client for interacting with smart contracts in Nym validators", - "repository": "https://github.com/nymtech/nym", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "build": "rollup -c ./rollup.config.mjs", - "build:types": "rollup-type-bundler --dist ./dist", - "build:prod": "sh ./scripts/build-prod.sh", - "test": "ts-mocha -p ./tsconfig.test.json ./src/tests/**/*.test.ts", - "testmock": "ts-mocha -p ./tsconfig.test.json ./src/tests/mock/*.test.ts", - "coverage": "nyc npm test", - "clean": "rm -rf ./dist", - "lint": "eslint", - "lint:fix": "eslint --fix", - "lint:tsc": "tsc --noEmit", - "docs": "typedoc --out docs src/index.ts" - }, - "files": [ - "./dist/*" - ], - "keywords": [], + "license": "Apache-2.0", "author": "Nym Technologies SA (https://nymtech.net)", "contributors": [ "Dave Hrycyszyn (https://constructiveproof.com/)", "Jędrzej Stuczynski" ], - "license": "Apache-2.0", + "files": [ + "./dist/*" + ], + "main": "dist/index.js", + "repository": "https://github.com/nymtech/nym", + "scripts": { + "build": "rollup -c ./rollup.config.mjs", + "build:prod": "sh ./scripts/build-prod.sh", + "build:types": "rollup-type-bundler --dist ./dist", + "clean": "rm -rf ./dist", + "coverage": "nyc npm test", + "docs": "typedoc --out docs src/index.ts", + "lint": "eslint", + "lint:fix": "eslint --fix", + "test": "ts-mocha -p ./tsconfig.test.json ./src/tests/**/*.test.ts", + "testmock": "ts-mocha -p ./tsconfig.test.json ./src/tests/mock/*.test.ts", + "tsc": "tsc --noEmit" + }, "devDependencies": { "@cosmjs/cosmwasm-stargate": "^0.29.5", "@cosmjs/crypto": "^0.29.5", @@ -64,5 +62,7 @@ "ts-mocha": "^10.0.0", "typedoc": "^0.22.13", "typescript": "^4.6.2" - } -} + }, + "private": false, + "types": "dist/index.d.ts" +} \ No newline at end of file diff --git a/clients/validator/rollup.config.mjs b/sdk/typescript/packages/validator-client/rollup.config.mjs similarity index 100% rename from clients/validator/rollup.config.mjs rename to sdk/typescript/packages/validator-client/rollup.config.mjs diff --git a/clients/validator/scripts/build-prod.sh b/sdk/typescript/packages/validator-client/scripts/build-prod.sh similarity index 100% rename from clients/validator/scripts/build-prod.sh rename to sdk/typescript/packages/validator-client/scripts/build-prod.sh diff --git a/clients/validator/scripts/buildPackageJson.mjs b/sdk/typescript/packages/validator-client/scripts/buildPackageJson.mjs similarity index 100% rename from clients/validator/scripts/buildPackageJson.mjs rename to sdk/typescript/packages/validator-client/scripts/buildPackageJson.mjs diff --git a/clients/validator/src/currency.ts b/sdk/typescript/packages/validator-client/src/currency.ts similarity index 100% rename from clients/validator/src/currency.ts rename to sdk/typescript/packages/validator-client/src/currency.ts diff --git a/clients/validator/src/index.ts b/sdk/typescript/packages/validator-client/src/index.ts similarity index 100% rename from clients/validator/src/index.ts rename to sdk/typescript/packages/validator-client/src/index.ts diff --git a/clients/validator/src/nym-api-querier.ts b/sdk/typescript/packages/validator-client/src/nym-api-querier.ts similarity index 100% rename from clients/validator/src/nym-api-querier.ts rename to sdk/typescript/packages/validator-client/src/nym-api-querier.ts diff --git a/clients/validator/src/nyxd-querier.ts b/sdk/typescript/packages/validator-client/src/nyxd-querier.ts similarity index 100% rename from clients/validator/src/nyxd-querier.ts rename to sdk/typescript/packages/validator-client/src/nyxd-querier.ts diff --git a/clients/validator/src/query-client.ts b/sdk/typescript/packages/validator-client/src/query-client.ts similarity index 100% rename from clients/validator/src/query-client.ts rename to sdk/typescript/packages/validator-client/src/query-client.ts diff --git a/clients/validator/src/signing-client.ts b/sdk/typescript/packages/validator-client/src/signing-client.ts similarity index 100% rename from clients/validator/src/signing-client.ts rename to sdk/typescript/packages/validator-client/src/signing-client.ts diff --git a/clients/validator/src/stargate-helper.ts b/sdk/typescript/packages/validator-client/src/stargate-helper.ts similarity index 100% rename from clients/validator/src/stargate-helper.ts rename to sdk/typescript/packages/validator-client/src/stargate-helper.ts diff --git a/clients/validator/src/tests/expectedResponses.ts b/sdk/typescript/packages/validator-client/src/tests/expectedResponses.ts similarity index 100% rename from clients/validator/src/tests/expectedResponses.ts rename to sdk/typescript/packages/validator-client/src/tests/expectedResponses.ts diff --git a/clients/validator/src/tests/mock/client.ts b/sdk/typescript/packages/validator-client/src/tests/mock/client.ts similarity index 100% rename from clients/validator/src/tests/mock/client.ts rename to sdk/typescript/packages/validator-client/src/tests/mock/client.ts diff --git a/clients/validator/src/tests/mock/delegation.mock.test.ts b/sdk/typescript/packages/validator-client/src/tests/mock/delegation.mock.test.ts similarity index 100% rename from clients/validator/src/tests/mock/delegation.mock.test.ts rename to sdk/typescript/packages/validator-client/src/tests/mock/delegation.mock.test.ts diff --git a/clients/validator/src/tests/mock/gateway.mock.test.ts b/sdk/typescript/packages/validator-client/src/tests/mock/gateway.mock.test.ts similarity index 100% rename from clients/validator/src/tests/mock/gateway.mock.test.ts rename to sdk/typescript/packages/validator-client/src/tests/mock/gateway.mock.test.ts diff --git a/clients/validator/src/tests/mock/mixnet.mock.test.ts b/sdk/typescript/packages/validator-client/src/tests/mock/mixnet.mock.test.ts similarity index 100% rename from clients/validator/src/tests/mock/mixnet.mock.test.ts rename to sdk/typescript/packages/validator-client/src/tests/mock/mixnet.mock.test.ts diff --git a/clients/validator/src/tests/mock/mixnode.mock.test.ts b/sdk/typescript/packages/validator-client/src/tests/mock/mixnode.mock.test.ts similarity index 100% rename from clients/validator/src/tests/mock/mixnode.mock.test.ts rename to sdk/typescript/packages/validator-client/src/tests/mock/mixnode.mock.test.ts diff --git a/clients/validator/src/tests/mock/testData.ts b/sdk/typescript/packages/validator-client/src/tests/mock/testData.ts similarity index 100% rename from clients/validator/src/tests/mock/testData.ts rename to sdk/typescript/packages/validator-client/src/tests/mock/testData.ts diff --git a/clients/validator/src/tests/query/mixnetQueries.test.ts b/sdk/typescript/packages/validator-client/src/tests/query/mixnetQueries.test.ts similarity index 100% rename from clients/validator/src/tests/query/mixnetQueries.test.ts rename to sdk/typescript/packages/validator-client/src/tests/query/mixnetQueries.test.ts diff --git a/clients/validator/src/tests/query/vestingQueries.test.ts b/sdk/typescript/packages/validator-client/src/tests/query/vestingQueries.test.ts similarity index 100% rename from clients/validator/src/tests/query/vestingQueries.test.ts rename to sdk/typescript/packages/validator-client/src/tests/query/vestingQueries.test.ts diff --git a/clients/validator/src/tests/sign/mixnetActions.test.ts b/sdk/typescript/packages/validator-client/src/tests/sign/mixnetActions.test.ts similarity index 100% rename from clients/validator/src/tests/sign/mixnetActions.test.ts rename to sdk/typescript/packages/validator-client/src/tests/sign/mixnetActions.test.ts diff --git a/clients/validator/src/tests/simulate/simulateTx.test.ts b/sdk/typescript/packages/validator-client/src/tests/simulate/simulateTx.test.ts similarity index 100% rename from clients/validator/src/tests/simulate/simulateTx.test.ts rename to sdk/typescript/packages/validator-client/src/tests/simulate/simulateTx.test.ts diff --git a/clients/validator/src/types/global.d.ts b/sdk/typescript/packages/validator-client/src/types/global.d.ts similarity index 100% rename from clients/validator/src/types/global.d.ts rename to sdk/typescript/packages/validator-client/src/types/global.d.ts diff --git a/clients/validator/src/types/shared.ts b/sdk/typescript/packages/validator-client/src/types/shared.ts similarity index 100% rename from clients/validator/src/types/shared.ts rename to sdk/typescript/packages/validator-client/src/types/shared.ts diff --git a/clients/validator/src/types/simulate.ts b/sdk/typescript/packages/validator-client/src/types/simulate.ts similarity index 100% rename from clients/validator/src/types/simulate.ts rename to sdk/typescript/packages/validator-client/src/types/simulate.ts diff --git a/clients/validator/src/utils.ts b/sdk/typescript/packages/validator-client/src/utils.ts similarity index 100% rename from clients/validator/src/utils.ts rename to sdk/typescript/packages/validator-client/src/utils.ts diff --git a/clients/validator/tsconfig.json b/sdk/typescript/packages/validator-client/tsconfig.json similarity index 100% rename from clients/validator/tsconfig.json rename to sdk/typescript/packages/validator-client/tsconfig.json diff --git a/clients/validator/tsconfig.test.json b/sdk/typescript/packages/validator-client/tsconfig.test.json similarity index 100% rename from clients/validator/tsconfig.test.json rename to sdk/typescript/packages/validator-client/tsconfig.test.json diff --git a/sdk/typescript/scripts/build-prod-examples.sh b/sdk/typescript/scripts/build-prod-examples.sh new file mode 100755 index 0000000000..f93a4d764e --- /dev/null +++ b/sdk/typescript/scripts/build-prod-examples.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +rm -rf dist/ts/examples || true +mkdir -p dist/ts/examples + +##--------------------------------------------------------------------------- +## ✅ Run this script from the root of the repository using `yarn sdk:build` +##--------------------------------------------------------------------------- + +packages=( +"chat-app/parcel" +"chat-app/plain-html" +"chat-app/react-webpack-with-theme-example" + +"chrome-extension" +"firefox-extension" + +"node-tester/parcel" +"node-tester/plain-html" +"node-tester/react" + +"react/mui-theme" +"react/sdk-react" +) + +pushd () { + command pushd "$@" > /dev/null +} + +popd () { + command popd "$@" > /dev/null +} + +echo "Summary of versions of examples to build:" +echo "" +pushd "sdk/typescript/examples" +for item in "${packages[@]}" +do + pushd "$item" + cat package.json | jq -r '. | "📦 " + .version + " " +.name' + popd +done diff --git a/sdk/typescript/scripts/build-prod-sdk.sh b/sdk/typescript/scripts/build-prod-sdk.sh new file mode 100755 index 0000000000..25a9828d60 --- /dev/null +++ b/sdk/typescript/scripts/build-prod-sdk.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +rm -rf dist || true + +##--------------------------------------------------------------------------- +## ✅ Run this script from the root of the repository using `yarn sdk:build` +##--------------------------------------------------------------------------- + +# use wasm-pack to build packages +yarn build:wasm + +# build the Typescript SDK packages +yarn build:sdk + +# build documentation +cd sdk/typescript/docs +npm i +npm run docs:prod:build +cd ../../.. + +# build examples +pwd diff --git a/sdk/typescript/scripts/publish.sh b/sdk/typescript/scripts/publish.sh new file mode 100755 index 0000000000..d6eaeb6a84 --- /dev/null +++ b/sdk/typescript/scripts/publish.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +# ------------------------------------------------------- +# ✅ NB: Run this from the root of the repository +# ------------------------------------------------------- + +cd dist + +packages=( +chat-app/parcel +chat-app/plain-html +chat-app/react-webpack-with-theme-example +chrome-extension +firefox-extension +node-tester/parcel +node-tester/plain-html +node-tester/react +react/mui-theme +react/sdk-react +) + +pushd () { + command pushd "$@" > /dev/null +} + +popd () { + command popd "$@" > /dev/null +} + +echo "Summary of versions of packages to publish:" +echo "" +for item in "${packages[@]}" +do + pushd "$item" + cat package.json | jq -r '. | "📦 " + .version + " " +.name' + popd +done + +echo "" +echo "" + +for item in "${packages[@]}" +do + pushd "$item" + echo "🚀 Publishing $item..." + cat package.json | jq -r '. | .name + " " +.version' + npm publish --access=public + popd + echo "" +done +echo "" +echo "✅ Done" + diff --git a/sdk/typescript/scripts/unpublish.sh b/sdk/typescript/scripts/unpublish.sh new file mode 100755 index 0000000000..99ef7b5e25 --- /dev/null +++ b/sdk/typescript/scripts/unpublish.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +cd dist + +packages=( +"ts/sdk/node-tester/cjs" +"ts/sdk/node-tester/cjs-full-fat" +"ts/sdk/node-tester/esm" +"ts/sdk/node-tester/esm-full-fat" +) +packages2=( +"wasm/client" +"wasm/mix-fetch" +"wasm/node-tester" +"wasm/extension-storage" + +"ts/sdk/mix-fetch/cjs" +"ts/sdk/mix-fetch/cjs-full-fat" +"ts/sdk/mix-fetch/esm" +"ts/sdk/mix-fetch/esm-full-fat" + +"ts/sdk/node-tester/cjs" +"ts/sdk/node-tester/cjs-full-fat" +"ts/sdk/node-tester/esm" +"ts/sdk/node-tester/esm-full-fat" + +"ts/sdk/sdk/cjs" +"ts/sdk/sdk/cjs-full-fat" +"ts/sdk/sdk/esm" +"ts/sdk/sdk/esm-full-fat" +) + +pushd () { + command pushd "$@" > /dev/null +} + +popd () { + command popd "$@" > /dev/null +} + +echo "Summary of versions of packages to publish:" +echo "" +for item in "${packages[@]}" +do + pushd "$item" + cat package.json | jq -r '. | "📦 " + .version + " " +.name' + popd +done + +echo "" +echo "" + +for item in "${packages[@]}" +do + pushd "$item" + echo "🚀 Publishing $item..." + VERSION_SPEC=$(cat package.json | jq -r '. | .name + "@" +.version') + npm publish --access=public + popd + echo "" +done +echo "" +echo "✅ Done" + diff --git a/service-providers/common/examples/control_requests.rs b/service-providers/common/examples/control_requests.rs index 14886390f8..9deb9cebd0 100644 --- a/service-providers/common/examples/control_requests.rs +++ b/service-providers/common/examples/control_requests.rs @@ -36,7 +36,7 @@ async fn main() -> anyhow::Result<()> { // but I needed an easy way of sending to and receiving from the mixnet // and that was the most straightforward way of achieving it let mut client = MixnetClient::connect_new().await.unwrap(); - let provider: Recipient = "AN8eLxYWFitCkMn92zim3PrPszxJZDYyFFKP7qnnAAew.8UAxL3LwQBis6WpM3GGXaqKGaVdnLCpGJWumHT6KNdTH@77TSuVU8d1oXKbPzjec2xh4i3Wj5WwUyy9Lr36sm8gZm".parse().unwrap(); + let provider: Recipient = "8YF6f8x17j3fviBdU87EGD9g9MAgn9DARxunwLEVM7Bm.4ydfpjbTjCmzj58hWdQjxU2gT6CRVnTbnKajr2hAGBBM@2xU4CBE6QiiYt6EyBXSALwxkNvM7gqJfjHXaMkjiFmYW".parse().unwrap(); // generic service provider request, so we don't even need to care it's to the socks5 provider let request_health = ControlRequest::Health; diff --git a/service-providers/common/src/interface/version.rs b/service-providers/common/src/interface/version.rs index 906846d438..e27bc08809 100644 --- a/service-providers/common/src/interface/version.rs +++ b/service-providers/common/src/interface/version.rs @@ -54,7 +54,7 @@ macro_rules! define_simple_version { } impl $name { - pub fn new(use_legacy: bool) -> Self { + pub const fn new(use_legacy: bool) -> Self { if use_legacy { Self::new_legacy() } else { @@ -62,23 +62,23 @@ macro_rules! define_simple_version { } } - pub fn new_legacy() -> Self { + pub const fn new_legacy() -> Self { $name::Legacy } - pub fn new_versioned(version: u8) -> Self { + pub const fn new_versioned(version: u8) -> Self { $name::Versioned(version) } - pub fn new_current() -> Self { + pub const fn new_current() -> Self { $name::new(false) } - pub fn is_legacy(&self) -> bool { + pub const fn is_legacy(&self) -> bool { matches!(self, $name::Legacy) } - pub fn as_u8(&self) -> Option { + pub const fn as_u8(&self) -> Option { match self { $name::Legacy => None, $name::Versioned(version) => Some(*version), diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs index 19685615e8..8d743e3c03 100644 --- a/service-providers/network-requester/src/core.rs +++ b/service-providers/network-requester/src/core.rs @@ -78,6 +78,7 @@ impl ServiceProvider for NRServiceProvider { sender: Option, request: Request, ) -> Result<(), Self::ServiceProviderError> { + log::debug!("on_request {:?}", request); if let Some(response) = self.handle_request(sender, request).await? { // TODO: this (i.e. `reply::MixnetAddress`) should be incorporated into the actual interface if let Some(return_address) = reply::MixnetAddress::new(None, sender) { @@ -108,6 +109,8 @@ impl ServiceProvider for NRServiceProvider { request: Socks5Request, interface_version: ProviderInterfaceVersion, ) -> Result, Self::ServiceProviderError> { + log::debug!("handle_provider_data_request {:?}", request); + // TODO: streamline this a bit more let request_version = RequestVersion::new(interface_version, request.protocol_version); diff --git a/service-providers/network-requester/src/reply.rs b/service-providers/network-requester/src/reply.rs index 7aba7473d1..e3eac3a03c 100644 --- a/service-providers/network-requester/src/reply.rs +++ b/service-providers/network-requester/src/reply.rs @@ -140,9 +140,6 @@ impl MixnetMessage { data: Vec, closed_socket: bool, ) -> Self { - if seq == 0 && data.is_empty() { - println!("new empty response with 0 seq") - } let response_content = SocketData::new(seq, connection_id, closed_socket, data); Self::new_network_data_response(address, request_version, connection_id, response_content) } diff --git a/tools/internal/sdk-version-bump/Cargo.toml b/tools/internal/sdk-version-bump/Cargo.toml new file mode 100644 index 0000000000..07bb45a875 --- /dev/null +++ b/tools/internal/sdk-version-bump/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "sdk-version-bump" +version = "0.1.0" +authors.workspace = true +repository.workspace = true +homepage.workspace = true +documentation.workspace = true +edition.workspace = true +license.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = { workspace = true } +cargo-edit = "0.11.0" +clap = { version = "4.3.19", features = ["derive", "string"] } +semver = "1.0.18" +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } diff --git a/tools/internal/sdk-version-bump/README.md b/tools/internal/sdk-version-bump/README.md new file mode 100644 index 0000000000..0b161568be --- /dev/null +++ b/tools/internal/sdk-version-bump/README.md @@ -0,0 +1,19 @@ +# sdk-version-bump + +simple tool to update version numbers of our sdk packages. + +## Usage: + +note: this tool is expected to be run during CI, but if one wants to do it manually: + +### For releases: + +1. run `./sdk-version-bump remove-suffix` that will remove the `-rc.X` suffixes from all relevant packages +2. build everything and publish it to npm +3. run `./sdk-version-bump bump-version` that will update the versions of all relevant packages from `X.Y.Z` into `X.Y.(Z+1)-rc.0`. It will also update the `@nymproject/...` dependencies from `">=X.Y.Z-rc.0 || ^X"` to `">=X.Y.(Z+1)-rc.0 || ^X"` + +### For pre-releases: + +1. run `./sdk-version-bump bump-version --pre-release` that will update the release candidate version of all relevant packages from `X.Y.Z-rc.W` to `X.Y.Z-rc.(W+1)` + +To run it from the root, do: `cargo run -p sdk-version-bump` \ No newline at end of file diff --git a/tools/internal/sdk-version-bump/src/cargo.rs b/tools/internal/sdk-version-bump/src/cargo.rs new file mode 100644 index 0000000000..b00ab3889c --- /dev/null +++ b/tools/internal/sdk-version-bump/src/cargo.rs @@ -0,0 +1,47 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::ReleasePackage; +use anyhow::Context; +use cargo_edit::LocalManifest; +use semver::Version; +use std::path::Path; + +pub struct CargoPackage { + inner: LocalManifest, +} + +impl ReleasePackage for CargoPackage { + fn type_name() -> &'static str { + "Cargo.toml" + } + + fn open>(path: P) -> anyhow::Result { + let inner = LocalManifest::find(Some(path.as_ref()))?; + println!("\t>>> located the file at {}", inner.path.display()); + + Ok(CargoPackage { inner }) + } + + fn save_changes(&mut self) -> anyhow::Result<()> { + self.inner.write() + } + + fn get_current_version(&self) -> anyhow::Result { + self.inner + .manifest + .data + .get("package") + .context("no package")? + .get("version") + .context("no version")? + .as_str() + .context("not a valid str")? + .parse() + .map_err(Into::into) + } + + fn set_version(&mut self, version: &Version) { + self.inner.set_package_version(version); + } +} diff --git a/tools/internal/sdk-version-bump/src/helpers.rs b/tools/internal/sdk-version-bump/src/helpers.rs new file mode 100644 index 0000000000..455ea3487c --- /dev/null +++ b/tools/internal/sdk-version-bump/src/helpers.rs @@ -0,0 +1,164 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use anyhow::{bail, Context}; +use semver::{Prerelease, Version}; +use std::collections::HashSet; +use std::path::Path; + +pub(crate) trait ReleasePackage: Sized { + fn type_name() -> &'static str; + + fn open>(path: P) -> anyhow::Result; + + fn save_changes(&mut self) -> anyhow::Result<()>; + + fn get_current_version(&self) -> anyhow::Result; + + fn set_version(&mut self, version: &Version); + + fn remove_suffix(&mut self) -> anyhow::Result<()> { + let version = self.get_current_version()?; + let updated = version.try_remove_prerelease()?; + + println!("\t>>> changing version from {version} to {updated}"); + self.set_version(&updated); + Ok(()) + } + + fn bump_version(&mut self, pre_release: bool) -> anyhow::Result<()> { + let version = self.get_current_version()?; + let updated = if pre_release { + version.try_bump_prerelease()? + } else { + version.try_bump_patch_without_pre()? + }; + + println!("\t>>> changing version from {version} to {updated}"); + self.set_version(&updated); + Ok(()) + } + + fn update_nym_dependencies(&mut self, _: &HashSet) -> anyhow::Result<()> { + Ok(()) + } +} + +pub(crate) trait VersionBumpExt: Sized { + fn try_bump_prerelease(&self) -> anyhow::Result; + fn try_bump_patch_without_pre(&self) -> anyhow::Result; + + fn set_initial_release_candidate(&self) -> anyhow::Result; + fn try_remove_prerelease(&self) -> anyhow::Result; +} + +impl VersionBumpExt for Version { + fn try_bump_prerelease(&self) -> anyhow::Result { + if self.pre.is_empty() { + bail!("the current version ({self}) does not have pre-release data set - are you sure you followed the release process correctly?") + } + + // ugh that's disgusting + let (rc_prefix, pre_version) = self + .pre + .as_str() + .split_once('.') + .context("the prerelease version does not contain a valid rc.X suffix")?; + + let parsed_version: u32 = pre_version.parse()?; + let updated_version = parsed_version + 1; + + let pre = format!("{rc_prefix}.{updated_version}").parse()?; + Ok(Version { + major: self.major, + minor: self.minor, + patch: self.patch, + pre, + build: self.build.clone(), + }) + } + + fn try_bump_patch_without_pre(&self) -> anyhow::Result { + if !self.pre.is_empty() { + bail!("the current version ({self}) has pre-release data set - are you sure you followed the release process correctly?") + } + + let mut updated = self.clone(); + updated.patch += 1; + Ok(updated) + } + + fn set_initial_release_candidate(&self) -> anyhow::Result { + if !self.pre.is_empty() { + bail!("the current version ({self}) has pre-release data set - are you sure you followed the release process correctly?") + } + Ok(Version { + major: self.major, + minor: self.minor, + patch: self.patch, + pre: Prerelease::new("rc.0")?, + build: self.build.clone(), + }) + } + + fn try_remove_prerelease(&self) -> anyhow::Result { + if self.pre.is_empty() { + bail!("the current version ({self}) does not have pre-release data set - are you sure you followed the release process correctly?") + } + Ok(Version { + major: self.major, + minor: self.minor, + patch: self.patch, + pre: Default::default(), + build: self.build.clone(), + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use semver::Version; + + #[test] + fn bump_patch_version() { + let cases = [ + ("1.0.0", Some("1.0.1")), + ("2.3.0", Some("2.3.1")), + ("1.0.0-rc.0", None), + ("1.0.0-rc.foomp", None), + ]; + + for (raw, expected) in cases { + let updated = Version::parse(raw).unwrap().try_bump_patch_without_pre(); + if let Some(expected) = expected { + let expected = Version::parse(expected).unwrap(); + assert_eq!(expected, updated.unwrap()) + } else { + assert!(updated.is_err()) + } + } + } + + #[test] + fn bump_rc_version() { + let cases = [ + ("1.0.0", None), + ("1.0.0-rc.0", Some("1.0.0-rc.1")), + ("1.0.0-rc.-1", None), + ("1.2.3-rc.42", Some("1.2.3-rc.43")), + ("1.2.3-rc42", None), + ("1.0.0-rc.foomp", None), + ]; + + for (raw, expected) in cases { + let updated = Version::parse(raw).unwrap().try_bump_prerelease(); + if let Some(expected) = expected { + let expected = Version::parse(expected).unwrap(); + assert_eq!(expected, updated.unwrap()) + } else { + assert!(updated.is_err()) + } + } + } +} diff --git a/tools/internal/sdk-version-bump/src/json.rs b/tools/internal/sdk-version-bump/src/json.rs new file mode 100644 index 0000000000..79b89e9d8d --- /dev/null +++ b/tools/internal/sdk-version-bump/src/json.rs @@ -0,0 +1,150 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::json_types::DepsSet; +use crate::{json_types, ReleasePackage}; +use anyhow::{bail, Context}; +use semver::{Comparator, Prerelease, Version, VersionReq}; +use std::collections::HashSet; +use std::path::{Path, PathBuf}; +use std::{env, fs}; + +pub struct PackageJson { + path: PathBuf, + inner: json_types::Package, +} + +fn update_dependencies(deps: &mut DepsSet, names: &HashSet) -> anyhow::Result<()> { + for (package, version) in deps.iter_mut() { + if names.contains(package) { + let updated = try_bump_minor_version_req(version)?; + + println!("\t\t>>> updating '{package}' from {version} to {updated}"); + *version = updated + } + } + Ok(()) +} + +impl ReleasePackage for PackageJson { + fn type_name() -> &'static str { + "package.json" + } + + fn open>(path: P) -> anyhow::Result { + let path = find(Some(path.as_ref()))?; + println!("\t>>> located the file at {}", path.display()); + + let inner = json_types::Package::from_path(&path)?; + Ok(PackageJson { path, inner }) + } + + fn save_changes(&mut self) -> anyhow::Result<()> { + let file = std::fs::File::create(&self.path)?; + Ok(serde_json::to_writer_pretty(file, &self.inner)?) + } + + fn get_current_version(&self) -> anyhow::Result { + self.inner.version.parse().map_err(Into::into) + } + + fn set_version(&mut self, version: &Version) { + self.inner.version = version.to_string() + } + + fn update_nym_dependencies(&mut self, names: &HashSet) -> anyhow::Result<()> { + println!("\t>>> updating @nymproject dependencies..."); + update_dependencies(&mut self.inner.dependencies, names)?; + + println!("\t>>> updating @nymproject peerDependencies..."); + update_dependencies(&mut self.inner.peer_dependencies, names)?; + + println!("\t>>> updating @nymproject devDependencies..."); + update_dependencies(&mut self.inner.dev_dependencies, names)?; + + println!("\t>>> updating @nymproject optionalDependencies..."); + update_dependencies(&mut self.inner.optional_dependencies, names)?; + + println!("\t>>> updating @nymproject bundledDependencies..."); + update_dependencies(&mut self.inner.bundled_dependencies, names)?; + + Ok(()) + } +} + +pub fn find(specified: Option<&Path>) -> anyhow::Result { + match specified { + Some(path) + if fs::metadata(path) + .with_context(|| "Failed to get cargo file metadata")? + .is_file() => + { + Ok(path.to_owned()) + } + Some(path) => find_package_path(path), + None => find_package_path( + &env::current_dir().with_context(|| "Failed to get current directory")?, + ), + } +} + +pub(crate) fn find_package_path(dir: &Path) -> anyhow::Result { + const MANIFEST_FILENAME: &str = "package.json"; + for path in dir.ancestors() { + let manifest = path.join(MANIFEST_FILENAME); + if std::fs::metadata(&manifest).is_ok() { + return Ok(manifest); + } + } + anyhow::bail!("Unable to find package.json for {}", dir.display()); +} + +// expected structure: `>=X.Y.Z-rc.W || ^X` +fn try_bump_minor_version_req(raw_req: &str) -> anyhow::Result { + let (req, major) = raw_req + .split_once("||") + .context("invalid version requirement")?; + let parsed_req = VersionReq::parse(req)?; + let parsed_major = VersionReq::parse(major)?; + if parsed_req.comparators.len() != 1 { + bail!("wrong number of version requirements present in {parsed_req}") + } + + let updated = VersionReq { + comparators: vec![Comparator { + op: parsed_req.comparators[0].op, + major: parsed_req.comparators[0].major, + minor: parsed_req.comparators[0].minor, + patch: parsed_req.comparators[0].patch.map(|p| p + 1), + pre: Prerelease::new("rc.0")?, + }], + }; + + Ok(format!("{updated} || {parsed_major}")) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn bumping_version_req() { + let cases = [ + (">=1.2.0-rc.0 || ^1", Some(">=1.2.1-rc.0 || ^1")), + (">=1.2.0-rc.0 || 1", Some(">=1.2.1-rc.0 || ^1")), + (">=1.2.0-rc.5 || ^1", Some(">=1.2.1-rc.0 || ^1")), + (">=1.2.0-rc.5 || 1", Some(">=1.2.1-rc.0 || ^1")), + (">=1.2.0-rc.0", None), + ("1.0.0-rc.0", None), + ]; + + for (raw, expected) in cases { + let updated = try_bump_minor_version_req(raw); + if let Some(expected) = expected { + assert_eq!(expected, updated.unwrap()) + } else { + assert!(updated.is_err()) + } + } + } +} diff --git a/tools/internal/sdk-version-bump/src/json_types.rs b/tools/internal/sdk-version-bump/src/json_types.rs new file mode 100644 index 0000000000..c1fe612685 --- /dev/null +++ b/tools/internal/sdk-version-bump/src/json_types.rs @@ -0,0 +1,281 @@ +// source: https://crates.io/crates/npm-package-json + +//! `serde` mappings for npm's `package.json` file format. +//! +//! This does only implement the fields defined [in the official npm documentation](https://docs.npmjs.com/files/package.json). +//! It is common enough that packages define custom entries that are required by +//! various tooling. + +#![warn( + missing_copy_implementations, + missing_debug_implementations, + missing_docs, + unsafe_code +)] + +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use std::{collections::BTreeMap, fmt, fs, io::Read, path::Path, str::FromStr}; + +/// An ordered map for `bin` entries. +pub type BinSet = BTreeMap; +/// An ordered map for `dependencies` entries. +pub type DepsSet = BTreeMap; +/// An ordered map for `engines` entries. +pub type EnginesSet = BTreeMap; +/// An ordered map for `scripts` entries. +pub type ScriptsSet = BTreeMap; + +/// A bug contacting form. +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +pub struct Bug { + /// The email to use for contact. + #[serde(skip_serializing_if = "Option::is_none")] + pub email: Option, + /// The url to use to submit bugs. + #[serde(skip_serializing_if = "Option::is_none")] + pub url: Option, +} + +impl Bug { + /// Creates a new default bug. + pub fn new() -> Self { + Self::default() + } + + /// Creates a new bug with the given values. + pub fn with(email: Option, url: Option) -> Self { + Self { email, url } + } +} + +/// A person. +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +pub struct Person { + /// The name of a person. + pub name: String, + /// The email of a person. + #[serde(skip_serializing_if = "Option::is_none")] + pub email: Option, + /// The homepage of the person. + #[serde(skip_serializing_if = "Option::is_none")] + pub url: Option, +} + +impl Person { + /// Creates a default person. + pub fn new() -> Self { + Self::default() + } + + /// Creates a person with a given name. + pub fn with_name(name: String) -> Self { + Self { + name, + ..Default::default() + } + } + + /// Creates a person with the given values. + pub fn with(name: String, email: Option, url: Option) -> Self { + Self { name, email, url } + } +} + +impl fmt::Display for Person { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match (&self.name, self.email.as_ref(), self.url.as_ref()) { + (name, Some(email), None) => write!(f, "{} <{}>", name, email), + (name, None, Some(url)) => write!(f, "{} ({})", name, url), + (name, None, None) => write!(f, "{}", name), + (name, Some(email), Some(url)) => write!(f, "{} <{}> ({})", name, email, url), + } + } +} + +/// A reference to a person. +#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(untagged)] +pub enum PersonReference { + /// A short reference. + /// + /// Short references have a fixed format of `John Doe (https://john.doe.dev)`. + Short(String), + /// A full reference. + /// + /// This type of reference defines the parts using a struct instead of a + /// shorthand string format. + Full(Person), +} + +/// A reference to a man page. +#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(untagged)] +pub enum ManReference { + /// A single man page reference. Points to one single file. + Single(String), + /// Multiple man pages, can contain anything from zero to n. + Multiple(Vec), +} + +/// A repository. +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +pub struct Repository { + /// The version control system that the repository uses. + pub r#type: String, + /// The url to the repository. + pub url: String, + /// The directory that the repository is in. Often used for monorepos. + #[serde(skip_serializing_if = "Option::is_none")] + pub directory: Option, +} + +/// A repository reference. +#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(untagged)] +pub enum RepositoryReference { + /// A short reference to the repository. Has to have the syntax that `npm install` allows as well. For more information see [here](https://docs.npmjs.com/files/package.json#repository). + Short(String), + /// A full reference. + Full(Repository), +} + +/// The top-level `package.json` structure. +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Package { + /// The package name. + pub name: String, + /// The package version. + pub version: String, + /// The optional package description. + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option, + /// The optional list of keywords. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub keywords: Vec, + /// The optional package homepage. + #[serde(skip_serializing_if = "Option::is_none")] + pub homepage: Option, + /// The optional bug contact form. + #[serde(skip_serializing_if = "Option::is_none")] + pub bugs: Option, + /// The optional package license. + #[serde(skip_serializing_if = "Option::is_none")] + pub license: Option, + /// The optional author. + #[serde(skip_serializing_if = "Option::is_none")] + pub author: Option, + /// The optional list of contributors. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub contributors: Vec, + /// The optional list of files to include. Each entry defines a regex + /// pattern. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub files: Vec, + /// The optional package main entry file. + #[serde(skip_serializing_if = "Option::is_none")] + pub main: Option, + /// The optional package browser entry file. + /// + /// This is usually defined in libraries that are meant to be consumed by + /// browsers. These Thoes can refer to objects that are not available inside + /// a `nodejs` environment (like `window`). + #[serde(skip_serializing_if = "Option::is_none")] + pub browser: Option, + /// The optional set of binary definitions. + #[serde(default, skip_serializing_if = "BinSet::is_empty")] + pub bin: BinSet, + /// The optional list of man page references. + #[serde(skip_serializing_if = "Option::is_none")] + pub man: Option, + /// The optional repository reference. + //#[serde(flatten)] + #[serde(skip_serializing_if = "Option::is_none")] + pub repository: Option, + /// The optional list of script entries. + #[serde(default, skip_serializing_if = "ScriptsSet::is_empty")] + pub scripts: ScriptsSet, + /// The optional list of dependencies. + #[serde(default, skip_serializing_if = "DepsSet::is_empty")] + pub dependencies: DepsSet, + /// The optional list of development dependencies. + #[serde(default, skip_serializing_if = "DepsSet::is_empty")] + pub dev_dependencies: DepsSet, + /// The optional list of peer dependencies. + #[serde(default, skip_serializing_if = "DepsSet::is_empty")] + pub peer_dependencies: DepsSet, + /// The optional list of bundled dependencies. + #[serde(default, skip_serializing_if = "DepsSet::is_empty")] + pub bundled_dependencies: DepsSet, + /// The optional list of optional dependencies. + #[serde(default, skip_serializing_if = "DepsSet::is_empty")] + pub optional_dependencies: DepsSet, + /// The optional list of engine entries. + #[serde(default, skip_serializing_if = "EnginesSet::is_empty")] + pub engines: EnginesSet, + /// The package privacy. + #[serde(default)] + pub private: bool, + /// The OS' that the package can run on. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub os: Vec, + /// The CPU architectures that the package can run on. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub cpu: Vec, + /// The optional config object. + #[serde(skip_serializing_if = "Option::is_none")] + pub config: Option, + /// Other custom fields that have been defined inside the `package.json` + /// file. + #[serde(flatten)] + pub others: BTreeMap, +} + +impl Package { + /// Creates a new default package. + pub fn new() -> Self { + Self::default() + } + + /// Deserializes a `Package` from a file path. + pub fn from_path(path: impl AsRef) -> anyhow::Result { + let content = fs::read(path.as_ref())?; + Self::from_slice(content.as_slice()) + } + + /// Deserializes a `Package` from an IO stream. + pub fn from_reader(r: R) -> anyhow::Result { + Ok(serde_json::from_reader(r)?) + } + + /// Deserializes a `Package` from bytes. + pub fn from_slice(v: &[u8]) -> anyhow::Result { + Ok(serde_json::from_slice(v)?) + } +} + +impl FromStr for Package { + type Err = anyhow::Error; + + /// Deserializes a `Package` from a string. + fn from_str(s: &str) -> Result { + Ok(serde_json::from_str(s)?) + } +} + +#[cfg(test)] +mod tests { + use super::Person; + + #[test] + fn test_person_display() { + let person = Person { + name: "John Doe".to_string(), + email: Some("john@doe.dev".to_string()), + url: Some("https://john.doe.dev".to_string()), + }; + let expected = "John Doe (https://john.doe.dev)"; + assert_eq!(expected, person.to_string()); + } +} diff --git a/tools/internal/sdk-version-bump/src/main.rs b/tools/internal/sdk-version-bump/src/main.rs new file mode 100644 index 0000000000..fe827b54a8 --- /dev/null +++ b/tools/internal/sdk-version-bump/src/main.rs @@ -0,0 +1,208 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::cargo::CargoPackage; +use crate::helpers::ReleasePackage; +use crate::json::PackageJson; +use clap::{Parser, Subcommand}; +use std::collections::HashSet; +use std::env; +use std::path::{Path, PathBuf}; + +mod cargo; +mod helpers; +mod json; +pub mod json_types; + +fn default_root() -> PathBuf { + env::current_dir().unwrap() +} + +#[derive(Parser)] +struct Args { + #[arg(default_value=default_root().into_os_string())] + root: PathBuf, + + #[clap(subcommand)] + command: Commands, +} + +#[derive(Subcommand)] +enum Commands { + /// Will strip any `-rc.X` suffixes from the package versions + RemoveSuffix, + + /// Will update the versions of all relevant packages from `X.Y.Z` into `X.Y.(Z+1)-rc.0`. + /// It will also update the `@nymproject/...` dependencies from `">=X.Y.Z-rc.0 || ^X"` to `">=X.Y.(Z+1)-rc.0 || ^X"` + BumpVersion { + #[arg(long)] + /// If enabled, the packages will only have their rc version bumped and the dependencies won't get updated at all + pre_release: bool, + }, +} + +fn remove_suffix(root: &Path, path: impl AsRef) { + let path = root.join(path); + println!( + ">>> [{}] UPDATING PACKAGE {}: ", + Pkg::type_name(), + path.display() + ); + + if let Err(err) = { remove_suffix_inner::(path) } { + println!("\t>>> ❌ FAILURE: {err}"); + } else { + println!("\t>>> ✅ SUCCESS"); + } +} + +fn remove_suffix_inner(path: impl AsRef) -> anyhow::Result<()> { + println!("\t>>> opening the package file..."); + let mut package = Pkg::open(path)?; + package.remove_suffix()?; + + println!("\t>>> saving the package file..."); + package.save_changes() +} + +fn bump_version( + root: &Path, + path: impl AsRef, + dependencies_to_update: &HashSet, + pre_release: bool, +) { + let path = root.join(path); + println!( + ">>> [{}] UPDATING PACKAGE {}: ", + Pkg::type_name(), + path.display() + ); + if let Err(err) = { bump_version_inner::(path, dependencies_to_update, pre_release) } { + println!("\t>>> ❌ FAILURE: {err}"); + } else { + println!("\t>>> ✅ SUCCESS"); + } +} + +fn bump_version_inner( + path: impl AsRef, + dependencies_to_update: &HashSet, + pre_release: bool, +) -> anyhow::Result<()> { + println!("\t>>> opening the package file..."); + let mut package = Pkg::open(path)?; + package.bump_version(pre_release)?; + + if !pre_release { + package.update_nym_dependencies(dependencies_to_update)?; + } + + println!("\t>>> saving the package file..."); + package.save_changes() +} + +#[derive(Default)] +struct InternalPackages { + root: PathBuf, + cargo: HashSet, + json: HashSet, + + internal_js_dependencies: HashSet, +} + +impl InternalPackages { + pub fn new>(root: P) -> Self { + InternalPackages { + root: root.as_ref().to_path_buf(), + cargo: Default::default(), + json: Default::default(), + internal_js_dependencies: Default::default(), + } + } + + pub fn register_cargo>(&mut self, relative_path: S) { + self.cargo.insert(relative_path.into()); + } + + pub fn register_json>(&mut self, relative_path: S) { + self.json.insert(relative_path.into()); + } + + pub fn register_known_js_dependency>(&mut self, name: S) { + self.internal_js_dependencies.insert(name.into()); + } + + pub fn remove_suffix(&self) { + for cargo_package in &self.cargo { + remove_suffix::(&self.root, cargo_package); + } + + for package_json in &self.json { + remove_suffix::(&self.root, package_json); + } + } + + pub fn bump_version(&self, pre_release: bool) { + for cargo_package in &self.cargo { + bump_version::( + &self.root, + cargo_package, + &Default::default(), + pre_release, + ); + } + + for package_json in &self.json { + bump_version::( + &self.root, + package_json, + &self.internal_js_dependencies, + pre_release, + ); + } + } +} + +fn initialise_internal_packages>(root: P) -> InternalPackages { + let mut packages = InternalPackages::new(root); + + // cargo packages that will have their Cargo.toml modified + packages.register_cargo("wasm/mix-fetch"); + packages.register_cargo("wasm/client"); + packages.register_cargo("wasm/node-tester"); + packages.register_cargo("wasm/full-nym-wasm"); + packages.register_cargo("nym-browser-extension/storage"); + + // js packages that will have their package.json modified + packages.register_json("sdk/typescript/packages/mix-fetch"); + packages.register_json("sdk/typescript/packages/mui-theme"); + packages.register_json("sdk/typescript/packages/node-tester"); + packages.register_json("sdk/typescript/packages/react-components"); + packages.register_json("sdk/typescript/packages/sdk"); + packages.register_json("sdk/typescript/packages/sdk-react"); + packages.register_json("sdk/typescript/packages/validator-client"); + + // dependencies that will have their versions adjusted in the above packages + packages.register_known_js_dependency("@nymproject/mix-fetch"); + packages.register_known_js_dependency("@nymproject/mui-theme"); + packages.register_known_js_dependency("@nymproject/node-tester"); + packages.register_known_js_dependency("@nymproject/react-components"); + packages.register_known_js_dependency("@nymproject/sdk"); + packages.register_known_js_dependency("@nymproject/sdk-react"); + packages.register_known_js_dependency("@nymproject/react"); + packages.register_known_js_dependency("@nymproject/nym-validator-client"); + + packages +} + +fn main() -> anyhow::Result<()> { + let args = Args::parse(); + let packages = initialise_internal_packages(args.root); + + match args.command { + Commands::RemoveSuffix => packages.remove_suffix(), + Commands::BumpVersion { pre_release } => packages.bump_version(pre_release), + } + + Ok(()) +} diff --git a/tools/internal/ssl-inject/Cargo.toml b/tools/internal/ssl-inject/Cargo.toml new file mode 100644 index 0000000000..41d42fc496 --- /dev/null +++ b/tools/internal/ssl-inject/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "ssl-inject" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +tokio = { version = "*", features = ["full"]} +anyhow = "1.0.71" +hex = "0.4.3" +clap = { version = "4.0", features = ["derive"] } diff --git a/tools/internal/ssl-inject/src/main.rs b/tools/internal/ssl-inject/src/main.rs new file mode 100644 index 0000000000..153bd372e2 --- /dev/null +++ b/tools/internal/ssl-inject/src/main.rs @@ -0,0 +1,96 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use clap::Parser; +use std::io; +use std::time::Duration; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::net::TcpStream; +use tokio::select; +use tokio::time::sleep; + +#[derive(Parser)] +struct Args { + // ipv4 nymtech.net address + #[clap(long, default_value = "185.19.28.43:443")] + target: String, +} + +fn decode_hex(raw: &str) -> Vec { + hex::decode(raw).unwrap() +} + +fn encode_hex(bytes: &[u8]) -> String { + hex::encode(bytes) +} + +fn read_line() -> anyhow::Result { + let mut buffer = String::new(); + io::stdin().read_line(&mut buffer)?; + Ok(buffer) +} + +async fn read_from_conn(conn: &mut TcpStream) -> Vec { + let timeout = sleep(Duration::from_secs(1)); + tokio::pin!(timeout); + + let mut read = Vec::new(); + loop { + let mut buf = [0u8; 1024]; + select! { + _ = &mut timeout => { + return read + } + res = conn.read(&mut buf) => { + let n = res.unwrap(); + if n == 0 { + return read + } + println!("read {n} bytes"); + read.append(&mut buf[..n].to_vec()) + } + + } + } +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let args = Args::parse(); + let target = args.target; + + println!("connecting to {target}"); + let mut conn = TcpStream::connect(target).await?; + println!("connected"); + + loop { + println!("[Client] >>> "); + let client_hello = read_line()?; + let raw = decode_hex(client_hello.trim()); + conn.write_all(&raw).await?; + + let data = read_from_conn(&mut conn).await; + let encoded = encode_hex(&data); + println!("[Server] >>>\n{encoded}"); + } + + // println!("[ClientHello] >>> "); + // let client_hello = read_line()?; + // let raw = decode_hex(client_hello.trim()); + // conn.write_all(&raw).await?; + // + // let data = read_from_conn(&mut conn).await; + // let encoded = encode_hex(&data); + // println!("[ServerHello] >>>\n{encoded}"); + // + // println!("[ClientKeyExchange] >>> "); + // let client_response = read_line()?; + // let raw = decode_hex(client_response.trim()); + // conn.write_all(&raw).await?; + // + // let data = read_from_conn(&mut conn).await; + // let encoded = encode_hex(&data); + // println!("[ServerFinished] >>>\n{encoded}"); + + // Ok(()) +} diff --git a/ts-packages/react-webpack-with-theme-example/.babelrc b/ts-packages/react-webpack-with-theme-example/.babelrc deleted file mode 100644 index 85e1f1ba26..0000000000 --- a/ts-packages/react-webpack-with-theme-example/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@babel/env", "@babel/react"] -} \ No newline at end of file diff --git a/ts-packages/react-webpack-with-theme-example/jest.config.js b/ts-packages/react-webpack-with-theme-example/jest.config.js deleted file mode 100644 index e86e13bab9..0000000000 --- a/ts-packages/react-webpack-with-theme-example/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', -}; diff --git a/wasm/client/.cargo/config.toml b/wasm/client/.cargo/config.toml new file mode 100644 index 0000000000..a7f24f6737 --- /dev/null +++ b/wasm/client/.cargo/config.toml @@ -0,0 +1,6 @@ +[build] +target = "wasm32-unknown-unknown" +target_arch = "wasm32" + +[target.wasm32-unknown-unknown] +runner = 'wasm-bindgen-test-runner' \ No newline at end of file diff --git a/wasm/client/Cargo.toml b/wasm/client/Cargo.toml new file mode 100644 index 0000000000..1642f95ec1 --- /dev/null +++ b/wasm/client/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "nym-client-wasm" +authors = ["Dave Hrycyszyn ", "Jedrzej Stuczynski "] +version = "1.2.0-rc.2" +edition = "2021" +keywords = ["nym", "sphinx", "wasm", "webassembly", "privacy", "client"] +license = "Apache-2.0" +repository = "https://github.com/nymtech/nym" +description = "A webassembly client which can be used to interact with the the Nym privacy platform. Wasm is used for Sphinx packet generation." +rust-version = "1.56" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +anyhow = "1.0" +futures = { workspace = true } +js-sys = { workspace = true } +rand = { version = "0.7.3", features = ["wasm-bindgen"] } +serde = { workspace = true, features = ["derive"] } +serde_json = "1.0" +serde-wasm-bindgen = { workspace = true } +wasm-bindgen = { workspace = true } +wasm-bindgen-futures = { workspace = true } +thiserror = { workspace = true } +tsify = { workspace = true, features = ["js"] } + +wasm-client-core = { path = "../../common/wasm/client-core" } +wasm-utils = { path = "../../common/wasm/utils" } + +nym-node-tester-utils = { path = "../../common/node-tester-utils", optional = true } +nym-node-tester-wasm = { path = "../node-tester", optional = true} + +[dev-dependencies] +wasm-bindgen-test = "0.3.36" + +[features] +default = ["node-tester"] +node-tester = ["nym-node-tester-wasm", "nym-node-tester-utils"] + +[package.metadata.wasm-pack.profile.release] +wasm-opt = false + +[profile.release] +lto = true +opt-level = 'z' diff --git a/wasm/client/Makefile b/wasm/client/Makefile new file mode 100644 index 0000000000..82ae780f15 --- /dev/null +++ b/wasm/client/Makefile @@ -0,0 +1,3 @@ +build: + wasm-pack build --scope nymproject --target web --out-dir ../../dist/wasm/client + wasm-opt -Oz -o ../../dist/wasm/client/nym_client_wasm_bg.wasm ../../dist/wasm/client/nym_client_wasm_bg.wasm diff --git a/clients/webassembly/README.md b/wasm/client/README.md similarity index 62% rename from clients/webassembly/README.md rename to wasm/client/README.md index 6f290c1506..6d4bccd319 100644 --- a/clients/webassembly/README.md +++ b/wasm/client/README.md @@ -20,18 +20,20 @@ See the [SDK directory](../../sdk/typescript/examples) for examples on how to us ## Developing -This is a Rust crate which is set up to automatically cross-compile the contents of `src` to WebAssembly (aka wasm). It's published from the main [Nym platform monorepo](https://github.com/nymtech/nym) in the `clients/webassembly` directory. +Make sure you have `wasm-pack` installed (`cargo install wasm-pack`) before you start. -First, make sure you've got all the [Rust wasm toolchain](https://rustwasm.github.io/docs/book/) installed. Cross-compilation sounds scary, but the Rust crew have enabled a remarkably simple setup. +Please use the [Makefile](Makefile) targets to build this crate and compile it to WASM: -Furthermore, [wasm-bindgen documentation](https://rustwasm.github.io/docs/wasm-bindgen/) provides excellent tips to solving common problems. +``` +make build +``` -Whenever you change any Rust in the `src` directory, run `wasm-pack build --scope nymproject` to update the built wasm artefact in the `pkg` directory. - -To be clear, this is not something that most JS developers need to worry about, this is only for Nym devs. The packages on NPM have all files in place. Just install and enjoy! +The outputs will be found [here](../../dist/wasm/client) where it will be accessible to the rest of the monorepo using workspaces. ### Packaging +> **TODO** + If you're a Nym platform developer who's made changes to the Rust files and wants to re-publish the package to NPM, here's how you do it: 1. bump version numbers as necessary for SemVer diff --git a/clients/webassembly/internal-dev/.gitignore b/wasm/client/internal-dev/.gitignore similarity index 100% rename from clients/webassembly/internal-dev/.gitignore rename to wasm/client/internal-dev/.gitignore diff --git a/clients/webassembly/internal-dev/bootstrap.js b/wasm/client/internal-dev/bootstrap.js similarity index 100% rename from clients/webassembly/internal-dev/bootstrap.js rename to wasm/client/internal-dev/bootstrap.js diff --git a/clients/webassembly/internal-dev/index.html b/wasm/client/internal-dev/index.html similarity index 86% rename from clients/webassembly/internal-dev/index.html rename to wasm/client/internal-dev/index.html index e9dfb10e0c..8182be7ab6 100644 --- a/clients/webassembly/internal-dev/index.html +++ b/wasm/client/internal-dev/index.html @@ -5,6 +5,7 @@ Nym WebAssembly Demo + @@ -23,8 +24,8 @@

    - - + +
    @@ -37,7 +38,7 @@

    - + \ No newline at end of file diff --git a/clients/webassembly/internal-dev/index.js b/wasm/client/internal-dev/index.js similarity index 91% rename from clients/webassembly/internal-dev/index.js rename to wasm/client/internal-dev/index.js index fa21135309..0ff5c3a191 100644 --- a/clients/webassembly/internal-dev/index.js +++ b/wasm/client/internal-dev/index.js @@ -29,6 +29,10 @@ class WebWorkerClient { const {message, senderTag, isTestPacket } = ev.data.args; displayReceived(message, senderTag, isTestPacket); break; + case 'DisplayString': + const { rawString } = ev.data.args; + displayReceivedRawString(rawString) + break; case 'DisableMagicTestButton': const magicButton = document.querySelector('#magic-button'); magicButton.setAttribute('disabled', "true") @@ -57,14 +61,14 @@ class WebWorkerClient { }); }; - sendTestPacket = (mixnodeIdentity) => { + sendMagicPayload = (mixnodeIdentity) => { if (!this.worker) { console.error('Could not send message because worker does not exist'); return; } this.worker.postMessage({ - kind: 'TestPacket', + kind: 'MagicPayload', args: { mixnodeIdentity, }, @@ -84,7 +88,7 @@ async function main() { const magicButton = document.querySelector('#magic-button'); magicButton.onclick = function () { - sendTestPacket(); + sendMagicPayload(); } } @@ -102,11 +106,11 @@ async function sendMessageTo() { displaySend(message); } -async function sendTestPacket() { - const mixnodeIdentity = document.getElementById('mixnode_identity').value; +async function sendMagicPayload() { + const payload = document.getElementById('magic_payload').value; + await client.sendMagicPayload(payload) - await client.sendTestPacket(mixnodeIdentity) - displaySend(`sending test packets to: ${mixnodeIdentity}...`); + displaySend(`clicked the button and the payload is: ${payload}...`); } /** @@ -146,7 +150,6 @@ function displayReceived(raw, sender_tag, isTestPacket) { displayReceivedRawString(content) } - function displayReceivedRawString(raw) { let timestamp = new Date().toISOString().substr(11, 12); let receivedDiv = document.createElement('div'); diff --git a/clients/webassembly/internal-dev/package.json b/wasm/client/internal-dev/package.json similarity index 89% rename from clients/webassembly/internal-dev/package.json rename to wasm/client/internal-dev/package.json index e505483110..3c15217913 100644 --- a/clients/webassembly/internal-dev/package.json +++ b/wasm/client/internal-dev/package.json @@ -28,13 +28,13 @@ }, "homepage": "https://nymtech.net/docs", "devDependencies": { - "copy-webpack-plugin": "^10.2.4", + "copy-webpack-plugin": "^11.0.0", "hello-wasm-pack": "^0.1.0", "webpack": "^5.70.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.7.4" }, "dependencies": { - "@nymproject/nym-client-wasm": "file:../pkg" + "@nymproject/nym-client-wasm": "file:../../../dist/wasm/client" } } diff --git a/clients/webassembly/internal-dev/webpack.config.js b/wasm/client/internal-dev/webpack.config.js similarity index 83% rename from clients/webassembly/internal-dev/webpack.config.js rename to wasm/client/internal-dev/webpack.config.js index 72329630d0..369c59093f 100644 --- a/clients/webassembly/internal-dev/webpack.config.js +++ b/wasm/client/internal-dev/webpack.config.js @@ -15,14 +15,14 @@ module.exports = { path: path.resolve(__dirname, 'dist'), filename: '[name].js', }, - // mode: 'development', - mode: 'production', + mode: 'development', + // mode: 'production', plugins: [ new CopyWebpackPlugin({ patterns: [ 'index.html', { - from: 'node_modules/@nymproject/nym-client-wasm/*.(js|wasm)', + from: '../../../dist/wasm/client/*.(js|wasm)', to: '[name][ext]', }, ], diff --git a/wasm/client/internal-dev/worker.js b/wasm/client/internal-dev/worker.js new file mode 100644 index 0000000000..3cd3246ee0 --- /dev/null +++ b/wasm/client/internal-dev/worker.js @@ -0,0 +1,316 @@ +// Copyright 2020-2023 Nym Technologies SA +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +const RUST_WASM_URL = "nym_client_wasm_bg.wasm" + +importScripts('nym_client_wasm.js'); + +console.log('Initializing worker'); + +// wasm_bindgen creates a global variable (with the exports attached) that is in scope after `importScripts` +const { + default_debug, + no_cover_debug, + NymClientBuilder, + NymClient, + set_panic_hook, + ClientConfig, + GatewayEndpointConfig, + current_network_topology, +} = wasm_bindgen; + +let client = null; + +function dummyTopology() { + const l1Mixnode = { + mixId: 1, + owner: 'n1lftjhnl35cjsfd533zhgrwrspx6qmumd8vjgp9', + host: '80.85.86.75', + mixPort: 1789, + identityKey: '91mNjhJSBkJ9Lb6f1iuYMDQPLiX3kAv6paSUCWjGRwQz', + sphinxKey: 'DmfN1mL1T95nPXvLK44AQKCpW1pStHNQCi6Fgpz5dxDV', + layer: 1, + version: '1.1.20', + }; + const l2Mixnode = { + mixId: 2, + owner: 'n18ztkyh20gwzrel0e5m4sahd358fq9p4skwa7d3', + host: '139.162.199.75', + mixPort: 1789, + identityKey: 'BkLhuKQNyPS19sHZ3HHKCTKwK7hCU6XiFLndyZZHiB7s', + sphinxKey: '7KGC97tJRhJZKhDqFcsp4Vu715VVxizuD7BktnzuSmZC', + layer: 2, + version: '1.1.20', + }; + const l3Mixnode = { + mixId: 3, + owner: 'n1njq8h4nndp7ngays5el2rdp22hq67lwqcaq3ph', + host: '139.162.244.139', + identityKey: 'EPja9Kv8JtPHsFbzPdBQierMu5GmQy5roE5njyD6dmND', + sphinxKey: 'HWpsZChDrtEH8XNscW3qJMRzdCfUD8N8DmMcKqFv7tcf', + layer: 3, + }; + + const gateway = { + owner: 'n1d9lclqnfddgg57xe5p0fw4ng54m9f95hal5tlq', + host: '85.159.211.99', + mixPort: 1789, + clientsPort: 9000, + identityKey: '6pXQcG1Jt9hxBzMgTbQL5Y58z6mu4KXVRbA1idmibwsw', + sphinxKey: 'GSdqV7GFSwHWQrVV13pNLMeafTLDVFKBKVPxuhdGrpR3', + version: '1.1.19', + }; + + const mixnodes = new Map(); + mixnodes.set(1, [l1Mixnode]); + mixnodes.set(2, [l2Mixnode]); + mixnodes.set(3, [l3Mixnode]); + + const gateways = [gateway]; + + return { + mixnodes, gateways + } +} + +function printAndDisplayTestResult(result) { + result.log_details(); + + self.postMessage({ + kind: 'DisplayTesterResults', + args: { + score: result.score(), + sentPackets: result.sent_packets, + receivedPackets: result.received_packets, + receivedAcks: result.received_acks, + duplicatePackets: result.duplicate_packets, + duplicateAcks: result.duplicate_acks, + }, + }); +} + +async function testWithNymClient() { + const preferredGateway = "6pXQcG1Jt9hxBzMgTbQL5Y58z6mu4KXVRbA1idmibwsw"; + const topology = dummyTopology() + + let received = 0 + + const onMessageHandler = (message) => { + received += 1; + self.postMessage({ + kind: 'ReceiveMessage', + args: { + message, + senderTag: undefined, + isMagicPayload: true, + }, + }); + + // it's really up to the user to create proper callback here... + console.log(`received ${received} packets so far`) + }; + + console.log('Instantiating WASM client...'); + + let clientBuilder = NymClientBuilder.new_tester(topology, onMessageHandler, preferredGateway) + console.log('Web worker creating WASM client...'); + let local_client = await clientBuilder.start_client(); + console.log('WASM client running!'); + + const selfAddress = local_client.self_address(); + + // set the global (I guess we don't have to anymore?) + client = local_client; + + console.log(`Client address is ${selfAddress}`); + self.postMessage({ + kind: 'Ready', + args: { + selfAddress, + }, + }); + + // Set callback to handle messages passed to the worker. + self.onmessage = async event => { + console.log(event) + if (event.data && event.data.kind) { + switch (event.data.kind) { + case 'SendMessage': { + const {message, recipient} = event.data.args; + let uint8Array = new TextEncoder().encode(message); + await client.send_regular_message(uint8Array, recipient); + break; + } + case 'MagicPayload': { + const {mixnodeIdentity} = event.data.args; + const req = await client.try_construct_test_packet_request(mixnodeIdentity); + await client.change_hardcoded_topology(req.injectable_topology()); + await client.try_send_test_packets(req); + break; + } + } + } + }; +} + +async function wasm_bindgenSetup(onMessageHandler) { + const preferredGateway = "6qQYb4ArXANU6HJDxzH4PFCUqYb39Dae2Gem2KpxescM"; + const validator = 'https://qa-nym-api.qa.nymte.ch/api'; + + // STEP 1. construct config + // those are just some examples, there are obviously more permutations; + // note, the extra optional argument is of the following type: + // /* + // export interface ClientConfigOpts { + // id?: string; + // nymApi?: string; + // nyxd?: string; + // debug?: DebugWasm; + // } + // */ + // + // const debug = no_cover_debug() + // + // #1 + // const config = new ClientConfig({ id: 'my-awesome-client', nymApi: validator, debug: debug} ); + // #2 + // const config = new ClientConfig({ nymApi: validator, debug: debug} ); + // #3 + // const config = new ClientConfig({ id: 'my-awesome-client' } ); + // + // #4 + const differentDebug = default_debug() + const updatedTraffic = differentDebug.traffic; + updatedTraffic.use_extended_packet_size = true + updatedTraffic.average_packet_delay_ms = 666; + differentDebug.traffic = updatedTraffic; + + const config = new ClientConfig( { debug: differentDebug } ); + // + // // STEP 2. setup the client + // // note, the extra optional argument is of the following type: + // /* + // export interface MixFetchOptsSimple { + // preferredGateway?: string; + // storagePassphrase?: string; + // } + // */ + // #1 + // return await NymClient.newWithConfig(config, onMessageHandler) + // + // #2 + return await NymClient.newWithConfig(config, onMessageHandler, { storagePassphrase: "foomp" }) + // + // #3 + // return await NymClient.newWithConfig(config, onMessageHandler, { storagePassphrase: "foomp", preferredGateway }) +} + +async function nativeSetup(onMessageHandler) { + const preferredGateway = "6qQYb4ArXANU6HJDxzH4PFCUqYb39Dae2Gem2KpxescM"; + const validator = 'https://qa-nym-api.qa.nymte.ch/api'; + + // those are just some examples, there are obviously more permutations; + // note, the extra optional argument is of the following type: + /* + export interface ClientOpts extends ClientOptsSimple { + clientId?: string; + nymApiUrl?: string; + nyxdUrl?: string; + clientOverride?: DebugWasmOverride; + } + + where `DebugWasmOverride` is a rather nested struct that you can look up yourself : ) + */ + + // #1 + // return new NymClient(onMessageHandler) + // #2 + // return new NymClient(onMessageHandler, { nymApiUrl: validator }) + // #3 + const noCoverTrafficOverride = { + traffic: { disableMainPoissonPacketDistribution: true }, + coverTraffic: { disableLoopCoverTrafficStream: true }, + } + + return new NymClient(onMessageHandler, { storagePassphrase: "foomp", nymApiUrl: validator, clientId: "my-client", clientOverride: noCoverTrafficOverride } ) +} + +async function normalNymClientUsage() { + self.postMessage({ kind: 'DisableMagicTestButton' }); + + const onMessageHandler = (message) => { + console.log(message); + self.postMessage({ + kind: 'ReceiveMessage', + args: { + message, + }, + }); + }; + + console.log('Instantiating WASM client...'); + // let localClient = await wasm_bindgenSetup(onMessageHandler) + let localClient = await nativeSetup(onMessageHandler) + console.log('WASM client running!'); + + const selfAddress = localClient.self_address(); + + // set the global (I guess we don't have to anymore?) + client = localClient; + + console.log(`Client address is ${selfAddress}`); + self.postMessage({ + kind: 'Ready', + args: { + selfAddress, + }, + }); + + // Set callback to handle messages passed to the worker. + self.onmessage = async event => { + console.log(event) + if (event.data && event.data.kind) { + switch (event.data.kind) { + case 'SendMessage': { + const {message, recipient} = event.data.args; + let uint8Array = new TextEncoder().encode(message); + await client.send_regular_message(uint8Array, recipient); + break; + } + } + } + }; +} + +async function main() { + console.log(">>>>>>>>>>>>>>>>>>>>> JS WORKER MAIN START"); + + // load rust WASM package + await wasm_bindgen(RUST_WASM_URL); + console.log('Loaded RUST WASM'); + + // sets up better stack traces in case of in-rust panics + set_panic_hook(); + // + // hook-up the whole client for testing (not recommended) + // await testWithNymClient() + // + // 'Normal' client setup (to send 'normal' messages) + await normalNymClientUsage() + // + console.log(">>>>>>>>>>>>>>>>>>>>> JS WORKER MAIN END") +} + +// Let's get started! +main(); \ No newline at end of file diff --git a/wasm/client/internal-dev/yarn-error.log b/wasm/client/internal-dev/yarn-error.log new file mode 100644 index 0000000000..d3dea0efe1 --- /dev/null +++ b/wasm/client/internal-dev/yarn-error.log @@ -0,0 +1,2261 @@ +Arguments: + /Users/jedrzej/.nvm/versions/node/v16.20.0/bin/node /Users/jedrzej/.nvm/versions/node/v16.20.0/bin/yarn install + +PATH: + /Users/jedrzej/.nvm/versions/node/v16.20.0/bin:/Library/Frameworks/Python.framework/Versions/3.11/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Apple/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Users/jedrzej/.cargo/bin:/Users/jedrzej/Library/Application Support/JetBrains/Toolbox/scripts + +Yarn version: + 1.22.19 + +Node version: + 16.20.0 + +Platform: + darwin arm64 + +Trace: + SyntaxError: /Users/jedrzej/workspace/nym/wasm/client/internal-dev/package.json: Unexpected token } in JSON at position 1030 + at JSON.parse () + at /Users/jedrzej/.nvm/versions/node/v16.20.0/lib/node_modules/yarn/lib/cli.js:1629:59 + at Generator.next () + at step (/Users/jedrzej/.nvm/versions/node/v16.20.0/lib/node_modules/yarn/lib/cli.js:310:30) + at /Users/jedrzej/.nvm/versions/node/v16.20.0/lib/node_modules/yarn/lib/cli.js:321:13 + +npm manifest: + { + "name": "create-wasm-app", + "version": "0.1.0", + "description": "create an app to consume rust-generated wasm packages", + "main": "index.js", + "bin": { + "create-wasm-app": ".bin/create-wasm-app.js" + }, + "scripts": { + "build": "webpack --config webpack.config.js", + "build:wasm": "cd ../ && make wasm-build", + "start": "webpack-dev-server --port 8001" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/rustwasm/create-wasm-app.git" + }, + "keywords": [ + "webassembly", + "wasm", + "rust", + "webpack" + ], + "author": "Dave Hrycyszyn ", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/nymtech/nym/issues" + }, + "homepage": "https://nymtech.net/docs", + "devDependencies": { + "copy-webpack-plugin": "^10.2.4", + "hello-wasm-pack": "^0.1.0", + "webpack": "^5.70.0", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.7.4" + }, + "dependencies": { + "@nymproject/nym-client-wasm": "file:../pkg", + } + } + +yarn manifest: + No manifest + +Lockfile: + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. + # yarn lockfile v1 + + + "@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + + "@jridgewell/gen-mapping@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + + "@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + + "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + + "@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + + "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + + "@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + + "@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + + "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + + "@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + + "@nymproject/nym-client-wasm@file:../pkg": + version "1.1.1" + + "@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + + "@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + + "@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + + "@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + + "@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + + "@types/eslint@*": + version "8.37.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" + integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + + "@types/estree@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + + "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.33" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + + "@types/express@*", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + + "@types/http-proxy@^1.17.8": + version "1.17.10" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.10.tgz#e576c8e4a0cc5c6a138819025a88e167ebb38d6c" + integrity sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g== + dependencies: + "@types/node" "*" + + "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + + "@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + + "@types/node@*": + version "18.15.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" + integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== + + "@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + + "@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + + "@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + + "@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + + "@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + dependencies: + "@types/mime" "*" + "@types/node" "*" + + "@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + + "@types/ws@^8.5.1": + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + + "@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + + "@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + + "@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + + "@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + + "@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + + "@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + + "@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + + "@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + + "@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + + "@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + + "@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + + "@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + + "@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + + "@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + + "@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + + "@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + + "@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + + "@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + + "@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + + "@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + + acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + + acorn@^8.5.0, acorn@^8.7.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + + ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + + ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + + ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + + ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + + ajv@^8.0.0, ajv@^8.8.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + + ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + + anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + + array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + + array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + + array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== + + balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + + batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + + binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + + body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + + bonjour-service@^1.0.11: + version "1.1.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + + brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + + braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + + browserslist@^4.14.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + + buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + + bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + + bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + + call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + + caniuse-lite@^1.0.30001449: + version "1.0.30001474" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz#13b6fe301a831fe666cce8ca4ef89352334133d5" + integrity sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q== + + chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + + chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + + clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + + colorette@^2.0.10, colorette@^2.0.14: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + + commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + + commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + + compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + + compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + + concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + + connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + + content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + + content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + + cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + + cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + + copy-webpack-plugin@^10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" + integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg== + dependencies: + fast-glob "^3.2.7" + glob-parent "^6.0.1" + globby "^12.0.2" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + + core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + + cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + + debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + + debug@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + + default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + + define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + + depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + + depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + + destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + + detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + + dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + + dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + + dns-packet@^5.2.2: + version "5.5.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.5.0.tgz#f59cbf3396c130957c56a6ad5fd3959ccdc30065" + integrity sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + + ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + + electron-to-chromium@^1.4.284: + version "1.4.352" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.352.tgz#be96bd7c2f4b980deebc9338a49a67430a33ed73" + integrity sha512-ikFUEyu5/q+wJpMOxWxTaEVk2M1qKqTGKKyfJmod1CPZxKfYnxVS41/GCBQg21ItBpZybyN8sNpRqCUGm+Zc4Q== + + encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + + enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + + envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + + es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + + escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + + escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + + eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + + esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + + estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + + estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + + etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + + eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + + events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + + execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + + express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + + fast-glob@^3.2.7: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + + fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + + fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + + fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + + faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + + fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + + finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + + find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + + follow-redirects@^1.0.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + + forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + + fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + + fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + + fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + + fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + + function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + + get-intrinsic@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + + get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + + glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + + glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + + glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + + glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + + globby@^12.0.2: + version "12.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22" + integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== + dependencies: + array-union "^3.0.1" + dir-glob "^3.0.1" + fast-glob "^3.2.7" + ignore "^5.1.9" + merge2 "^1.4.1" + slash "^4.0.0" + + "go-mix-conn@file:../go-mix-conn/build": + version "0.0.0" + + graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + + handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + + has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + + has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + + has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + + hello-wasm-pack@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/hello-wasm-pack/-/hello-wasm-pack-0.1.0.tgz#482a2e3371828056ac35f5b5fec76c0b99dcd530" + integrity sha512-3hx0GDkDLf/a9ThCMV2qG4mwza8N/MCtm8aeFFc/cdBCL2zMJ1kW1wjNl7xPqD1lz8Yl5+uhnc/cpui4dLwz/w== + + hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + + html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + + http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + + http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + + http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + + http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + + http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + + http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + + human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + + iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + + ignore@^5.1.9: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + + import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + + inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + + inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + + inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + + interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + + ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + + ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + + is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + + is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + + is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + + is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + + is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + + is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + + is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + + is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + + is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + + is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + + isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + + isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + + isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + + jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + + json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + + json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + + json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + + kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + + launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" + + loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + + locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + + media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + + memfs@^3.4.3: + version "3.4.13" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.13.tgz#248a8bd239b3c240175cd5ec548de5227fc4f345" + integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== + dependencies: + fs-monkey "^1.0.3" + + merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + + merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + + merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + + methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + + micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + + mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + + mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + + mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + + mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + + minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + + minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + + ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + + ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + + ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + + multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + + negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + + neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + + node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + + node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + + normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + + npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + + object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + + obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + + on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + + on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + + once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + + onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + + open@^8.0.9: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + + p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + + p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + + p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + + p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + + parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + + path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + + path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + + path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + + path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + + path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + + path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + + picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + + pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + + process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + + proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + + punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + + qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + + queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + + randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + + range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + + raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + + readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + + readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + + readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + + rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + + require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + + requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + + resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + + resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + + resolve@^1.9.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + + retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + + reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + + rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + + run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + + safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + + "safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + + schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + + schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + + select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + + selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + + send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + + serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + + serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + + serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + + setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + + setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + + shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + + shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + + shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + + shell-quote@^1.7.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" + integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== + + side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + + signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + + slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + + sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + + source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + + source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + + spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + + spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + + statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + + "statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + + string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + + string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + + strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + + supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + + supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + + tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + + terser-webpack-plugin@^5.1.3: + version "5.3.7" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" + integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.5" + + terser@^5.16.5: + version "5.16.8" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.8.tgz#ccde583dabe71df3f4ed02b65eb6532e0fae15d5" + integrity sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + + thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + + to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + + toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + + type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + + unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + + update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + + uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + + util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + + utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + + uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + + vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + + watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + + wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + + webpack-cli@^4.9.2: + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + + webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + + webpack-dev-server@^4.7.4: + version "4.13.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz#d97445481d78691efe6d9a3b230833d802fc31f9" + integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + + webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + + webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + + webpack@^5.70.0: + version "5.77.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.77.0.tgz#dea3ad16d7ea6b84aa55fa42f4eac9f30e7eb9b4" + integrity sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + + websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + + websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + + which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + + wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + + wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + + ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== diff --git a/wasm/client/internal-dev/yarn.lock b/wasm/client/internal-dev/yarn.lock new file mode 100644 index 0000000000..3555ea6145 --- /dev/null +++ b/wasm/client/internal-dev/yarn.lock @@ -0,0 +1,2189 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nymproject/nym-client-wasm@file:../../../dist/wasm/client": + version "1.1.1" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.37.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" + integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.33" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-proxy@^1.17.8": + version "1.17.10" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.10.tgz#e576c8e4a0cc5c6a138819025a88e167ebb38d6c" + integrity sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/node@*": + version "18.15.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" + integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/ws@^8.5.1": + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + +"@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn@^8.5.0, acorn@^8.7.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.1.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caniuse-lite@^1.0.30001449: + version "1.0.30001474" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz#13b6fe301a831fe666cce8ca4ef89352334133d5" + integrity sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q== + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-webpack-plugin@^10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" + integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg== + dependencies: + fast-glob "^3.2.7" + glob-parent "^6.0.1" + globby "^12.0.2" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.5.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.5.0.tgz#f59cbf3396c130957c56a6ad5fd3959ccdc30065" + integrity sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.284: + version "1.4.352" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.352.tgz#be96bd7c2f4b980deebc9338a49a67430a33ed73" + integrity sha512-ikFUEyu5/q+wJpMOxWxTaEVk2M1qKqTGKKyfJmod1CPZxKfYnxVS41/GCBQg21ItBpZybyN8sNpRqCUGm+Zc4Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.7: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +follow-redirects@^1.0.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-intrinsic@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globby@^12.0.2: + version "12.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22" + integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== + dependencies: + array-union "^3.0.1" + dir-glob "^3.0.1" + fast-glob "^3.2.7" + ignore "^5.1.9" + merge2 "^1.4.1" + slash "^4.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hello-wasm-pack@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/hello-wasm-pack/-/hello-wasm-pack-0.1.0.tgz#482a2e3371828056ac35f5b5fec76c0b99dcd530" + integrity sha512-3hx0GDkDLf/a9ThCMV2qG4mwza8N/MCtm8aeFFc/cdBCL2zMJ1kW1wjNl7xPqD1lz8Yl5+uhnc/cpui4dLwz/w== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^5.1.9: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.4.3: + version "3.4.13" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.13.tgz#248a8bd239b3c240175cd5ec548de5227fc4f345" + integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== + dependencies: + fs-monkey "^1.0.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.9.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" + integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.3.7" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" + integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.5" + +terser@^5.16.5: + version "5.16.8" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.8.tgz#ccde583dabe71df3f4ed02b65eb6532e0fae15d5" + integrity sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webpack-cli@^4.9.2: + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.7.4: + version "4.13.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz#d97445481d78691efe6d9a3b230833d802fc31f9" + integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.70.0: + version "5.77.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.77.0.tgz#dea3ad16d7ea6b84aa55fa42f4eac9f30e7eb9b4" + integrity sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== diff --git a/clients/webassembly/src/client/mod.rs b/wasm/client/src/client.rs similarity index 63% rename from clients/webassembly/src/client/mod.rs rename to wasm/client/src/client.rs index 733521ea97..e736d972b2 100644 --- a/clients/webassembly/src/client/mod.rs +++ b/wasm/client/src/client.rs @@ -1,41 +1,45 @@ // Copyright 2021-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use self::config::Config; -use crate::client::helpers::{InputSender, NymClientTestRequest, WasmTopologyExt}; -use crate::client::response_pusher::ResponsePusher; -use crate::constants::NODE_TESTER_CLIENT_ID; +use crate::config::{ClientConfig, ClientConfigOpts}; use crate::error::WasmClientError; -use crate::helpers::{ - parse_recipient, parse_sender_tag, setup_from_topology, setup_gateway_from_api, - setup_reply_surb_storage_backend, -}; -use crate::storage::traits::FullWasmClientStorage; -use crate::storage::ClientStorage; -use crate::topology::WasmNymTopology; +use crate::helpers::{InputSender, WasmTopologyExt}; +use crate::response_pusher::ResponsePusher; use js_sys::Promise; -use nym_client_core::client::base_client::{ - BaseClientBuilder, ClientInput, ClientOutput, ClientState, -}; -use nym_client_core::client::inbound_messages::InputMessage; -use nym_credential_storage::ephemeral_storage::EphemeralStorage as EphemeralCredentialStorage; -use nym_sphinx::params::PacketType; -use nym_task::connections::TransmissionLane; -use nym_task::TaskManager; -use nym_topology::provider_trait::{HardcodedTopologyProvider, TopologyProvider}; -use nym_topology::NymTopology; -use nym_validator_client::client::IdentityKey; -use nym_validator_client::QueryReqwestRpcNyxdClient; -use rand::rngs::OsRng; -use rand::RngCore; +use serde::{Deserialize, Serialize}; use std::sync::Arc; +use tsify::Tsify; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::future_to_promise; -use wasm_utils::{check_promise_result, console_log, PromisableResult}; +use wasm_client_core::client::{ + base_client::{BaseClientBuilder, ClientInput, ClientOutput, ClientState}, + inbound_messages::InputMessage, +}; +use wasm_client_core::config::r#override::DebugWasmOverride; +use wasm_client_core::helpers::{ + parse_recipient, parse_sender_tag, setup_from_topology, setup_gateway_from_api, +}; +use wasm_client_core::init::GatewaySetup; +use wasm_client_core::nym_task::connections::TransmissionLane; +use wasm_client_core::nym_task::TaskManager; +use wasm_client_core::storage::core_client_traits::FullWasmClientStorage; +use wasm_client_core::storage::ClientStorage; +use wasm_client_core::topology::WasmNymTopology; +use wasm_client_core::{ + HardcodedTopologyProvider, IdentityKey, NymTopology, PacketType, QueryReqwestRpcNyxdClient, + TopologyProvider, +}; +use wasm_utils::error::PromisableResult; +use wasm_utils::{check_promise_result, console_log}; -pub mod config; -mod helpers; -mod response_pusher; +#[cfg(feature = "node-tester")] +use crate::helpers::{NymClientTestRequest, WasmTopologyTestExt}; + +#[cfg(feature = "node-tester")] +use rand::{rngs::OsRng, RngCore}; + +#[cfg(feature = "node-tester")] +pub(crate) const NODE_TESTER_CLIENT_ID: &str = "_nym-node-tester-client"; #[wasm_bindgen] pub struct NymClient { @@ -54,9 +58,11 @@ pub struct NymClient { packet_type: PacketType, } +// TODO: we don't really need a builder anymore, +// but we might as well leave it for backwards compatibility #[wasm_bindgen] pub struct NymClientBuilder { - config: Config, + config: ClientConfig, custom_topology: Option, preferred_gateway: Option, @@ -68,7 +74,7 @@ pub struct NymClientBuilder { impl NymClientBuilder { #[wasm_bindgen(constructor)] pub fn new( - config: Config, + config: ClientConfig, on_message: js_sys::Function, preferred_gateway: Option, storage_passphrase: Option, @@ -78,6 +84,7 @@ impl NymClientBuilder { custom_topology: None, storage_passphrase, on_message, + // on_mix_fetch_message: Some(on_mix_fetch_message), preferred_gateway, } } @@ -86,26 +93,27 @@ impl NymClientBuilder { // no poisson delay // hardcoded topology // NOTE: you most likely want to use `[NymNodeTester]` instead. + #[cfg(feature = "node-tester")] pub fn new_tester( topology: WasmNymTopology, on_message: js_sys::Function, gateway: Option, - ) -> Self { + ) -> Result { if let Some(gateway_id) = &gateway { if !topology.ensure_contains_gateway_id(gateway_id) { panic!("the specified topology does not contain the gateway used by the client") } } - let full_config = Config::new_tester_config(NODE_TESTER_CLIENT_ID); + let full_config = ClientConfig::new_tester_config(NODE_TESTER_CLIENT_ID); - NymClientBuilder { + Ok(NymClientBuilder { config: full_config, - custom_topology: Some(topology.into()), + custom_topology: Some(topology.try_into()?), on_message, storage_passphrase: None, preferred_gateway: gateway, - } + }) } fn start_reconstructed_pusher(client_output: ClientOutput, on_message: js_sys::Function) { @@ -120,12 +128,11 @@ impl NymClientBuilder { } } - fn initialise_storage(config: &Config, base_storage: ClientStorage) -> FullWasmClientStorage { - FullWasmClientStorage { - keys_and_gateway_store: base_storage, - reply_storage: setup_reply_surb_storage_backend(config.base.debug.reply_surbs), - credential_storage: EphemeralCredentialStorage::default(), - } + fn initialise_storage( + config: &ClientConfig, + base_storage: ClientStorage, + ) -> FullWasmClientStorage { + FullWasmClientStorage::new(&config.base, base_storage) } async fn start_client_async(mut self) -> Result { @@ -141,7 +148,7 @@ impl NymClientBuilder { let user_chosen = self.preferred_gateway.clone(); // if we provided hardcoded topology, get gateway from it, otherwise get it the 'standard' way - if let Some(topology) = &self.custom_topology { + let init_res = if let Some(topology) = &self.custom_topology { setup_from_topology(user_chosen, topology, &client_store).await? } else { setup_gateway_from_api(&client_store, user_chosen, &nym_api_endpoints).await? @@ -151,15 +158,20 @@ impl NymClientBuilder { let storage = Self::initialise_storage(&self.config, client_store); let maybe_topology_provider = self.topology_provider(); - let mut base_builder: BaseClientBuilder<_, FullWasmClientStorage> = - BaseClientBuilder::::new( - &self.config.base, - storage, - None, - ); + let mut base_builder = BaseClientBuilder::::new( + &self.config.base, + storage, + None, + ); if let Some(topology_provider) = maybe_topology_provider { base_builder = base_builder.with_topology_provider(topology_provider); } + if let Some(authenticated_ephemeral_client) = init_res.authenticated_ephemeral_client { + base_builder = base_builder.with_gateway_setup(GatewaySetup::ReuseConnection { + authenticated_ephemeral_client, + details: init_res.details, + }); + } let mut started_client = base_builder.start_base().await?; let self_address = started_client.address.to_string(); @@ -184,38 +196,113 @@ impl NymClientBuilder { } } +#[derive(Tsify, Debug, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct ClientOptsSimple { + // ideally we'd have used the `IdentityKey` type alias, but that'd be extremely annoying to get working in TS + #[tsify(optional)] + pub(crate) preferred_gateway: Option, + + #[tsify(optional)] + pub(crate) storage_passphrase: Option, +} + +#[derive(Tsify, Debug, Default, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct ClientOpts { + #[serde(flatten)] + pub(crate) base: Option, + + #[tsify(optional)] + pub(crate) client_id: Option, + + #[tsify(optional)] + pub(crate) nym_api_url: Option, + + // currently not used, but will be required once we have coconut + #[tsify(optional)] + pub(crate) nyxd_url: Option, + + #[tsify(optional)] + pub(crate) client_override: Option, +} + +impl<'a> From<&'a ClientOpts> for ClientConfigOpts { + fn from(value: &'a ClientOpts) -> Self { + ClientConfigOpts { + id: value.client_id.as_ref().map(|v| v.to_owned()), + nym_api: value.nym_api_url.as_ref().map(|v| v.to_owned()), + nyxd: value.nyxd_url.as_ref().map(|v| v.to_owned()), + debug: value.client_override.as_ref().map(|&v| v.into()), + } + } +} + #[wasm_bindgen] impl NymClient { async fn _new( - config: Config, + config: ClientConfig, on_message: js_sys::Function, - preferred_gateway: Option, - storage_passphrase: Option, + opts: Option, ) -> Result { - NymClientBuilder::new(config, on_message, preferred_gateway, storage_passphrase) - .start_client_async() - .await + if let Some(opts) = opts { + let preferred_gateway = opts.preferred_gateway; + let storage_passphrase = opts.storage_passphrase; + NymClientBuilder::new(config, on_message, preferred_gateway, storage_passphrase) + } else { + NymClientBuilder::new(config, on_message, None, None) + } + .start_client_async() + .await } #[wasm_bindgen(constructor)] #[allow(clippy::new_ret_no_self)] - pub fn new( - config: Config, - on_message: js_sys::Function, - preferred_gateway: Option, - storage_passphrase: Option, - ) -> Promise { + pub fn new(on_message: js_sys::Function, opts: Option) -> Promise { + let opts = opts.unwrap_or_default(); + let mut config = check_promise_result!(ClientConfig::new((&opts).into())); + + if let Some(dbg) = opts.client_override { + config.override_debug(dbg); + } + future_to_promise(async move { - Self::_new(config, on_message, preferred_gateway, storage_passphrase) + Self::_new(config, on_message, opts.base) .await .into_promise_result() }) } + #[wasm_bindgen(js_name = "newWithConfig")] + pub fn new_with_config( + config: ClientConfig, + on_message: js_sys::Function, + opts: ClientOptsSimple, + ) -> Promise { + future_to_promise(async move { + Self::_new(config, on_message, Some(opts)) + .await + .into_promise_result() + }) + } + + // no cover traffic + // no poisson delay + // hardcoded topology + // NOTE: you most likely want to use `[NymNodeTester]` instead. + #[cfg(feature = "node-tester")] + #[wasm_bindgen(js_name = "newTester")] + pub fn new_tester() -> Promise { + todo!() + } + pub fn self_address(&self) -> String { self.self_address.clone() } + #[cfg(feature = "node-tester")] pub fn try_construct_test_packet_request( &self, mixnode_identity: String, @@ -239,6 +326,7 @@ impl NymClient { /// Sends a test packet through the current network topology. /// It's the responsibility of the caller to ensure the correct topology has been injected and /// correct onmessage handlers have been setup. + #[cfg(feature = "node-tester")] pub fn try_send_test_packets(&mut self, request: NymClientTestRequest) -> Promise { // TOOD: use the premade packets instead console_log!( diff --git a/wasm/client/src/config.rs b/wasm/client/src/config.rs new file mode 100644 index 0000000000..da33746d34 --- /dev/null +++ b/wasm/client/src/config.rs @@ -0,0 +1,63 @@ +// Copyright 2022-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::error::WasmClientError; +use serde::{Deserialize, Serialize}; +use tsify::Tsify; +use wasm_bindgen::prelude::*; +use wasm_client_core::config::{new_base_client_config, BaseClientConfig, ConfigDebug, DebugWasm}; + +pub const DEFAULT_CLIENT_ID: &str = "nym-mixnet-client"; + +#[wasm_bindgen] +#[derive(Debug, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct ClientConfig { + pub(crate) base: BaseClientConfig, +} + +#[derive(Tsify, Debug, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct ClientConfigOpts { + #[tsify(optional)] + pub id: Option, + + #[tsify(optional)] + pub nym_api: Option, + + #[tsify(optional)] + pub nyxd: Option, + + #[tsify(optional)] + pub debug: Option, +} + +#[wasm_bindgen] +impl ClientConfig { + #[wasm_bindgen(constructor)] + pub fn new(opts: ClientConfigOpts) -> Result { + let version = env!("CARGO_PKG_VERSION").to_string(); + let id = opts.id.unwrap_or_else(|| DEFAULT_CLIENT_ID.to_string()); + + Ok(ClientConfig { + base: new_base_client_config(id, version, opts.nym_api, opts.nyxd, opts.debug)?, + }) + } + + #[cfg(feature = "node-tester")] + pub(crate) fn new_tester_config>(id: S) -> Self { + ClientConfig { + base: BaseClientConfig::new(id.into(), env!("CARGO_PKG_VERSION").to_string()) + .with_disabled_credentials(true) + .with_disabled_cover_traffic(true) + .with_disabled_topology_refresh(true), + } + } +} + +impl ClientConfig { + pub fn override_debug>(&mut self, debug: D) { + self.base.debug = debug.into(); + } +} diff --git a/clients/webassembly/src/encoded_payload_helper.rs b/wasm/client/src/encoded_payload_helper.rs similarity index 100% rename from clients/webassembly/src/encoded_payload_helper.rs rename to wasm/client/src/encoded_payload_helper.rs diff --git a/wasm/client/src/error.rs b/wasm/client/src/error.rs new file mode 100644 index 0000000000..0a01c97867 --- /dev/null +++ b/wasm/client/src/error.rs @@ -0,0 +1,51 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use js_sys::Promise; +use thiserror::Error; +use wasm_client_core::error::WasmCoreError; +use wasm_client_core::topology::WasmTopologyError; +use wasm_client_core::ClientCoreError; +use wasm_utils::wasm_error; + +#[cfg(feature = "node-tester")] +use nym_node_tester_utils::error::NetworkTestingError; + +#[derive(Debug, Error)] +pub enum WasmClientError { + #[error(transparent)] + CoreError { + #[from] + source: WasmCoreError, + }, + + #[error("failed to parse mix config options: {source}")] + MalformedConfigOptions { + #[from] + source: serde_wasm_bindgen::Error, + }, + + #[error("provided topology was malformed: {source}")] + InvalidTopology { + #[from] + source: WasmTopologyError, + }, + + #[cfg(feature = "node-tester")] + #[error("failed to test the node: {source}")] + NodeTestingFailure { + #[from] + source: NetworkTestingError, + }, +} + +// I dislike this so much - there must be a better way. +impl From for WasmClientError { + fn from(value: ClientCoreError) -> Self { + WasmClientError::CoreError { + source: WasmCoreError::BaseClientError { source: value }, + } + } +} + +wasm_error!(WasmClientError); diff --git a/clients/webassembly/src/client/helpers.rs b/wasm/client/src/helpers.rs similarity index 74% rename from clients/webassembly/src/client/helpers.rs rename to wasm/client/src/helpers.rs index 7d5373853b..c4c234c880 100644 --- a/clients/webassembly/src/client/helpers.rs +++ b/wasm/client/src/helpers.rs @@ -1,20 +1,28 @@ // Copyright 2022-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::error::WasmClientError; -use crate::tester::helpers::WasmTestMessageExt; -use crate::tester::{NodeTestMessage, DEFAULT_TEST_PACKETS}; -use crate::topology::WasmNymTopology; use js_sys::Promise; -use nym_client_core::client::base_client::{ClientInput, ClientState}; -use nym_client_core::client::inbound_messages::InputMessage; -use nym_topology::{MixLayer, NymTopology}; use std::sync::Arc; -use wasm_bindgen::prelude::*; use wasm_bindgen::JsValue; use wasm_bindgen_futures::future_to_promise; -use wasm_utils::{console_log, simple_js_error}; +use wasm_client_core::client::base_client::{ClientInput, ClientState}; +use wasm_client_core::client::inbound_messages::InputMessage; +use wasm_client_core::error::WasmCoreError; +use wasm_client_core::topology::WasmNymTopology; +use wasm_client_core::{MixLayer, NymTopology}; +use wasm_utils::error::simple_js_error; +use wasm_utils::{check_promise_result, console_log}; +#[cfg(feature = "node-tester")] +use nym_node_tester_wasm::types::{NodeTestMessage, WasmTestMessageExt}; + +#[cfg(feature = "node-tester")] +use wasm_bindgen::prelude::wasm_bindgen; + +#[cfg(feature = "node-tester")] +pub(crate) const DEFAULT_TEST_PACKETS: u32 = 20; + +#[cfg(feature = "node-tester")] #[wasm_bindgen] pub struct NymClientTestRequest { // serialized NodeTestMessage @@ -25,6 +33,7 @@ pub struct NymClientTestRequest { pub(crate) testable_topology: NymTopology, } +#[cfg(feature = "node-tester")] #[wasm_bindgen] impl NymClientTestRequest { pub fn injectable_topology(&self) -> WasmNymTopology { @@ -76,7 +85,10 @@ pub(crate) trait WasmTopologyExt { /// Checks whether the provided node exists in the known network topology and if so, returns its layer. fn check_for_mixnode_existence(&self, mixnode_identity: String) -> Promise; +} +#[cfg(feature = "node-tester")] +pub(crate) trait WasmTopologyTestExt { /// Creates a `NymClientTestRequest` with a variant of `this` topology where the target node is the only one on its layer. fn mix_test_request( &self, @@ -88,9 +100,10 @@ pub(crate) trait WasmTopologyExt { impl WasmTopologyExt for Arc { fn change_hardcoded_topology(&self, topology: WasmNymTopology) -> Promise { + let nym_topology: NymTopology = check_promise_result!(topology.try_into()); + let this = Arc::clone(self); future_to_promise(async move { - let nym_topology: NymTopology = topology.into(); console_log!("changing topology to {nym_topology:?}"); this.topology_accessor .manually_change_topology(nym_topology) @@ -103,8 +116,11 @@ impl WasmTopologyExt for Arc { let this = Arc::clone(self); future_to_promise(async move { match this.topology_accessor.current_topology().await { - Some(topology) => Ok(JsValue::from(WasmNymTopology::from(topology))), - None => Err(WasmClientError::UnavailableNetworkTopology.into()), + Some(topology) => Ok(serde_wasm_bindgen::to_value(&WasmNymTopology::from( + topology, + )) + .expect("WasmNymTopology failed serialization")), + None => Err(WasmCoreError::UnavailableNetworkTopology.into()), } }) } @@ -114,16 +130,19 @@ impl WasmTopologyExt for Arc { let this = Arc::clone(self); future_to_promise(async move { let Some(current_topology) = this.topology_accessor.current_topology().await else { - return Err(WasmClientError::UnavailableNetworkTopology.into()); + return Err(WasmCoreError::UnavailableNetworkTopology.into()); }; match current_topology.find_mix_by_identity(&mixnode_identity) { - None => Err(WasmClientError::NonExistentMixnode { mixnode_identity }.into()), + None => Err(WasmCoreError::NonExistentMixnode { mixnode_identity }.into()), Some(node) => Ok(JsValue::from(MixLayer::from(node.layer))), } }) } +} +#[cfg(feature = "node-tester")] +impl WasmTopologyTestExt for Arc { fn mix_test_request( &self, test_id: u32, @@ -135,16 +154,16 @@ impl WasmTopologyExt for Arc { let this = Arc::clone(self); future_to_promise(async move { let Some(current_topology) = this.topology_accessor.current_topology().await else { - return Err(WasmClientError::UnavailableNetworkTopology.into()); + return Err(WasmCoreError::UnavailableNetworkTopology.into()); }; let Some(mix) = current_topology.find_mix_by_identity(&mixnode_identity) else { - return Err(WasmClientError::NonExistentMixnode { mixnode_identity }.into()); + return Err(WasmCoreError::NonExistentMixnode { mixnode_identity }.into()); }; let ext = WasmTestMessageExt::new(test_id); let test_msgs = NodeTestMessage::mix_plaintexts(mix, num_test_packets, ext) - .map_err(WasmClientError::from)?; + .map_err(crate::error::WasmClientError::from)?; let mut updated = current_topology.clone(); updated.set_mixes_in_layer(mix.layer.into(), vec![mix.to_owned()]); diff --git a/wasm/client/src/lib.rs b/wasm/client/src/lib.rs new file mode 100644 index 0000000000..a04440410d --- /dev/null +++ b/wasm/client/src/lib.rs @@ -0,0 +1,23 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +#[cfg(target_arch = "wasm32")] +pub mod client; + +#[cfg(target_arch = "wasm32")] +pub mod config; + +#[cfg(target_arch = "wasm32")] +pub mod error; + +#[cfg(target_arch = "wasm32")] +mod helpers; + +#[cfg(target_arch = "wasm32")] +mod response_pusher; + +#[cfg(target_arch = "wasm32")] +pub use wasm_client_core::set_panic_hook; + +#[cfg(target_arch = "wasm32")] +pub mod encoded_payload_helper; diff --git a/clients/webassembly/src/client/response_pusher.rs b/wasm/client/src/response_pusher.rs similarity index 87% rename from clients/webassembly/src/client/response_pusher.rs rename to wasm/client/src/response_pusher.rs index 642fb951e7..42d88a86c8 100644 --- a/clients/webassembly/src/client/response_pusher.rs +++ b/wasm/client/src/response_pusher.rs @@ -4,12 +4,12 @@ use futures::channel::mpsc; use futures::StreamExt; use js_sys::Uint8Array; -use nym_client_core::client::base_client::ClientOutput; -use nym_client_core::client::received_buffer::{ - ReceivedBufferMessage, ReconstructedMessagesReceiver, -}; use wasm_bindgen::JsValue; use wasm_bindgen_futures::spawn_local; +use wasm_client_core::client::base_client::ClientOutput; +use wasm_client_core::client::received_buffer::{ + ReceivedBufferMessage, ReconstructedMessagesReceiver, +}; use wasm_utils::console_error; pub(crate) struct ResponsePusher { @@ -18,7 +18,11 @@ pub(crate) struct ResponsePusher { } impl ResponsePusher { - pub(crate) fn new(client_output: ClientOutput, on_message: js_sys::Function) -> Self { + pub(crate) fn new( + client_output: ClientOutput, + on_message: js_sys::Function, + // on_mix_fetch_message: js_sys::Function, + ) -> Self { // register our output let (reconstructed_sender, reconstructed_receiver) = mpsc::unbounded(); diff --git a/wasm/full-nym-wasm/.cargo/config.toml b/wasm/full-nym-wasm/.cargo/config.toml new file mode 100644 index 0000000000..bdbe517658 --- /dev/null +++ b/wasm/full-nym-wasm/.cargo/config.toml @@ -0,0 +1,3 @@ +[build] +target = "wasm32-unknown-unknown" +target_arch = "wasm32" diff --git a/wasm/full-nym-wasm/Cargo.toml b/wasm/full-nym-wasm/Cargo.toml new file mode 100644 index 0000000000..4570ba5a04 --- /dev/null +++ b/wasm/full-nym-wasm/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "nym-wasm-sdk" +authors = ["Jedrzej Stuczynski "] +version = "1.2.0-rc.2" +edition = "2021" +keywords = ["nym", "sphinx", "wasm", "webassembly", "privacy"] +license = "Apache-2.0" +repository = "https://github.com/nymtech/nym" +rust-version = "1.56" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +nym-client-wasm = { path = "../client", optional = true } +nym-node-tester-wasm = { path = "../node-tester", optional = true } +mix-fetch-wasm = { path = "../mix-fetch", optional = true } + +[features] +default = ["client", "node-tester"] +client = ["nym-client-wasm"] +node-tester = ["nym-node-tester-wasm"] +mix-fetch = ["mix-fetch-wasm"] + +[package.metadata.wasm-pack.profile.release] +wasm-opt = false + +[profile.release] +lto = true +opt-level = 'z' diff --git a/wasm/full-nym-wasm/Makefile b/wasm/full-nym-wasm/Makefile new file mode 100644 index 0000000000..686af08cc4 --- /dev/null +++ b/wasm/full-nym-wasm/Makefile @@ -0,0 +1,3 @@ +build-full: + wasm-pack build --all-features --scope nymproject --target web --out-dir ../../dist/wasm/full-nym-wasm + wasm-opt -Oz -o ../../dist/wasm/full-nym-wasm/nym_wasm_sdk_bg.wasm ../../dist/wasm/full-nym-wasm/nym_wasm_sdk_bg.wasm diff --git a/wasm/full-nym-wasm/src/lib.rs b/wasm/full-nym-wasm/src/lib.rs new file mode 100644 index 0000000000..8f2009bcbf --- /dev/null +++ b/wasm/full-nym-wasm/src/lib.rs @@ -0,0 +1,11 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +#[cfg(all(target_arch = "wasm32", feature = "client"))] +pub use nym_client_wasm as client; + +#[cfg(all(target_arch = "wasm32", feature = "node-tester"))] +pub use nym_node_tester_wasm as node_tester; + +#[cfg(all(target_arch = "wasm32", feature = "mix-fetch"))] +pub use mix_fetch_wasm as mix_fetch; diff --git a/wasm/mix-fetch/.cargo/config.toml b/wasm/mix-fetch/.cargo/config.toml new file mode 100644 index 0000000000..bdbe517658 --- /dev/null +++ b/wasm/mix-fetch/.cargo/config.toml @@ -0,0 +1,3 @@ +[build] +target = "wasm32-unknown-unknown" +target_arch = "wasm32" diff --git a/wasm/mix-fetch/Cargo.toml b/wasm/mix-fetch/Cargo.toml new file mode 100644 index 0000000000..96f3526363 --- /dev/null +++ b/wasm/mix-fetch/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "mix-fetch-wasm" +authors = ["Jedrzej Stuczynski "] +version = "1.2.0-rc.2" +edition = "2021" +keywords = ["nym", "fetch", "wasm", "webassembly", "privacy"] +license = "Apache-2.0" +repository = "https://github.com/nymtech/nym" +rust-version = "1.70" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +futures = { workspace = true } +js-sys = { workspace = true } +rand = { version = "0.7.3", features = ["wasm-bindgen"] } +reqwest = { workspace = true, default-features = false } +serde = { workspace = true, features = ["derive"] } +serde-wasm-bindgen = { workspace = true } +tokio = { workspace = true, features = ["sync"] } +url = { workspace = true } +wasm-bindgen = { workspace = true } +wasm-bindgen-futures = { workspace = true } +thiserror = { workspace = true } +tsify = { workspace = true, features = ["js"] } + +nym-socks5-requests = { path = "../../common/socks5/requests" } +nym-ordered-buffer = { path = "../../common/socks5/ordered-buffer" } +nym-service-providers-common = { path = "../../service-providers/common" } +wasm-client-core = { path = "../../common/wasm/client-core" } +wasm-utils = { path = "../../common/wasm/utils" } + +[package.metadata.wasm-pack.profile.release] +wasm-opt = false + +[profile.release] +lto = true +opt-level = 'z' diff --git a/wasm/mix-fetch/Makefile b/wasm/mix-fetch/Makefile new file mode 100644 index 0000000000..3b4568cdb3 --- /dev/null +++ b/wasm/mix-fetch/Makefile @@ -0,0 +1,24 @@ +build: build-go-opt build-rust build-package-json + +check-fmt: check-fmt-go check-fmt-rust + +build-go: + $(MAKE) -C go-mix-conn build-go + +build-go-opt: + $(MAKE) -C go-mix-conn build-go-opt + +build-rust: + wasm-pack build --scope nymproject --target web --out-dir ../../dist/wasm/mix-fetch + wasm-opt -Oz -o ../../dist/wasm/mix-fetch/mix_fetch_wasm_bg.wasm ../../dist/wasm/mix-fetch/mix_fetch_wasm_bg.wasm + +build-package-json: + node build.mjs + +check-fmt-go: + $(MAKE) -C go-mix-conn check-fmt + +check-fmt-rust: + cargo fmt --check + cargo clippy --target wasm32-unknown-unknown -- -Dwarnings + diff --git a/wasm/mix-fetch/build.mjs b/wasm/mix-fetch/build.mjs new file mode 100644 index 0000000000..5626beb736 --- /dev/null +++ b/wasm/mix-fetch/build.mjs @@ -0,0 +1,12 @@ +import fs from 'fs'; + +const packageJson = JSON.parse(fs.readFileSync('../../dist/wasm/mix-fetch/package.json').toString()); + +if (!packageJson.files.includes('go_conn.wasm')) { + packageJson.files.push('go_conn.wasm'); +} +if (!packageJson.files.includes('wasm_exec.js')) { + packageJson.files.push('wasm_exec.js'); +} + +fs.writeFileSync('../../dist/wasm/mix-fetch/package.json', JSON.stringify(packageJson, null, 2)); \ No newline at end of file diff --git a/wasm/mix-fetch/go-mix-conn/.gitignore b/wasm/mix-fetch/go-mix-conn/.gitignore new file mode 100644 index 0000000000..ef21965b69 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/.gitignore @@ -0,0 +1,2 @@ +build/wasm_exec.js +build/main.wasm \ No newline at end of file diff --git a/wasm/mix-fetch/go-mix-conn/Makefile b/wasm/mix-fetch/go-mix-conn/Makefile new file mode 100644 index 0000000000..f03be299e4 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/Makefile @@ -0,0 +1,30 @@ +ifndef $(GOROOT) + GOROOT=$(shell go env GOROOT) + export GOROOT +endif + + +ifndef $(TINYGOROOT) + TINYGOROOT=$(shell tinygo env TINYGOROOT) + export TINYGOROOT +endif + +build-go: + GOOS=js GOARCH=wasm go build -o ../../../dist/wasm/mix-fetch/go_conn.wasm ./cmd/wasm && cp "$(GOROOT)/misc/wasm/wasm_exec.js" ../../../dist/wasm/mix-fetch + +build-go-opt: +# use the -s and -w linker flags to strip the debugging information + GOOS=js GOARCH=wasm go build -ldflags="-s -w" -o ../../../dist/wasm/mix-fetch/go_conn.wasm ./cmd/wasm && cp "$(GOROOT)/misc/wasm/wasm_exec.js" ../../../dist/wasm/mix-fetch +# run wasm-opt to gain few more kb + wasm-opt --enable-bulk-memory -Oz ../../../dist/wasm/mix-fetch/go_conn.wasm -o ../../../dist/wasm/mix-fetch/go_conn.wasm +# finally compress it (... or not?) + +build-tinygo: +# the default stack size of 16kib is insufficient +# note: it seems to leak memory : ( +# ref: https://github.com/tinygo-org/tinygo/issues/1140 +# HOWEVER. it could be severely reduced via: https://github.com/tinygo-org/tinygo/issues/1140#issuecomment-718145455 + tinygo build -o ../../../dist/wasm/mix-fetch/go_conn.wasm -stack-size "32kb" ./cmd/wasm && cp "$(TINYGOROOT)/targets/wasm_exec.js" ../../../dist/wasm/mix-fetch + +check-fmt: + test -z $(gofmt -l .) \ No newline at end of file diff --git a/wasm/mix-fetch/go-mix-conn/cmd/wasm/main.go b/wasm/mix-fetch/go-mix-conn/cmd/wasm/main.go new file mode 100644 index 0000000000..cdd2638cf1 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/cmd/wasm/main.go @@ -0,0 +1,31 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +//go:build js && wasm + +package main + +import ( + "go-mix-conn/internal/bridge/go_bridge" + "go-mix-conn/internal/state" +) + +var done chan struct{} + +func init() { + println("[go init]: go module init") + + done = make(chan struct{}) + state.InitialiseGlobalState() + + println("[go init]: go module init finished") +} + +func main() { + println("[go main]: go module loaded") + + go_bridge.InitialiseGoBridge() + <-done + + println("[go main]: go module finished") +} diff --git a/wasm/mix-fetch/go-mix-conn/go.mod b/wasm/mix-fetch/go-mix-conn/go.mod new file mode 100644 index 0000000000..ff161559bb --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/go.mod @@ -0,0 +1,7 @@ +module go-mix-conn + +go 1.20 + +require golang.org/x/net v0.11.0 + +require golang.org/x/text v0.10.0 // indirect diff --git a/wasm/mix-fetch/go-mix-conn/go.sum b/wasm/mix-fetch/go-mix-conn/go.sum new file mode 100644 index 0000000000..6ea647559f --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/go.sum @@ -0,0 +1,4 @@ +golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= diff --git a/wasm/mix-fetch/go-mix-conn/internal/bridge/go_bridge/go_bridge.go b/wasm/mix-fetch/go-mix-conn/internal/bridge/go_bridge/go_bridge.go new file mode 100644 index 0000000000..234c4cf0e1 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/bridge/go_bridge/go_bridge.go @@ -0,0 +1,150 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package go_bridge + +import ( + "errors" + "fmt" + "go-mix-conn/internal/bridge/rust_bridge" + "go-mix-conn/internal/helpers" + "go-mix-conn/internal/jstypes" + "go-mix-conn/internal/jstypes/conv" + "go-mix-conn/internal/log" + "go-mix-conn/internal/mixfetch" + "syscall/js" + "time" +) + +const ( + // methods exposed by go to rust + goRustBridgeName = "__go_rs_bridge__" +) + +func createGoBridgeObject() js.Value { + js.Global().Set(goRustBridgeName, jstypes.Object.New()) + goBridgeRoot := js.Global().Get(goRustBridgeName) + return goBridgeRoot +} + +func InitialiseGoBridge() { + goBridgeRoot := createGoBridgeObject() + + // user facing methods + js.Global().Set("mixFetch", jstypes.AsyncFunc(mixFetch)) + js.Global().Set("goWasmSetLogging", js.FuncOf(setLoggingLevel)) + + // rust facing methods (don't expose them to the root) + goBridgeRoot.Set("goWasmSetMixFetchRequestTimeout", js.FuncOf(changeRequestTimeout)) + goBridgeRoot.Set("goWasmInjectServerData", js.FuncOf(injectServerData)) + goBridgeRoot.Set("goWasmCloseRemoteSocket", js.FuncOf(closeRemoteSocket)) + goBridgeRoot.Set("goWasmInjectConnError", js.FuncOf(injectConnError)) +} + +func setLoggingLevel(_ js.Value, args []js.Value) any { + if len(args) == 0 { + return errors.New("no arguments passed for `setLoggingLevel`") + } + + if args[0].Type() != js.TypeString { + return errors.New("the provided logging level is not a string") + } + log.SetLoggingLevel(args[0].String()) + return nil +} + +func mixFetch(_ js.Value, args []js.Value) (any, error) { + if !rust_bridge.RsIsInitialised() { + return nil, errors.New("mix fetch hasn't been initialised") + } + + if len(args) == 0 { + return nil, errors.New("no arguments passed for `mixfetch`") + } + + requestConstructor := jstypes.Request + + jsRequest := js.Null() + unsafeCors := false + // that's bit weird. can't use the spread operator + if len(args) == 1 { + jsRequest = requestConstructor.New(args[0]) + } + if len(args) == 2 { + // check for 'MODE_UNSAFE_IGNORE_CORS' + if args[1].Get("mode").String() == jstypes.ModeUnsafeIgnoreCors { + unsafeCors = true + // we need to delete that prop as technically it holds an invalid value to construct `Request` + args[1].Delete("mode") + } + jsRequest = requestConstructor.New(args[0], args[1]) + } + + goRequest, err := conv.ParseJSRequest(jsRequest, unsafeCors) + if err != nil { + return nil, err + } + + return mixfetch.MixFetch(goRequest) +} + +func injectServerData(_ js.Value, args []js.Value) any { + if len(args) != 2 { + return errors.New(fmt.Sprintf("received invalid number of arguments. Got %d but expected 2", len(args))) + } + requestId, err := helpers.ParseRequestId(args[0]) + if err != nil { + return err + } + data, err := helpers.IntoGoBytes(args[1]) + if err != nil { + return err + } + + return mixfetch.InjectServerData(requestId, data) +} + +func injectConnError(_ js.Value, args []js.Value) any { + if len(args) != 2 { + return errors.New(fmt.Sprintf("received invalid number of arguments. Got %d but expected 2", len(args))) + } + + requestId, err := helpers.ParseRequestId(args[0]) + if err != nil { + return err + } + + if args[1].Type() != js.TypeString { + return errors.New("provided error message is not a string") + } + errMsg := args[1].String() + remoteErr := errors.New(errMsg) + + return mixfetch.InjectConnError(requestId, remoteErr) +} + +func closeRemoteSocket(_ js.Value, args []js.Value) any { + if len(args) != 1 { + return errors.New(fmt.Sprintf("received invalid number of arguments. Got %d but expected 1", len(args))) + } + requestId, err := helpers.ParseRequestId(args[0]) + if err != nil { + return err + } + + return mixfetch.CloseRemoteSocket(requestId) +} + +func changeRequestTimeout(_ js.Value, args []js.Value) any { + if len(args) != 1 { + return errors.New(fmt.Sprintf("received invalid number of arguments. Got %d but expected 1", len(args))) + } + + if args[0].Type() != js.TypeNumber { + return errors.New("the provided timeout is not a number") + } + timeoutMs := args[0].Int() + timeout := time.Millisecond * time.Duration(timeoutMs) + + return mixfetch.ChangeRequestTimeout(timeout) +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/bridge/rust_bridge/rust_bridge.go b/wasm/mix-fetch/go-mix-conn/internal/bridge/rust_bridge/rust_bridge.go new file mode 100644 index 0000000000..3c4273eb1a --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/bridge/rust_bridge/rust_bridge.go @@ -0,0 +1,80 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +// it's not a bridge per se, but it makes it easier to keep track of what rust endpoints we're calling from go + +package rust_bridge + +import ( + "go-mix-conn/internal/helpers" + "go-mix-conn/internal/jstypes" + "go-mix-conn/internal/log" + "go-mix-conn/internal/types" + "strconv" + "syscall/js" +) + +const ( + // methods exposed by rust to go + rustGoBridgeName = "__rs_go_bridge__" +) + +func rsBridge() js.Value { + return js.Global().Get(rustGoBridgeName) +} + +func RsSendClientData(requestId types.RequestId, data []byte) error { + log.Debug("calling rust send_client_data") + + rawRequestId := strconv.FormatUint(requestId, 10) + jsBytes := helpers.IntoJsBytes(data) + + sendPromise := rsBridge().Call("send_client_data", rawRequestId, jsBytes) + _, err := jstypes.Await(sendPromise) + if err != nil { + panic("todo: extract error message") + } + return nil +} + +func RsStartNewMixnetRequest(addr string) (types.RequestId, error) { + log.Debug("calling rust start_new_mixnet_connection") + + requestPromise := rsBridge().Call("start_new_mixnet_connection", addr) + rawRequestId, errRes := jstypes.Await(requestPromise) + if errRes != nil { + panic("todo: extract error message") + } + + if len(rawRequestId) != 1 { + panic("todo: handle error here") + } + + requestId, err := helpers.ParseRequestId(rawRequestId[0]) + if err != nil { + return 0, err + } + + log.Debug("started request has id %d", requestId) + + return requestId, err +} + +func RsIsInitialised() bool { + log.Debug("calling rust mix_fetch_initialised") + + return rsBridge().Call("mix_fetch_initialised").Bool() +} + +func RsFinishMixnetConnection(requestId types.RequestId) error { + log.Debug("calling rust finish_mixnet_connection") + + rawRequestId := strconv.FormatUint(requestId, 10) + + finishPromise := rsBridge().Call("finish_mixnet_connection", rawRequestId) + _, err := jstypes.Await(finishPromise) + if err != nil { + panic("todo: extract error message") + } + return nil +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/external/roundtrip_js.go b/wasm/mix-fetch/go-mix-conn/internal/external/roundtrip_js.go new file mode 100644 index 0000000000..547fdc4b42 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/external/roundtrip_js.go @@ -0,0 +1,158 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file: +// https://github.com/golang/go/blob/release-branch.go1.20/LICENSE + +//go:build js && wasm + +package external + +import ( + "errors" + "io" + "syscall/js" +) + +var errClosed = errors.New("net/http: reader is closed") + +// StreamReader implements an io.ReadCloser wrapper for ReadableStream. +// See https://fetch.spec.whatwg.org/#readablestream for more information. +// SOURCE: https://github.com/golang/go/blob/release-branch.go1.20/src/net/http/roundtrip_js.go +type StreamReader struct { + pending []byte + stream js.Value + err error // sticky read error +} + +func NewStreamReader(stream js.Value) *StreamReader { + return &StreamReader{ + stream: stream, + } +} + +// SOURCE: https://github.com/golang/go/blob/release-branch.go1.20/src/net/http/roundtrip_js.go +func (r *StreamReader) Read(p []byte) (n int, err error) { + if r.err != nil { + return 0, r.err + } + if len(r.pending) == 0 { + var ( + bCh = make(chan []byte, 1) + errCh = make(chan error, 1) + ) + success := js.FuncOf(func(this js.Value, args []js.Value) any { + result := args[0] + if result.Get("done").Bool() { + errCh <- io.EOF + return nil + } + value := make([]byte, result.Get("value").Get("byteLength").Int()) + js.CopyBytesToGo(value, result.Get("value")) + bCh <- value + return nil + }) + defer success.Release() + failure := js.FuncOf(func(this js.Value, args []js.Value) any { + // Assumes it's a TypeError. See + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError + // for more information on this type. See + // https://streams.spec.whatwg.org/#byob-reader-read for the spec on + // the read method. + errCh <- errors.New(args[0].Get("message").String()) + return nil + }) + defer failure.Release() + r.stream.Call("read").Call("then", success, failure) + select { + case b := <-bCh: + r.pending = b + case err := <-errCh: + r.err = err + return 0, err + } + } + n = copy(p, r.pending) + r.pending = r.pending[n:] + return n, nil +} + +// SOURCE: https://github.com/golang/go/blob/release-branch.go1.20/src/net/http/roundtrip_js.go +func (r *StreamReader) Close() error { + // This ignores any error returned from cancel method. So far, I did not encounter any concrete + // situation where reporting the error is meaningful. Most users ignore error from resp.Body.Close(). + // If there's a need to report error here, it can be implemented and tested when that need comes up. + r.stream.Call("cancel") + if r.err == nil { + r.err = errClosed + } + return nil +} + +// ArrayReader implements an io.ReadCloser wrapper for ArrayBuffer. +// https://developer.mozilla.org/en-US/docs/Web/API/Body/arrayBuffer. +// SOURCE: https://github.com/golang/go/blob/release-branch.go1.20/src/net/http/roundtrip_js.go +type ArrayReader struct { + arrayPromise js.Value + pending []byte + read bool + err error // sticky read error +} + +func NewArrayReader(arrayPromise js.Value) *ArrayReader { + return &ArrayReader{ + arrayPromise: arrayPromise, + } +} + +// SOURCE: https://github.com/golang/go/blob/release-branch.go1.20/src/net/http/roundtrip_js.go +func (r *ArrayReader) Read(p []byte) (n int, err error) { + if r.err != nil { + return 0, r.err + } + if !r.read { + r.read = true + var ( + bCh = make(chan []byte, 1) + errCh = make(chan error, 1) + ) + success := js.FuncOf(func(this js.Value, args []js.Value) any { + // Wrap the input ArrayBuffer with a Uint8Array + uint8arrayWrapper := js.Global().Get("Uint8Array").New(args[0]) + value := make([]byte, uint8arrayWrapper.Get("byteLength").Int()) + js.CopyBytesToGo(value, uint8arrayWrapper) + bCh <- value + return nil + }) + defer success.Release() + failure := js.FuncOf(func(this js.Value, args []js.Value) any { + // Assumes it's a TypeError. See + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError + // for more information on this type. + // See https://fetch.spec.whatwg.org/#concept-body-consume-body for reasons this might error. + errCh <- errors.New(args[0].Get("message").String()) + return nil + }) + defer failure.Release() + r.arrayPromise.Call("then", success, failure) + select { + case b := <-bCh: + r.pending = b + case err := <-errCh: + return 0, err + } + } + if len(r.pending) == 0 { + return 0, io.EOF + } + n = copy(p, r.pending) + r.pending = r.pending[n:] + return n, nil +} + +// SOURCE: https://github.com/golang/go/blob/release-branch.go1.20/src/net/http/roundtrip_js.go +func (r *ArrayReader) Close() error { + if r.err == nil { + r.err = errClosed + } + return nil +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/external/set.go b/wasm/mix-fetch/go-mix-conn/internal/external/set.go new file mode 100644 index 0000000000..d2c3086bab --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/external/set.go @@ -0,0 +1,26 @@ +package external + +// SOURCE: https://github.com/jub0bs/fcors/blob/main/internal/util/set.go + +// A Set represents a mathematical set whose elements have type E. +type Set[E comparable] map[E]struct{} + +// NewSet returns a Set that contains all of es (and no other elements). +func NewSet[E comparable](es ...E) Set[E] { + set := make(Set[E], len(es)) + for _, e := range es { + set.Add(e) + } + return set +} + +// Add adds e to s. +func (s Set[E]) Add(e E) { + s[e] = struct{}{} +} + +// Contains returns true if e is an element of s, and false otherwise. +func (s Set[E]) Contains(e E) bool { + _, found := s[e] + return found +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/helpers/helpers.go b/wasm/mix-fetch/go-mix-conn/internal/helpers/helpers.go new file mode 100644 index 0000000000..5e3ef3ebd3 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/helpers/helpers.go @@ -0,0 +1,121 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package helpers + +import ( + "errors" + "fmt" + "go-mix-conn/internal/external" + "golang.org/x/net/http/httpguts" + "sort" + "strconv" + "strings" + "syscall/js" +) + +func ParseRequestId(raw js.Value) (uint64, error) { + if raw.Type() != js.TypeString { + return 0, errors.New("the received raw request id was not a string") + } + + return strconv.ParseUint(raw.String(), 10, 64) +} + +func IntoGoBytes(raw js.Value) ([]byte, error) { + if raw.Type() != js.TypeObject { + return nil, errors.New("the received 'bytes' are not an object") + } + lenProp := raw.Get("length") + if lenProp.Type() != js.TypeNumber { + return nil, errors.New("the received 'bytes' object does not have a numerical 'length' property") + } + n := lenProp.Int() + bytes := make([]byte, n) + + // TODO: somehow check that the object is an Uint8Array or Uint8ClampedArray + copied := js.CopyBytesToGo(bytes, raw) + if copied != n { + // I don't see how this could ever be reached, thus panic + panic("somehow copied fewer bytes from JavaScript into Go than what we specified as our buffer") + } + + return bytes, nil +} + +func IntoJsBytes(raw []byte) js.Value { + // "data" is a byte slice, so we need to convert it to a JS Uint8Array object + arrayConstructor := js.Global().Get("Uint8Array") + jsBytes := arrayConstructor.New(len(raw)) + js.CopyBytesToJS(jsBytes, raw) + return jsBytes +} + +func GetStringProperty(obj *js.Value, name string) (string, error) { + val := obj.Get(name) + if val.Type() != js.TypeString { + return "", errors.New(fmt.Sprintf("the property %s is not a string", name)) + } + return val.String(), nil +} + +func IsToken(raw string) bool { + if len(raw) == 0 { + return false + } + for _, b := range []byte(raw) { + if !httpguts.IsTokenRune(rune(b)) { + return false + } + } + return true +} + +func ByteLowercase(s string) string { + return strings.Map(byteLowercaseOne, s) +} + +func byteLowercaseOne(asciiRune rune) rune { + const toLower = 'a' - 'A' + if 'A' <= asciiRune && asciiRune <= 'Z' { + return asciiRune + toLower + } + return asciiRune +} + +func SortedByteLowercase(s []string) []string { + lowercase := make([]string, len(s)) + for i := 0; i < len(s); i++ { + lowercase[i] = ByteLowercase(s[i]) + } + sort.Strings(lowercase) + return lowercase +} + +func Contains(s []string, str string) bool { + for _, v := range s { + if v == str { + return true + } + } + + return false +} + +func Unique(s []string) []string { + uniqueSet := external.NewSet(s...) + + uniqueSlice := make([]string, len(uniqueSet)) + for v := range uniqueSet { + uniqueSlice = append(uniqueSlice, v) + } + return uniqueSlice +} + +func IntoAnySlice(v []js.Value) []any { + s := make([]any, len(v)) + for i, x := range v { + s[i] = x + } + return s +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/jstypes/async.go b/wasm/mix-fetch/go-mix-conn/internal/jstypes/async.go new file mode 100644 index 0000000000..3b8bcfc4be --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/jstypes/async.go @@ -0,0 +1,67 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package jstypes + +import ( + "fmt" + "syscall/js" +) + +type jsFn func(this js.Value, args []js.Value) (any, error) + +// AsyncFunc converts a Go-JS function into a Promise +func AsyncFunc(innerFunc jsFn) js.Func { + return js.FuncOf(func(this js.Value, args []js.Value) any { + handler := js.FuncOf(func(_ js.Value, promFn []js.Value) any { + resolve, reject := promFn[0], promFn[1] + + go func() { + defer func() { + if r := recover(); r != nil { + reject.Invoke(Error.New(fmt.Sprint("panic:", r))) + } + }() + + res, err := innerFunc(this, args) + if err != nil { + reject.Invoke(Error.New(err.Error())) + } else { + resolve.Invoke(res) + } + }() + + return nil + }) + + return Promise.New(handler) + }) +} + +// https://stackoverflow.com/a/68427221 +func Await(awaitable js.Value) ([]js.Value, []js.Value) { + then := make(chan []js.Value) + defer close(then) + thenFunc := js.FuncOf(func(this js.Value, args []js.Value) any { + then <- args + return nil + }) + defer thenFunc.Release() + + catch := make(chan []js.Value) + defer close(catch) + catchFunc := js.FuncOf(func(this js.Value, args []js.Value) any { + catch <- args + return nil + }) + defer catchFunc.Release() + + awaitable.Call("then", thenFunc).Call("catch", catchFunc) + + select { + case result := <-then: + return result, nil + case err := <-catch: + return nil, err + } +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/jstypes/conv/request.go b/wasm/mix-fetch/go-mix-conn/internal/jstypes/conv/request.go new file mode 100644 index 0000000000..b729805b01 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/jstypes/conv/request.go @@ -0,0 +1,413 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package conv + +import ( + "bytes" + "context" + "errors" + "fmt" + "go-mix-conn/internal/external" + "go-mix-conn/internal/helpers" + "go-mix-conn/internal/jstypes" + "go-mix-conn/internal/log" + "go-mix-conn/internal/types" + "io" + "net/http" + "net/url" + "syscall/js" +) + +const ( + fieldRequestMethod = "method" + fieldRequestUrl = "url" + fieldRequestBody = "body" + fieldRequestRedirect = "redirect" + fieldRequestMode = "mode" + fieldRequestCredentials = "credentials" + fieldRequestReferrer = "referrer" + fieldRequestReferrerPolicy = "referrerPolicy" + fieldRequestHeaders = "headers" + fieldRequestCache = "cache" + fieldRequestSignal = "signal" +) + +type ParsedRequest struct { + Request *http.Request + Options *types.RequestOptions +} + +// ParseJSRequest is a reverse of https://github.com/golang/go/blob/release-branch.go1.21/src/net/http/roundtrip_js.go#L91 +// https://developer.mozilla.org/en-US/docs/Web/API/request +// +// Preflight requests: status unknown +/* + Request attributes and their implementation status: + [✅] - supported + [⚠️] - partially supported (some features might be missing) + [❌] - unsupported + [❗] - not applicable / will not support + + [⚠️] body - the current streaming is a bit awkward + [❌] bodyUsed + [❗️] cache + [❌] credentials + [❌] destination + [⚠️] headers - not all headers are properly respected + [❌] integrity + [✅] method + [✅] mode + [✅️] redirect + [❌] referrer + [❌] referrerPolicy + [✅] signal + [✅] url +*/ +func ParseJSRequest(request js.Value, unsafeCors bool) (*ParsedRequest, error) { + // https://github.com/mozilla/gecko-dev/blob/d307d4d9f06dab6d16e963a4318e5e8ff4899141/dom/fetch/Fetch.cpp#L501 + // https://github.com/mozilla/gecko-dev/blob/d307d4d9f06dab6d16e963a4318e5e8ff4899141/dom/fetch/Request.cpp#L270 + + method, err := helpers.GetStringProperty(&request, fieldRequestMethod) + if err != nil { + return nil, err + } + + requestUrl, err := helpers.GetStringProperty(&request, fieldRequestUrl) + if err != nil { + return nil, err + } + + body, err := parseBody(&request) + if err != nil { + return nil, err + } + redirect, err := parseRedirect(&request) + if err != nil { + return nil, err + } + + mode, err := parseMode(&request, unsafeCors) + if err != nil { + return nil, err + } + + credentialsMode, err := parseCredentialsMode(&request) + if err != nil { + return nil, err + } + + referrer, err := parseReferrer(&request) + if err != nil { + return nil, err + } + + referrerPolicy, err := parseRefererPolicy(&request) + if err != nil { + return nil, err + } + + ctx, cancel := context.WithCancel(context.Background()) + if err := dealWithSignal(&request, cancel); err != nil { + return nil, err + } + + // A Request has an associated response tainting, which is "basic", "cors", or "opaque". + // Unless stated otherwise, it is "basic". + // Reference: https://fetch.spec.whatwg.org/#concept-request-response-tainting + responseTainting := jstypes.ResponseTaintingBasic + + options := types.RequestOptions{ + Redirect: redirect, + Mode: mode, + CredentialsMode: credentialsMode, + Referrer: referrer, + ReferrerPolicy: referrerPolicy, + ResponseTainting: responseTainting, + Method: method, + } + + jsHeaders := request.Get(fieldRequestHeaders) + headers, err := parseHeaders(jsHeaders, options, method) + if err != nil { + return nil, err + } + + checkUnsupportedAttributes(&request) + + req, err := http.NewRequestWithContext(ctx, method, requestUrl, body) + if err != nil { + return nil, err + } + req.Header = headers + + log.Debug("constructed Request: %+v", req) + log.Debug("using Options: %s", options) + + return &ParsedRequest{ + Request: req, + Options: &options, + }, nil +} + +func checkUnsupportedAttributes(request *js.Value) { + cache := request.Get(fieldRequestCache) + + if !cache.IsUndefined() { + log.Warn("\"%s\"' attribute is set on the Request - this is not supported by mixFetch", fieldRequestCache) + } + + // TODO: implement more of them +} + +func parseHeaders(headers js.Value, reqOpts types.RequestOptions, method string) (http.Header, error) { + goHeaders := http.Header{} + + if headers.Type() != js.TypeObject { + return nil, errors.New("the Request headers is not an object") + } + headersIter := headers.Call("entries") + + for { + next := headersIter.Call("next") + done := next.Get("done").Bool() + if done { + break + } + keyValue := next.Get("value") + if keyValue.Length() != 2 { + return nil, errors.New("one of the headers has invalid length") + } + key := keyValue.Index(0) + if key.Type() != js.TypeString { + return nil, errors.New("one of the header keys is not a string") + } + + value := keyValue.Index(1) + if value.Type() != js.TypeString { + return nil, errors.New("one of the header values is not a string") + } + ck := http.CanonicalHeaderKey(key.String()) + goHeaders[ck] = append(goHeaders[ck], value.String()) + } + + // add additional headers + + // 3.1.1 + serializedOrigin := &jstypes.Origin + // Reference: https://fetch.spec.whatwg.org/#origin-header + // TODO: 3.1.2: check response tainting + // 3.1.3 + if method != "GET" && method != "HEAD" { + // 3.1.3.1 + if reqOpts.Mode != jstypes.ModeCors { + switch reqOpts.ReferrerPolicy { + case jstypes.ReferrerNoReferrer: + serializedOrigin = nil + case jstypes.ReferrerPolicyNoReferrerWhenDowngrade, jstypes.ReferrerPolicyStrictOrigin, jstypes.ReferrerPolicyStrictOriginWhenCrossOrigin: + panic("unimplemented Referrer policy") + case jstypes.ReferrerPolicySameOrigin: + panic("unimplemented Referrer policy") + } + } + // 3.1.3.2 + if serializedOrigin != nil { + goHeaders.Set(jstypes.HeaderOrigin, *serializedOrigin) + } + } + + return goHeaders, nil +} + +func parseBody(request *js.Value) (io.Reader, error) { + jsBody := request.Get(fieldRequestBody) + var bodyReader io.Reader + if !jsBody.IsUndefined() && !jsBody.IsNull() { + log.Debug("stream body - getReader") + bodyReader = external.NewStreamReader(jsBody.Call("getReader")) + } else { + log.Debug("unstremable body - fallback to ArrayBuffer") + // Fall back to using ArrayBuffer + // https://developer.mozilla.org/en-US/docs/Web/API/Body/arrayBuffer + bodyReader = external.NewArrayReader(request.Call("arrayBuffer")) + } + + bodyBytes, err := io.ReadAll(bodyReader) + if err != nil { + return nil, err + } + // TODO: that seems super awkward. we're constructing a reader only to fully consume it + // and create it all over again so that we the recipient wouldn't complain about content-length + // surely there must be a better way? + return bytes.NewReader(bodyBytes), nil +} + +func parseRedirect(request *js.Value) (string, error) { + redirect := request.Get(fieldRequestRedirect) + if redirect.IsUndefined() || redirect.IsNull() { + // "A Request has an associated Redirect Mode, which is "follow", "error", or "manual". Unless stated otherwise, it is "follow"." + // Reference: https://fetch.spec.whatwg.org/#concept-request + return jstypes.RequestRedirectFollow, nil + } + + if redirect.Type() != js.TypeString { + return "", errors.New("the redirect field is not a string") + } + + redirectString := redirect.String() + switch redirect.String() { + case jstypes.RequestRedirectManual: + return jstypes.RequestRedirectManual, nil + case jstypes.RequestRedirectError: + return jstypes.RequestRedirectError, nil + case jstypes.RequestRedirectFollow: + return jstypes.RequestRedirectFollow, nil + } + + return "", errors.New(fmt.Sprintf("%s is not a valid Redirect", redirectString)) +} + +func parseMode(request *js.Value, unsafeCors bool) (jstypes.Mode, error) { + if unsafeCors { + return jstypes.ModeUnsafeIgnoreCors, nil + } + + mode := request.Get(fieldRequestMode) + if mode.IsUndefined() || mode.IsNull() { + // "Even though the default Request Mode is "no-cors", standards are highly discouraged from using it for new features. It is rather unsafe." + // Reference: https://fetch.spec.whatwg.org/#concept-request-mode + return jstypes.ModeNoCors, nil + } + + if mode.Type() != js.TypeString { + return "", errors.New("the mode field is not a string") + } + + modeString := mode.String() + switch modeString { + case jstypes.ModeCors: + return jstypes.ModeCors, nil + case jstypes.ModeSameOrigin: + return jstypes.ModeSameOrigin, nil + case jstypes.ModeNoCors: + return jstypes.ModeNoCors, nil + case jstypes.ModeUnsafeIgnoreCors: + return jstypes.ModeUnsafeIgnoreCors, nil + case jstypes.ModeNavigate: + return "", errors.New(fmt.Sprintf("%s Mode is not supported", jstypes.ModeNavigate)) + case jstypes.ModeWebsocket: + return "", errors.New(fmt.Sprintf("%s Mode is not supported", jstypes.ModeWebsocket)) + } + + return "", errors.New(fmt.Sprintf("%s is not a valid Mode", modeString)) +} + +func parseCredentialsMode(request *js.Value) (jstypes.CredentialsMode, error) { + credentialsMode := request.Get(fieldRequestCredentials) + if credentialsMode.IsUndefined() || credentialsMode.IsNull() { + // A Request has an associated credentials Mode, which is "omit", "same-origin", or "include". Unless stated otherwise, it is "same-origin". + // Reference: https://fetch.spec.whatwg.org/#concept-request-mode + return jstypes.CredentialsModeSameOrigin, nil + } + + if credentialsMode.Type() != js.TypeString { + return "", errors.New("the credentials field is not a string") + } + + credentialsModeString := credentialsMode.String() + switch credentialsModeString { + case jstypes.CredentialsModeOmit: + return jstypes.CredentialsModeOmit, nil + case jstypes.CredentialsModeInclude: + return jstypes.CredentialsModeInclude, nil + case jstypes.CredentialsModeSameOrigin: + return jstypes.CredentialsModeSameOrigin, nil + } + + return "", errors.New(fmt.Sprintf("%s is not a valid credentials Mode", credentialsModeString)) +} + +func parseReferrer(request *js.Value) (jstypes.Referrer, error) { + referrer := request.Get(fieldRequestReferrer) + if referrer.IsUndefined() || referrer.IsNull() { + // A Request has an associated Referrer, which is "no-Referrer", "client", or a URL. Unless stated otherwise it is "client". + // Reference: https://fetch.spec.whatwg.org/#concept-request-referrer + return jstypes.ReferrerClient, nil + } + + if referrer.Type() != js.TypeString { + return "", errors.New("the referrer field is not a string") + } + + referrerString := referrer.String() + if referrerString == jstypes.ReferrerNoReferrer { + return jstypes.ReferrerNoReferrer, nil + } + + if referrerString == jstypes.ReferrerClient { + return jstypes.ReferrerClient, nil + } + + _, err := url.Parse(referrerString) + if err != nil { + return "", errors.New(fmt.Sprintf("\"%s\" is not a valid URL Referrer: \"%s\"", referrerString, err)) + } + return referrerString, nil +} + +func parseRefererPolicy(request *js.Value) (jstypes.ReferrerPolicy, error) { + referrerPolicy := request.Get(fieldRequestReferrerPolicy) + if referrerPolicy.IsUndefined() || referrerPolicy.IsNull() { + // A Request has an associated Referrer policy, which is a Referrer policy. Unless stated otherwise it is the empty string + // Reference: https://fetch.spec.whatwg.org/#concept-request-referrer-policy + return "", nil + } + + if referrerPolicy.Type() != js.TypeString { + return "", errors.New("the referrerPolicy field is not a string") + } + + referrerPolicyString := referrerPolicy.String() + switch referrerPolicyString { + case "": + return "", nil + case jstypes.ReferrerPolicyNoReferrer: + return jstypes.ReferrerPolicyNoReferrer, nil + case jstypes.ReferrerPolicyNoReferrerWhenDowngrade: + return jstypes.ReferrerPolicyNoReferrerWhenDowngrade, nil + case jstypes.ReferrerPolicyOrigin: + return jstypes.ReferrerPolicyOrigin, nil + case jstypes.ReferrerPolicyOriginWhenCrossOrigin: + return jstypes.ReferrerPolicyOriginWhenCrossOrigin, nil + case jstypes.ReferrerPolicySameOrigin: + return jstypes.ReferrerPolicySameOrigin, nil + case jstypes.ReferrerPolicyStrictOrigin: + return jstypes.ReferrerPolicyStrictOrigin, nil + case jstypes.ReferrerPolicyStrictOriginWhenCrossOrigin: + return jstypes.ReferrerPolicyStrictOriginWhenCrossOrigin, nil + case jstypes.ReferrerPolicyUnsafeUrl: + return jstypes.ReferrerPolicyUnsafeUrl, nil + } + + return "", errors.New(fmt.Sprintf("%s is not a valid Referrer policy", referrerPolicyString)) + +} + +func dealWithSignal(request *js.Value, cancel context.CancelFunc) error { + abortSignal := request.Get(fieldRequestSignal) + if abortSignal.IsUndefined() || abortSignal.IsNull() { + log.Debug("no abort signal passed") + return nil + } + if abortSignal.Type() != js.TypeObject { + return errors.New("passed abort signal is not a valid object") + } + + abortSignal.Call("addEventListener", "abort", js.FuncOf(func(this js.Value, args []js.Value) any { + log.Debug("abort signal called") + cancel() + return nil + })) + + return nil +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/jstypes/conv/response.go b/wasm/mix-fetch/go-mix-conn/internal/jstypes/conv/response.go new file mode 100644 index 0000000000..b1925a9582 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/jstypes/conv/response.go @@ -0,0 +1,350 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package conv + +import ( + "fmt" + "go-mix-conn/internal/external" + "go-mix-conn/internal/helpers" + "go-mix-conn/internal/jstypes" + "go-mix-conn/internal/log" + "go-mix-conn/internal/types" + "io" + "net/http" + "net/url" + "syscall/js" +) + +const ( + fieldResponseStatus = "status" + fieldResponseStatusText = "statusText" + fieldResponseRedirected = "redirected" + fieldResponseType = "type" + fieldResponseHeaders = "headers" + fieldResponseUrl = "url" +) + +type ResponseWrapper struct { + inner *http.Response + ctx *types.RequestContext +} + +func NewResponseWrapper(inner *http.Response, ctx *types.RequestContext) ResponseWrapper { + return ResponseWrapper{ + inner: inner, + ctx: ctx, + } +} + +type InternalResponse struct { + inner *http.Response + responseTainting jstypes.ResponseTainting + responseType jstypes.ResponseType + corsExposedHeaderName []string + urlList []*url.URL + wasRedirected bool +} + +func NewInternalResponse(inner *http.Response, reqOpts *types.RequestOptions, reqCtx *types.RequestContext) InternalResponse { + return InternalResponse{ + inner: inner, + responseTainting: reqOpts.ResponseTainting, + wasRedirected: reqCtx.WasRedirected, + } +} + +// Reference: https://fetch.spec.whatwg.org/#null-body-status +func (IR *InternalResponse) isNullBodyStatus() bool { + return IR.inner.StatusCode == 101 || IR.inner.StatusCode == 103 || IR.inner.StatusCode == 204 || IR.inner.StatusCode == 205 || IR.inner.StatusCode == 304 +} + +func (IR *InternalResponse) allHeaderNames() []string { + keys := make([]string, 0, len(IR.inner.Header)) + + for k, _ := range IR.inner.Header { + keys = append(keys, k) + } + return keys +} + +func (IR *InternalResponse) JSBody() (js.Value, error) { + if IR.inner.Body == nil { + return js.Undefined(), nil + } + + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + log.Error("failed to close the response body: %s", err) + } + }(IR.inner.Body) + + // Read the response body + // TODO: construct streamReader / arrayReader for better compat + data, err := io.ReadAll(IR.inner.Body) + if err != nil { + return js.Undefined(), err + } + + return helpers.IntoJsBytes(data), nil +} + +func (IR *InternalResponse) exposeHeadersNames() []string { + allowed := IR.inner.Header.Values(jstypes.HeaderExposeHeaders) + + allowedSet := external.NewSet(allowed...) + var filtered []string + for key, _ := range IR.inner.Header { + if allowedSet.Contains(key) { + filtered = append(filtered, key) + } + } + + return filtered +} + +// Reference: https://fetch.spec.whatwg.org/#concept-filtered-response-cors +func (IR *InternalResponse) mutIntoBasicResponse() { + IR.responseType = jstypes.ResponseTypeBasic + + newHeaders := http.Header{} + for key, values := range IR.inner.Header { + for _, value := range values { + if !jstypes.ForbiddenResponseHeaderNames.Contains(helpers.ByteLowercase(key)) { + ck := http.CanonicalHeaderKey(key) + newHeaders[ck] = append(newHeaders[ck], value) + } + } + } + IR.inner.Header = newHeaders +} + +// Reference: https://fetch.spec.whatwg.org/#concept-filtered-response-cors +func (IR *InternalResponse) mutIntoCORSResponse() { + IR.responseType = jstypes.ResponseTypeCors + + // TODO: figure out the proper usage of corsExposedHeaderName + + // https://github.com/mozilla/gecko-dev/blob/fabab5d10815c9d7210933379f0357b1cbc9aaaf/dom/fetch/InternalHeaders.cpp#L564 + newHeaders := http.Header{} + //for _, name := range IR.corsExposedHeaderName { + // if safelistedResponseHeaderNames.Contains(byteLowercase(name)) { + // ck := http.CanonicalHeaderKey(name) + // newHeaders[ck] = IR.inner.Header.Values(ck) + // } + //} + + for key, values := range IR.inner.Header { + for _, value := range values { + if jstypes.SafelistedResponseHeaderNames.Contains(helpers.ByteLowercase(key)) { + ck := http.CanonicalHeaderKey(key) + newHeaders[ck] = append(newHeaders[ck], value) + } + } + } + + IR.inner.Header = newHeaders +} + +// Reference: https://fetch.spec.whatwg.org/#concept-filtered-response-opaque +func (IR *InternalResponse) mutIntoOpaqueResponse() { + IR.responseType = jstypes.ResponseTypeOpaque + + // TODO: set URL list to « » + IR.inner.StatusCode = 0 + IR.inner.Status = "" + IR.inner.Header = http.Header{} + IR.inner.Body = nil +} + +// Reference: https://fetch.spec.whatwg.org/#concept-filtered-response-cors +func (IR *InternalResponse) mutIntoOpaqueRedirectResponse() { + IR.responseType = jstypes.ResponseTypeOpaqueRedirect + + IR.inner.StatusCode = 0 + IR.inner.Status = "" + IR.inner.Header = http.Header{} + IR.inner.Body = nil +} + +// OUTSIDE FETCH SPEC +func (IR *InternalResponse) mutIntoUnsafeIgnoreCorsResponse() { + IR.responseType = jstypes.ResponseTypeUnsafeIgnoreCors +} + +func proxyHandlerGet(proxied map[string]any) js.Func { + return js.FuncOf(func(_ js.Value, args []js.Value) any { + // Look at redirecting Method's this: + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy#no_private_property_forwarding + target := args[0] + prop := args[1].String() + receiver := args[2] + + value := target.Get(prop) + if value.Type() == js.TypeFunction { + log.Debug("%s is a function", prop) + return js.FuncOf(func(this js.Value, args []js.Value) any { + if this.Equal(receiver) { + return jstypes.Reflect.Call("apply", value, target, helpers.IntoAnySlice(args)) + } else { + return jstypes.Reflect.Call("apply", value, this, helpers.IntoAnySlice(args)) + } + }) + } + + // we're only proxing "normal" props, not function calls + proxy, ok := proxied[prop] + if ok { + log.Debug("using proxy value for field \"%s\" (changing \"%v\" -> \"%v\")", prop, value, proxy) + + return proxy + } + + return value + }) +} + +func responseProxyHandler(proxied map[string]any) js.Value { + handler := jstypes.Object.New() + handler.Set("get", proxyHandlerGet(proxied)) + return handler +} + +func (IR *InternalResponse) intoJsResponse() (js.Value, error) { + jsBody, err := IR.JSBody() + if err != nil { + return js.Undefined(), err + } + + // Create a Response object and pass the data + // inspired by https://github.com/golang/go/blob/release-branch.go1.21/src/net/http/roundtrip_js.go#L91 + headers := jstypes.Headers.New() + for key, values := range IR.inner.Header { + for _, value := range values { + headers.Call("append", key, value) + } + } + + responseOptions := jstypes.Object.New() + responseOptions.Set(fieldResponseStatus, IR.inner.StatusCode) + responseOptions.Set(fieldResponseStatusText, http.StatusText(IR.inner.StatusCode)) + responseOptions.Set(fieldResponseHeaders, headers) + + proxied := make(map[string]any) + + if IR.responseType != "" { + proxied[fieldResponseType] = IR.responseType + } + + // can't call the constructor properly if the value is outside the "legal" range (i.e. [200, 599]) + // (even though the fetch spec requires something different...) + if IR.inner.StatusCode == 0 { + responseOptions.Set(fieldResponseStatus, 418) + proxied[fieldResponseStatus] = IR.inner.StatusCode + } + + if len(IR.urlList) > 0 { + // "The value of the url property will be the final URL obtained after any redirects." + // source: https://developer.mozilla.org/en-US/docs/Web/API/Response/url + last := IR.urlList[len(IR.urlList)-1] + proxied[fieldResponseUrl] = last.String() + } + + if IR.wasRedirected { + proxied[fieldResponseRedirected] = IR.wasRedirected + } + + responseConstructor := jstypes.Response + response := responseConstructor.New(jsBody, responseOptions) + + for k, v := range proxied { + response.Set(fmt.Sprintf("_%s", k), v) + } + + proxyConstructor := jstypes.Proxy + proxy := proxyConstructor.New(response, responseProxyHandler(proxied)) + + return proxy, nil +} + +// IntoJSResponse is a reverse of https://github.com/golang/go/blob/release-branch.go1.21/src/net/http/roundtrip_js.go#L91 +// https://developer.mozilla.org/en-US/docs/Web/API/response +/* + Response attributes and their implementation status: + [✅] - supported + [⚠️] - partially supported (some features might be missing) + [❌] - unsupported + [❗] - not applicable / will not support + + [⚠️] body - response streaming via ReadableStream is unsupported (TODO: look into https://github.com/golang/go/blob/release-branch.go1.21/src/net/http/roundtrip_js.go#L152-L195 to implement it) + [✅] bodyUsed + [✅] headers + [✅] ok - seems to be handled automagically (presumably via `status`) + [✅] redirected - has to be proxied + [✅] status - has to be proxied when status == 0 + [✅] statusText + [✅] type - has to be proxied + [⚠️] url - not sure if every case is covered +*/ +func IntoJSResponse(resp *ResponseWrapper, opts *types.RequestOptions) (js.Value, error) { + // TODO: check if response is a filtered response + isFilteredResponse := false + + // result of 4.3.6.2.2 + internalResponse := NewInternalResponse(resp.inner, opts, resp.ctx) + if resp.ctx.OverwrittenResponseType == jstypes.ResponseTypeOpaqueRedirect { + isFilteredResponse = true + internalResponse.mutIntoOpaqueRedirectResponse() + } + + // 4.1.14 + if !isFilteredResponse { + // 4.1.14.1 + if opts.ResponseTainting == jstypes.ResponseTaintingCors { + // 4.1.14.1.1 + headerNames := internalResponse.exposeHeadersNames() + if opts.CredentialsMode != jstypes.CredentialsModeInclude && helpers.Contains(headerNames, jstypes.Wildcard) { + // 4.1.14.1.2 + internalResponse.corsExposedHeaderName = helpers.Unique(internalResponse.allHeaderNames()) + } else if len(headerNames) > 0 { + // 4.1.14.1.3 + internalResponse.corsExposedHeaderName = headerNames + } + } + switch opts.ResponseTainting { + case jstypes.ResponseTaintingBasic: + internalResponse.mutIntoBasicResponse() + case jstypes.ResponseTaintingCors: + internalResponse.mutIntoCORSResponse() + case jstypes.ResponseTaintingOpaque: + internalResponse.mutIntoOpaqueResponse() + case jstypes.ResponseTaintingUnsafeIgnoreCors: + internalResponse.mutIntoUnsafeIgnoreCorsResponse() + default: + panic("unreachable") + } + } + + if len(internalResponse.urlList) == 0 { + internalResponse.urlList = []*url.URL{internalResponse.inner.Request.URL} + } + // TODO: 4.1.17 - Redirect-tainted origin + // TODO: 4.1.18 - timing allow flag + + // TODO: 4.1.19 - mixed content check + // TODO: 4.1.19 - Content Security Policy check + // TODO: 4.1.19 - MIME type check + // TODO: 4.1.19 - nosniff check + + // TODO: 4.1.20 + //rangeRequestedFlag := false + //if internalResponse.responseType == types.RESPONSE_TYPE_OPAQUE && internalResponse.inner.Status == 206 + + // 4.1.21 + if (opts.Method == "HEAD" || opts.Method == "CONNECT") || internalResponse.isNullBodyStatus() { + internalResponse.inner.Body = nil + } + + return internalResponse.intoJsResponse() +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/jstypes/globals.go b/wasm/mix-fetch/go-mix-conn/internal/jstypes/globals.go new file mode 100644 index 0000000000..55a18a0792 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/jstypes/globals.go @@ -0,0 +1,30 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package jstypes + +import ( + "fmt" + "net/url" + "syscall/js" +) + +var ( + Error = js.Global().Get("Error") + Promise = js.Global().Get("Promise") + Reflect = js.Global().Get("Reflect") + Object = js.Global().Get("Object") + Origin = js.Global().Get("location").Get("origin").String() + Response = js.Global().Get("Response") + Request = js.Global().Get("Request") + Proxy = js.Global().Get("Proxy") + Headers = js.Global().Get("Headers") +) + +func OriginUrl() *url.URL { + originUrl, originErr := url.Parse(Origin) + if originErr != nil { + panic(fmt.Sprintf("could not obtain origin: %s", originErr)) + } + return originUrl +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/jstypes/headers.go b/wasm/mix-fetch/go-mix-conn/internal/jstypes/headers.go new file mode 100644 index 0000000000..d32ac89bd2 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/jstypes/headers.go @@ -0,0 +1,102 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package jstypes + +import ( + "go-mix-conn/internal/external" + "go-mix-conn/internal/helpers" +) + +const ( + HeaderOrigin = "Origin" + + HeaderRequestMethod = "Access-Control-Request-Method" + HeaderRequestHeaders = "Access-Control-Request-Headers" + HeaderRequestLocalNetwork = "Access-Control-Request-Local-Network" + HeaderRequestPrivateNetwork = "Access-Control-Request-Private-Network" + + HeaderAllowMethods = "Access-Control-Allow-Methods" + HeaderAllowHeaders = "Access-Control-Allow-Headers" + HeaderMageAge = "Access-Control-Max-Age" + HeaderAllowLocalNetwork = "Access-Control-Allow-Local-Network" + HeaderAllowPrivateNetwork = "Access-Control-Allow-Private-Network" + + // Indicates whether the response can be shared, via returning the literal value of the `Origin` request header (which can be `null`) or `*` in a response. + HeaderAllowOrigin = "Access-Control-Allow-Origin" + // Indicates whether the response can be shared when request’s credentials mode is "include". + HeaderAllowCredentials = "Access-Control-Allow-Credentials" + + HeaderExposeHeaders = "Access-Control-Expose-Headers" + + Wildcard = "*" +) + +// see https://fetch.spec.whatwg.org/#forbidden-header-name +var DiscreteForbiddenHeaderNames = external.NewSet( + "accept-charset", + "accept-encoding", + helpers.ByteLowercase(HeaderRequestHeaders), + helpers.ByteLowercase(HeaderRequestMethod), + // see https://wicg.github.io/local-network-access/#forbidden-header-names + helpers.ByteLowercase(HeaderRequestLocalNetwork), + helpers.ByteLowercase(HeaderRequestPrivateNetwork), + "connection", + "content-length", + "cookie", + "cookie2", + "date", + "dnt", + "expect", + "host", + "keep-alive", + helpers.ByteLowercase(HeaderOrigin), + "referer", + "set-cookie", + "te", + "trailer", + "transfer-encoding", + "upgrade", + "via", +) + +// almost always a mistake to allow the following as request headers +// as a result of misunderstanding of the CORS protocol. +var DisallowedRequestHeaderNames = external.NewSet( + helpers.ByteLowercase(Wildcard), + helpers.ByteLowercase(HeaderAllowOrigin), + helpers.ByteLowercase(HeaderAllowCredentials), + helpers.ByteLowercase(HeaderAllowMethods), + helpers.ByteLowercase(HeaderAllowHeaders), + helpers.ByteLowercase(HeaderAllowLocalNetwork), + helpers.ByteLowercase(HeaderAllowPrivateNetwork), + helpers.ByteLowercase(HeaderMageAge), + helpers.ByteLowercase(HeaderExposeHeaders), +) + +// almost always a mistake to expose the following as response headers +var DisallowedResponseHeaderNames = external.NewSet( + helpers.ByteLowercase(Wildcard), + helpers.ByteLowercase(HeaderOrigin), + helpers.ByteLowercase(HeaderRequestMethod), + helpers.ByteLowercase(HeaderRequestHeaders), + helpers.ByteLowercase(HeaderRequestLocalNetwork), + helpers.ByteLowercase(HeaderRequestPrivateNetwork), +) + +// see https://fetch.spec.whatwg.org/#forbidden-response-header-name +var ForbiddenResponseHeaderNames = external.NewSet( + "set-cookie", + "set-cookie2", +) + +// see https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name +var SafelistedResponseHeaderNames = external.NewSet( + "cache-control", + "content-language", + "content-length", + "content-type", + "expires", + "last-modified", + "pragma", +) diff --git a/wasm/mix-fetch/go-mix-conn/internal/jstypes/helpers.go b/wasm/mix-fetch/go-mix-conn/internal/jstypes/helpers.go new file mode 100644 index 0000000000..ba10a05196 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/jstypes/helpers.go @@ -0,0 +1,140 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package jstypes + +import ( + "go-mix-conn/internal/helpers" + "go-mix-conn/internal/log" + "net/http" + "net/url" + "strings" +) + +// see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2 +func IsValidHeaderName(raw string) bool { + return helpers.IsToken(raw) +} + +// see https://fetch.spec.whatwg.org/#forbidden-header-name +func IsForbiddenRequestHeaderName(name string) bool { + if DiscreteForbiddenHeaderNames.Contains(name) { + return true + } + return strings.HasPrefix(name, "proxy-") || + strings.HasPrefix(name, "sec-") +} + +// A CORS-unsafe request-header byte is a byte *byte* for which one of the following is true: +// - byte is less than 0x20 and is not 0x09 HT +// - byte is 0x22 ("), 0x28 (left parenthesis), 0x29 (right parenthesis), 0x3A (:), 0x3C (<), 0x3E (>), 0x3F (?), 0x40 (@), 0x5B ([), 0x5C (\), 0x5D (]), 0x7B ({), 0x7D (}), or 0x7F DEL. +// Reference: https://fetch.spec.whatwg.org/#cors-unsafe-request-header-byte +func containsCORSUnsafeRequestHeaderByte(b []byte) bool { + for i := 0; i < len(b); i++ { + v := b[i] + if v < 0x20 && v != 0x09 { + return true + } + if v == 0x22 || v == 0x28 || v == 0x29 || v == 0x3A || v == 0x3C || v == 0x3E || v == 0x3F || v == 0x40 || v == 0x5B || v == 0x5C || v == 0x5D || v == 0x7B || v == 0x7D || v == 0x7F { + return true + } + } + + return false +} + +// Reference: https://fetch.spec.whatwg.org/#cors-safelisted-request-header +func isCorsSafelistedRequestHeader(name string, value string) bool { + // 1 + if len(value) > 128 { + return false + } + + // 2 + switch helpers.ByteLowercase(name) { + case "accept": + if containsCORSUnsafeRequestHeaderByte([]byte(value)) { + return false + } + case "accept-language", "content-language": + valueBytes := []byte(value) + for i := 0; i < len(valueBytes); i++ { + v := valueBytes[i] + if !(0x30 <= v && v <= 0x39) && !(0x41 <= v && v <= 0x5A) && !(0x61 <= v && v <= 0x7A) && v != 0x20 && v != 0x2A && v != 0x2C && v != 0x2D && v != 0x2E && v != 0x3B && v != 0x3D { + return false + } + } + case "content-type": + // 2.1 + if containsCORSUnsafeRequestHeaderByte([]byte(value)) { + return false + } + // 2.4 + if value != "application/x-www-form-urlencoded" && value != "multipart/form-data" && value != "text/plain" { + return false + } + case "range": + log.Error("unimplemented 'range' header") + return false + default: + return false + } + + // 3 + return true +} + +// Reference: https://fetch.spec.whatwg.org/#cors-unsafe-request-header-names +func CorsUnsafeRequestHeaderNames(headers http.Header) []string { + var unsafeNames []string + var potentiallyUnsafeNames []string + safelistValueSize := 0 + + // 4 + for name, value := range headers { + // TODO: is that actually correct? + wasUnsafe := false + for _, v := range value { + // 4.1 + if !isCorsSafelistedRequestHeader(name, v) { + unsafeNames = append(unsafeNames, name) + wasUnsafe = true + break + } + } + if !wasUnsafe { + potentiallyUnsafeNames = append(potentiallyUnsafeNames, name) + safelistValueSize += len(value) + } + } + + // 5 + if safelistValueSize > 1024 { + for _, name := range potentiallyUnsafeNames { + unsafeNames = append(unsafeNames, name) + } + } + + return helpers.SortedByteLowercase(unsafeNames) +} + +// Reference: https://fetch.spec.whatwg.org/#cors-safelisted-method +func IsCorsSafelistedMethod(method string) bool { + if method == "GET" || method == "HEAD" || method == "POST" { + return true + } else { + return false + } +} + +func IsSameOrigin(remoteUrl *url.URL) bool { + originUrl := OriginUrl() + + // Roughly speaking, two URIs are part of the same JsOrigin (i.e., represent the same principal) + // if they have the same scheme, host, and port. + // Reference: https://www.rfc-editor.org/rfc/rfc6454.html#section-3.2 + if originUrl.Scheme != remoteUrl.Scheme || originUrl.Host != remoteUrl.Host || originUrl.Port() != remoteUrl.Port() { + return false + } + return true +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/jstypes/request.go b/wasm/mix-fetch/go-mix-conn/internal/jstypes/request.go new file mode 100644 index 0000000000..79ec5a1e62 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/jstypes/request.go @@ -0,0 +1,45 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package jstypes + +type Redirect = string +type Mode = string +type CredentialsMode = string +type ResponseTainting = string +type ReferrerPolicy = string +type Referrer = string + +const ( + RequestRedirectError = "error" + RequestRedirectManual = "manual" + RequestRedirectFollow = "follow" + + ResponseTaintingBasic = "basic" + ResponseTaintingCors = "cors" + ResponseTaintingOpaque = "opaque" + ResponseTaintingUnsafeIgnoreCors = "ignore-cors" + + ModeCors = "cors" + ModeSameOrigin = "same-origin" + ModeNoCors = "no-cors" + ModeNavigate = "navigate" + ModeWebsocket = "websocket" + ModeUnsafeIgnoreCors = "unsafe-ignore-cors" + + CredentialsModeOmit = "omit" + CredentialsModeSameOrigin = "same-origin" + CredentialsModeInclude = "include" + + ReferrerPolicyNoReferrer = "no-referrer" + ReferrerPolicyNoReferrerWhenDowngrade = "no-referrer-when-downgrade" + ReferrerPolicyOrigin = "origin" + ReferrerPolicyOriginWhenCrossOrigin = "origin-when-cross-origin" + ReferrerPolicySameOrigin = "same-origin" + ReferrerPolicyStrictOrigin = "strict-origin" + ReferrerPolicyStrictOriginWhenCrossOrigin = "strict-origin-when-cross-origin" + ReferrerPolicyUnsafeUrl = "unsafe-url" + + ReferrerNoReferrer = "no-referrer" + ReferrerClient = "client" +) diff --git a/wasm/mix-fetch/go-mix-conn/internal/jstypes/response.go b/wasm/mix-fetch/go-mix-conn/internal/jstypes/response.go new file mode 100644 index 0000000000..e0f2644347 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/jstypes/response.go @@ -0,0 +1,16 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package jstypes + +type ResponseType = string + +const ( + ResponseTypeBasic = "basic" + ResponseTypeCors = "cors" + ResponseTypeDefault = "default" + ResponseTypeError = "error" + ResponseTypeOpaque = "opaque" + ResponseTypeOpaqueRedirect = "opaqueredirect" + ResponseTypeUnsafeIgnoreCors = "unsafe-ignore-cors" +) diff --git a/wasm/mix-fetch/go-mix-conn/internal/log/logger.go b/wasm/mix-fetch/go-mix-conn/internal/log/logger.go new file mode 100644 index 0000000000..78aafd0107 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/log/logger.go @@ -0,0 +1,100 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package log + +import ( + "fmt" + "runtime" + "strings" + "syscall/js" +) + +type LogLevel = int + +const ( + DISABLED LogLevel = iota + ERROR + WARN + INFO + DEBUG + TRACE +) + +var ( + // thanks to the amazing capabilities of this awesome language, + // we couldn't put it in the `jstypes` alongside other globals + // as it created an unresolvable cyclic import + console = js.Global().Get("console") + + GlobalLogLevel = INFO +) + +func SetLoggingLevel(raw string) { + switch strings.ToLower(raw) { + case "disabled": + GlobalLogLevel = DISABLED + case "error": + GlobalLogLevel = ERROR + case "warn", "warning": + GlobalLogLevel = WARN + case "info": + GlobalLogLevel = INFO + case "debug": + GlobalLogLevel = DEBUG + case "trace": + GlobalLogLevel = TRACE + default: + Warn("\"%s\" is not a valid logging level", raw) + } +} + +func makeLogMessage(severity string, format string, a ...any) string { + _, file, line, ok := runtime.Caller(2) + // we should really be using a mutex here... + if !ok { + file = "???" + line = 0 + } + + prefix := fmt.Sprintf("[go] %s: %s:%d: ", severity, file, line) + suffix := fmt.Sprintf(format, a...) + return prefix + suffix +} + +func Error(format string, a ...any) { + if GlobalLogLevel >= ERROR { + msg := makeLogMessage("ERROR", format, a...) + console.Call("error", msg) + } +} + +func Warn(format string, a ...any) { + if GlobalLogLevel >= WARN { + msg := makeLogMessage("WARN", format, a...) + console.Call("warn", msg) + } +} + +func Info(format string, a ...any) { + if GlobalLogLevel >= INFO { + msg := makeLogMessage("INFO", format, a...) + console.Call("info", msg) + } +} + +func Debug(format string, a ...any) { + if GlobalLogLevel >= DEBUG { + msg := makeLogMessage("DEBUG", format, a...) + // too lazy to configure my console : ) + // console.Call("debug", msg) + console.Call("log", msg) + } +} + +func Trace(format string, a ...any) { + if GlobalLogLevel >= TRACE { + msg := makeLogMessage("TRACE", format, a...) + console.Call("log", msg) + } +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/mixfetch/helpers.go b/wasm/mix-fetch/go-mix-conn/internal/mixfetch/helpers.go new file mode 100644 index 0000000000..23a91b725b --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/mixfetch/helpers.go @@ -0,0 +1,59 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package mixfetch + +import ( + "golang.org/x/net/idna" + "net" + "net/url" + "unicode" +) + +var portMap = map[string]string{ + "http": "80", + "https": "443", + "socks5": "1080", +} + +// canonicalAddr returns url.Host but always with a ":port" suffix. +// source: https://github.com/golang/go/blob/release-branch.go1.20/src/net/http/transport.go#L2747 +func canonicalAddr(url *url.URL) string { + addr := url.Hostname() + if v, err := idnaASCII(addr); err == nil { + addr = v + } + port := url.Port() + if port == "" { + port = portMap[url.Scheme] + } + return net.JoinHostPort(addr, port) +} + +// source: https://github.com/golang/go/blob/release-branch.go1.20/src/net/http/request.go#L724 +func idnaASCII(v string) (string, error) { + // TODO: Consider removing this check after verifying performance is okay. + // Right now punycode verification, length checks, context checks, and the + // permissible character tests are all omitted. It also prevents the ToASCII + // call from salvaging an invalid IDN, when possible. As a result it may be + // possible to have two IDNs that appear identical to the user where the + // ASCII-only version causes an error downstream whereas the non-ASCII + // version does not. + // Note that for correct ASCII IDNs ToASCII will only do considerably more + // work, but it will not cause an allocation. + if isAscii(v) { + return v, nil + } + return idna.Lookup.ToASCII(v) +} + +// isAscii returns whether s is ASCII. +// source: https://github.com/golang/go/blob/release-branch.go1.20/src/net/http/internal/ascii/print.go#L46 +func isAscii(s string) bool { + for i := 0; i < len(s); i++ { + if s[i] > unicode.MaxASCII { + return false + } + } + return true +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/mixfetch/mixfetch.go b/wasm/mix-fetch/go-mix-conn/internal/mixfetch/mixfetch.go new file mode 100644 index 0000000000..8e2e7e0586 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/mixfetch/mixfetch.go @@ -0,0 +1,362 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package mixfetch + +import ( + "context" + "errors" + "fmt" + "go-mix-conn/internal/bridge/rust_bridge" + "go-mix-conn/internal/jstypes" + "go-mix-conn/internal/jstypes/conv" + "go-mix-conn/internal/log" + "go-mix-conn/internal/state" + "go-mix-conn/internal/types" + "net" + "net/http" + "net/url" + "time" +) + +func inRedirectionLoop(req *http.Request, via []*http.Request) bool { + target := req.URL.String() + + for i := 0; i < len(via); i++ { + if target == via[i].URL.String() { + return true + } + } + return false +} + +func checkRedirect(ctx *types.RequestContext, opts *types.RequestOptions, req *http.Request, via []*http.Request) error { + log.Debug("attempting to perform redirection to %s with our policy set to '%s'", req.URL.String(), opts.Redirect) + + if len(via) > state.MaxRedirections { + return errors.New(fmt.Sprintf("Maximum (%d) redirects followed", state.MaxRedirections)) + } + + if inRedirectionLoop(req, via) { + return errors.New("stuck in redirection loop") + } + + redirectionChain := "" + for i := 0; i < len(via); i++ { + redirectionChain += fmt.Sprintf("%s -> ", via[i].URL.String()) + } + redirectionChain += fmt.Sprintf("[%s]", req.URL.String()) + log.Debug("redirection chain: %s", redirectionChain) + + // Reference: https://fetch.spec.whatwg.org/#http-fetch + // 4.3.6.2 + switch opts.Redirect { + case jstypes.RequestRedirectError: + return errors.New("encountered redirect") + case jstypes.RequestRedirectManual: + if opts.Mode == jstypes.ModeNavigate { + return errors.New("unimplemented 'navigate' + 'manual' redirection") + } + ctx.OverwrittenResponseType = jstypes.ResponseTypeOpaqueRedirect + return http.ErrUseLastResponse + case jstypes.RequestRedirectFollow: + log.Debug("will perform redirection") + // this feels so nasty... + ctx.WasRedirected = true + return nil + default: + // if this was rust that had proper enums and match statements, + // we could have guaranteed that at compile time... + panic("unreachable") + } +} + +// 4.1.12 +// Reference: https://fetch.spec.whatwg.org/#main-fetch +func mainFetchChecks(req *conv.ParsedRequest) error { + // >>> START: NOT INCLUDED IN FETCH SPEC + if req.Options.Mode == jstypes.ModeUnsafeIgnoreCors { + // ignore all checks - everything should be accepted + req.Options.ResponseTainting = jstypes.ResponseTaintingUnsafeIgnoreCors + return nil + } + // >>> END: NOT INCLUDED IN FETCH SPEC + + // no preloading + + if (jstypes.IsSameOrigin(req.Request.URL) && req.Options.ResponseTainting == jstypes.ResponseTaintingBasic) || + req.Request.URL.Scheme == "data" || (req.Options.Mode == jstypes.ModeNavigate || req.Options.Mode == jstypes.ModeWebsocket) { + log.Debug("setting response tainting to basic") + req.Options.ResponseTainting = jstypes.ResponseTaintingBasic + // TODO: scheme fetch here + return nil + } + if req.Options.Mode == jstypes.ModeSameOrigin { + return errors.New(fmt.Sprintf("MixFetch API cannot load %s. Request mode is \"%s\" but the URL's origin is not same as the request origin %s.", req.Request.URL.String(), jstypes.ModeSameOrigin, jstypes.Origin)) + } + if req.Options.Mode == jstypes.ModeNoCors { + if req.Options.Redirect != jstypes.RequestRedirectFollow { + return errors.New(fmt.Sprintf("MixFetch API cannot load %s. Request mode is \"%s\", but the redirect mode is not \"%s\".", req.Request.URL.String(), req.Options.Mode, jstypes.RequestRedirectFollow)) + } + log.Debug("setting response tainting to opaque") + req.Options.ResponseTainting = jstypes.ResponseTaintingOpaque + // TODO: scheme fetch here + return nil + } + if req.Request.URL.Scheme != "http" && req.Request.URL.Scheme != "https" { + return errors.New(fmt.Sprintf("The requested url scheme (\"%s\" is not http(s)", req.Request.URL.Scheme)) + } + + // TODO: CORS-preflight flag + // TODO: unsafe-request flag + // (by default they're unset) + corsPreflightFlag := false + unsafeRequestFlag := false + + if corsPreflightFlag || (unsafeRequestFlag && (jstypes.IsCorsSafelistedMethod(req.Request.Method) || len(jstypes.CorsUnsafeRequestHeaderNames(req.Request.Header)) > 0)) { + req.Options.ResponseTainting = jstypes.ResponseTaintingCors + panic("unimplemented \"corsWithPreflightResponse\"") + } + + req.Options.ResponseTainting = jstypes.ResponseTaintingCors + log.Debug("setting response tainting to cors") + // TODO: HTTP fetch here + return nil +} + +func schemeFetch(req *conv.ParsedRequest) error { + switch req.Request.URL.Scheme { + case "about": + return errors.New("unsupported 'about' scheme") + case "blob": + return errors.New("unsupported 'blob' scheme") + case "data": + return errors.New("unsupported 'data' scheme") + case "file": + return errors.New("unsupported 'file' scheme") + case "http", "https": + // TODO: HTTP fetch here + return nil + default: + return errors.New("unknown url scheme") + } +} + +func dialContext(_ctx context.Context, opts *types.RequestOptions, _network, addr string) (net.Conn, error) { + log.Debug("dialing plain connection to %s", addr) + + requestId, err := rust_bridge.RsStartNewMixnetRequest(addr) + if err != nil { + return nil, err + } + if state.ActiveRequests.Exists(requestId) { + return nil, errors.New(fmt.Sprintf("somehow opened duplicate connection with id %d", requestId)) + } + + conn, inj := state.NewFakeConnection(requestId, addr) + state.ActiveRequests.Insert(requestId, addr, inj) + + return conn, nil +} + +func dialTLSContext(_ctx context.Context, opts *types.RequestOptions, _network, addr string) (net.Conn, error) { + log.Debug("dialing TLS connection to %s", addr) + + requestId, err := rust_bridge.RsStartNewMixnetRequest(addr) + if err != nil { + return nil, err + } + if state.ActiveRequests.Exists(requestId) { + return nil, errors.New(fmt.Sprintf("somehow opened duplicate connection with id %d", requestId)) + } + + conn, inj := state.NewFakeTlsConn(requestId, addr) + state.ActiveRequests.Insert(requestId, addr, inj) + + if err := conn.Handshake(); err != nil { + return nil, err + } + + return conn, nil +} + +func buildHttpClient(reqCtx *types.RequestContext, opts *types.RequestOptions) *http.Client { + return &http.Client{ + CheckRedirect: func(req *http.Request, via []*http.Request) error { + return checkRedirect(reqCtx, opts, req, via) + }, + + Transport: &http.Transport{ + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + return dialContext(ctx, opts, network, addr) + }, + DialTLSContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + return dialTLSContext(ctx, opts, network, addr) + }, + + //TLSClientConfig: &tlsConfig, + DisableKeepAlives: true, + MaxIdleConns: 1, + MaxIdleConnsPerHost: 1, + MaxConnsPerHost: 1, + }, + Timeout: state.RequestTimeout, + } +} + +func CloseRemoteSocket(requestId types.RequestId) any { + state.ActiveRequests.CloseRemoteSocket(requestId) + return nil +} + +func InjectServerData(requestId types.RequestId, data []byte) any { + state.ActiveRequests.InjectData(requestId, data) + return nil +} + +func InjectConnError(requestId types.RequestId, err error) any { + state.ActiveRequests.SendError(requestId, err) + return nil +} + +func ChangeRequestTimeout(timeout time.Duration) any { + log.Debug("changing request timeout to %v", timeout) + state.RequestTimeout = timeout + return nil +} + +// Reference: https://fetch.spec.whatwg.org/#cors-check +func doCorsCheck(reqOpts *types.RequestOptions, resp *http.Response) error { + // 4.9.1 + originHeader := resp.Header.Get(jstypes.HeaderAllowOrigin) + // 4.9.2 + if originHeader == "" { + return errors.New(fmt.Sprintf("\"%s\" header not present on remote", jstypes.HeaderAllowOrigin)) + } + + if reqOpts.CredentialsMode != jstypes.CredentialsModeInclude && originHeader == jstypes.Wildcard { + // 4.9.3 + return nil + } + + // 4.9.4 + // TODO: presumably this needs to better account for the wildcard? + if jstypes.Origin != originHeader { + return errors.New(fmt.Sprintf("\"%s\" does not match the origin \"%s\" on \"%s\" remote header", jstypes.Origin, originHeader, jstypes.HeaderAllowOrigin)) + } + + // 4.9.5 + if reqOpts.CredentialsMode != jstypes.CredentialsModeInclude { + return nil + } + + // 4.9.6 + credentials := resp.Header.Get(jstypes.HeaderAllowCredentials) + // 4.9.7 + if credentials == "true" { + return nil + } + + // 4.9.8 + return errors.New("failed cors check") +} + +func performRequest(req *conv.ParsedRequest) (*conv.ResponseWrapper, error) { + err := mainFetchChecks(req) + if err != nil { + return nil, err + } + + reqCtx := &types.RequestContext{} + + reqClient := buildHttpClient(reqCtx, req.Options) + + if req.Options.ReferrerPolicy == "" { + // 4.1.8 + // Reference: https://fetch.spec.whatwg.org/#main-fetch + // TODO: implement + log.Warn("unimplemented: could not obtain referrer policy from the policy container") + } + + if req.Options.Referrer != jstypes.ReferrerNoReferrer { + // 4.1.9 + // Reference: https://fetch.spec.whatwg.org/#main-fetch + // TODO: implement + log.Warn("unimplemented: could not determine request's referrer") + } + + // TODO: this is such a nasty assumption, but assume we're doing a 4.3 HTTP fetch here + + log.Info("Starting the request...") + log.Debug("%v: %v", req.Options, *req.Request) + // TODO: CORS preflight... + + resp, err := reqClient.Do(req.Request) + if err != nil { + return nil, err + } + + // 4.3.4.4 + if req.Options.ResponseTainting == jstypes.ResponseTaintingCors { + err = doCorsCheck(req.Options, resp) + if err != nil { + return nil, err + } + } + // TODO: policy checks, etc... + + wrapper := conv.NewResponseWrapper(resp, reqCtx) + + return &wrapper, err +} + +func onErrCleanup(url *url.URL) { + // TODO: cancel stuff here.... somehow... + + canonicalAddr := canonicalAddr(url) + id := state.ActiveRequests.GetId(canonicalAddr) + // TODO: can we guarantee that rust is not holding any references to that id (that we don't know on this side)? + if id == 0 { + // if id doesn't exist it [probably] means the error was thrown before the request was properly created + log.Debug("there doesn't seem to exist a request associated with addr %s", canonicalAddr) + return + } + state.ActiveRequests.Remove(id) + err := rust_bridge.RsFinishMixnetConnection(id) + if err != nil { + // TODO: can we do anything else in here? + log.Error("failed to properly abort the request: %s", err) + } +} + +func MixFetch(request *conv.ParsedRequest) (any, error) { + log.Info("_mixFetch: start") + + canonical := canonicalAddr(request.Request.URL) + if state.ActiveRequests.ExistsCanonical(canonical) { + // TODO: how to deal with it to allow for concurrent requests to say `https://foo.com/index.html` and `https://foo.com/index.js`? + return nil, errors.New(fmt.Sprintf("there is already an active request for %s", canonical)) + } + + resCh := make(chan *conv.ResponseWrapper) + errCh := make(chan error) + go func(resCh chan *conv.ResponseWrapper, errCh chan error) { + resp, err := performRequest(request) + if err != nil { + errCh <- err + } else { + resCh <- resp + } + }(resCh, errCh) + + select { + case res := <-resCh: + log.Debug("finished performing the request") + log.Trace("response: %+v", *res) + return conv.IntoJSResponse(res, request.Options) + case err := <-errCh: + log.Warn("request failure: %s", err) + onErrCleanup(request.Request.URL) + return nil, err + } +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/sslhelpers/root_certs.go b/wasm/mix-fetch/go-mix-conn/internal/sslhelpers/root_certs.go new file mode 100644 index 0000000000..361fbc7b06 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/sslhelpers/root_certs.go @@ -0,0 +1,3235 @@ +package sslhelpers + +import ( + "crypto/x509" + "go-mix-conn/internal/log" +) + +// source: https://curl.se/ca/cacert-2023-05-30.pem +// sha256 when downloaded: 5fadcae90aa4ae041150f8e2d26c37d980522cdb49f923fc1e1b5eb8d74e71ad cacert.pem +func rawCerts() [][]byte { + var certs [][]byte + + //GlobalSign Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE-----`)) + + //Entrust.net Premium 2048 Secure Server CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE-----`)) + + //Baltimore CyberTrust Root + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE-----`)) + + //Entrust Root Certification Authority + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE-----`)) + + //Comodo AAA Services root + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE-----`)) + + //QuoVadis Root CA 2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE-----`)) + + //QuoVadis Root CA 3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE-----`)) + + //Security Communication Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE-----`)) + + //XRamp Global CA Root + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE-----`)) + + //Go Daddy Class 2 CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE-----`)) + + //Starfield Class 2 CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE-----`)) + + //DigiCert Assured ID Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE-----`)) + + //DigiCert Global Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE-----`)) + + //DigiCert High Assurance EV Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE-----`)) + + //SwissSign Gold CA - G2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE-----`)) + + //SwissSign Silver CA - G2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE-----`)) + + //SecureTrust CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE-----`)) + + //Secure Global CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE-----`)) + + //COMODO Certification Authority + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE-----`)) + + //COMODO ECC Certification Authority + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE-----`)) + + //Certigna + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE-----`)) + + //ePKI Root Certification Authority + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE-----`)) + + //certSIGN ROOT CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE-----`)) + + //NetLock Arany (Class Gold) Főtanúsítvány + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE-----`)) + + //SecureSign RootCA11 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE-----`)) + + //Microsec e-Szigno Root CA 2009 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE-----`)) + + //GlobalSign Root CA - R3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE-----`)) + + //Autoridad de Certificacion Firmaprofesional CIF A62634068 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE-----`)) + + //Izenpe.com + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE-----`)) + + //Go Daddy Root Certificate Authority - G2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE-----`)) + + //Starfield Root Certificate Authority - G2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE-----`)) + + //Starfield Services Root Certificate Authority - G2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE-----`)) + + //AffirmTrust Commercial + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE-----`)) + + //AffirmTrust Networking + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE-----`)) + + //AffirmTrust Premium + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE-----`)) + + //AffirmTrust Premium ECC + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE-----`)) + + //Certum Trusted Network CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE-----`)) + + //TWCA Root Certification Authority + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE-----`)) + + //Security Communication RootCA2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE-----`)) + + //Actalis Authentication Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE-----`)) + + //Buypass Class 2 Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE-----`)) + + //Buypass Class 3 Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE-----`)) + + //T-TeleSec GlobalRoot Class 3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE-----`)) + + //D-TRUST Root Class 3 CA 2 2009 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE-----`)) + + //D-TRUST Root Class 3 CA 2 EV 2009 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE-----`)) + + //CA Disig Root R2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE-----`)) + + //ACCVRAIZ1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE-----`)) + + //TWCA Global Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE-----`)) + + //TeliaSonera Root CA v1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE-----`)) + + //T-TeleSec GlobalRoot Class 2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE-----`)) + + //Atos TrustedRoot 2011 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE-----`)) + + //QuoVadis Root CA 1 G3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE-----`)) + + //QuoVadis Root CA 2 G3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE-----`)) + + //QuoVadis Root CA 3 G3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE-----`)) + + //DigiCert Assured ID Root G2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE-----`)) + + //DigiCert Assured ID Root G3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE-----`)) + + //DigiCert Global Root G2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE-----`)) + + //DigiCert Global Root G3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE-----`)) + + //DigiCert Trusted Root G4 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE-----`)) + + //COMODO RSA Certification Authority + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE-----`)) + + //USERTrust RSA Certification Authority + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE-----`)) + + //USERTrust ECC Certification Authority + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE-----`)) + + //GlobalSign ECC Root CA - R5 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE-----`)) + + //IdenTrust Commercial Root CA 1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE-----`)) + + //IdenTrust Public Sector Root CA 1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE-----`)) + + //Entrust Root Certification Authority - G2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE-----`)) + + //Entrust Root Certification Authority - EC1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE-----`)) + + //CFCA EV ROOT + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE-----`)) + + //OISTE WISeKey Global Root GB CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE-----`)) + + //SZAFIR ROOT CA2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE-----`)) + + //Certum Trusted Network CA 2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE-----`)) + + //Hellenic Academic and Research Institutions RootCA 2015 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE-----`)) + + //Hellenic Academic and Research Institutions ECC RootCA 2015 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE-----`)) + + //ISRG Root X1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE-----`)) + + //AC RAIZ FNMT-RCM + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE-----`)) + + //Amazon Root CA 1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE-----`)) + + //Amazon Root CA 2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE-----`)) + + //Amazon Root CA 3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE-----`)) + + //Amazon Root CA 4 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE-----`)) + + //TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE-----`)) + + //GDCA TrustAUTH R5 ROOT + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw +BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD +DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow +YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs +AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p +OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr +pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ +9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ +xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM +R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ +D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 +oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx +9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 +H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 +6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd ++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ +HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD +F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ +8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv +/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT +aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE-----`)) + + //SSL.com Root Certification Authority RSA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE-----`)) + + //SSL.com Root Certification Authority ECC + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv +BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy +MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO +BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ +8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR +hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT +jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW +e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z +5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE-----`)) + + //SSL.com EV Root Certification Authority RSA R2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w +DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u +MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD +VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh +hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w +cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO +Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ +B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh +CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim +9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto +RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm +JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 ++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp +qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 +++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx +Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G +guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz +OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 +CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq +lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR +rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 +hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX +9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE-----`)) + + //SSL.com EV Root Certification Authority ECC + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy +BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw +MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM +LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy +3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O +BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe +5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ +N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm +m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE-----`)) + + //GlobalSign Root CA - R6 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE-----`)) + + //OISTE WISeKey Global Root GC CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE-----`)) + + //UCA Global G2 Root + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE-----`)) + + //UCA Extended Validation Root + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE-----`)) + + //Certigna Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE-----`)) + + //emSign Root CA - G1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET +MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl +ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx +ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk +aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN +LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 +cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW +DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ +6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH +hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 +vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q +NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q ++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih +U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE-----`)) + + //emSign ECC Root CA - G3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG +A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg +MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 +MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 +ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc +58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr +MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D +CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 +jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE-----`)) + + //emSign Root CA - C1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx +EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp +Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD +ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up +ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ +Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX +OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V +I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms +lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ +XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD +ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp +/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 +NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 +wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ +BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE-----`)) + + //emSign ECC Root CA - C3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG +A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF +Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD +ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd +6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 +SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA +B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA +MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU +ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE-----`)) + + //Hongkong Post Root CA 3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG +A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK +Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 +MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv +bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX +SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz +iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf +jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim +5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe +sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj +0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ +JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u +y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h ++bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG +xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID +AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN +AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw +W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld +y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov ++BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc +eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw +9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 +nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY +hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB +60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq +dBb9HxEGmpv0 +-----END CERTIFICATE-----`)) + + //Entrust Root Certification Authority - G4 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu +bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 +dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT +AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D +umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV +3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds +8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ +e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 +ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X +xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV +7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW +Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n +MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q +jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht +7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK +YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt +jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ +m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW +RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA +JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G ++TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT +kcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE-----`)) + + //Microsoft ECC Root Certificate Authority 2017 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND +IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 +MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 +thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB +eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM ++Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf +Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR +eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE-----`)) + + //Microsoft RSA Root Certificate Authority 2017 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg +UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw +NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u +MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml +7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e +S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 +1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ +dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F +yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS +MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr +lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ +0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ +ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og +6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 +dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk ++ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex +/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy +AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW +ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE +7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT +c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D +5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E +-----END CERTIFICATE-----`)) + + //e-Szigno Root CA 2017 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw +DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt +MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa +Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE +CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp +Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx +s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G +A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv +vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA +tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO +svxyqltZ+efcMQ== +-----END CERTIFICATE-----`)) + + //certSIGN Root CA G2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw +EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy +MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH +TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 +N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk +abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg +wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp +dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh +ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 +jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf +95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc +z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL +iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud +DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB +ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB +/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 +8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 +BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW +atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU +Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M +NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N +0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= +-----END CERTIFICATE-----`)) + + //Trustwave Global Certification Authority + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +29FpHOTKyeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE-----`)) + + //Trustwave Global ECC P256 Certification Authority + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 +NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj +43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm +P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt +0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz +RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE-----`)) + + //Trustwave Global ECC P384 Certification Authority + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 +NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH +Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr +/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV +HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn +ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl +CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== +-----END CERTIFICATE-----`)) + + //NAVER Global Root Certification Authority + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG +A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD +DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 +NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT +UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb +UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW ++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 +XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 +aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 +Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z +VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B +A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai +cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy +YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV +HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK +21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB +jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx +hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg +E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH +D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ +A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY +qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG +I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg +kpzNNIaRkPpkUZ3+/uul9XXeifdy +-----END CERTIFICATE-----`)) + + //AC RAIZ FNMT-RCM SERVIDORES SEGUROS + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF +UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy +NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 +MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt +UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB +QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 +LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG +SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD +zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= +-----END CERTIFICATE-----`)) + + //GlobalSign Root R46 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv +b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX +BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es +CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ +r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje +2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt +bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj +K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 +12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on +ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls +eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 +vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM +BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy +gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 +CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm +OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq +JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye +qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz +nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 +DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 +QEUxeCp6 +-----END CERTIFICATE-----`)) + + //GlobalSign Root E46 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT +AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg +RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV +BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB +jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj +QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL +gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk +vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ +CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE-----`)) + + //GLOBALTRUST 2020 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx +IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT +VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh +BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy +MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi +D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO +VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM +CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm +fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA +A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR +JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG +DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU +clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ +mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud +IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw +4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 +iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS +8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 +HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS +vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 +oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF +YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl +gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE-----`)) + + //ANF Secure Server Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE-----`)) + + //Certum EC-384 CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ +TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 +MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh +dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq +vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn +iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo +ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 +QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE-----`)) + + //Certum Trusted Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE-----`)) + + //TunTrust Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE-----`)) + + //HARICA TLS RSA Root CA 2021 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG +EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz +OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl +bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB +IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN +JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu +a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y +Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K +5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv +dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR +0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH +GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm +haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ +CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU +EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq +QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD +QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR +j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 +vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 +qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 +Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ +PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn +kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= +-----END CERTIFICATE-----`)) + + //HARICA TLS ECC Root CA 2021 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH +UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD +QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX +DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj +IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv +b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l +AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b +ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW +0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi +rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw +CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE-----`)) + + //Autoridad de Certificacion Firmaprofesional CIF A62634068 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud +DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w +gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A +bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL +4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb +LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il +I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP +cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA +LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A +lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH +9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf +NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE +ZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE-----`)) + + //vTrus ECC Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE +BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS +b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa +BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c +ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n +TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT +QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL +YgmRWAD5Tfs0aNoJrSEGGJTO +-----END CERTIFICATE-----`)) + + //vTrus Root CA + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG +A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv +b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG +A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots +SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI +ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF +XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA +YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 +kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 +AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu +/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu +1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO +9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg +scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr +jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 +8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn +xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg +icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 +sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW +nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc +SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H +l3s= +-----END CERTIFICATE-----`)) + + //ISRG Root X2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV +UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT +UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT +MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS +RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H +ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb +d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF +cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 +U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE-----`)) + + //HiPKI Root CA - G1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ +IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT +AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg +Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 +o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k +wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE +YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA +GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd +hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj +1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 +9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ +Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF +8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD +AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl +tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE +wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q +JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv +5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz +jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg +hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb +yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ +yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE-----`)) + + //GlobalSign ECC Root CA - R4 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW +ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI +KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg +UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE-----`)) + + //GTS Root R1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 +xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w +B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW +nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk +9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq +kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A +K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX +V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW +cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD +ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi +ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar +J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci +NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me +LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF +fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ +7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 +FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 +gm3c +-----END CERTIFICATE-----`)) + + //GTS Root R2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl +e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb +a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS ++LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M +kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG +r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q +S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV +J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL +dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD +ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh +swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel +/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn +jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 +9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M +7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 +0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR +WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW +HYbL +-----END CERTIFICATE-----`)) + + //GTS Root R3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq +Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT +L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV +11RZt+cRLInUue4X +-----END CERTIFICATE-----`)) + + //GTS Root R4 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 +PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C +r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh +4rsUecrNIdSUtUlD +-----END CERTIFICATE-----`)) + + //Telia Root CA v2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT +AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 +MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK +DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 +6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q +9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn +pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl +tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW +5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr +RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E +BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 +M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau +BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W +xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 +tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H +eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C +y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC +QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 +h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 +sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 +xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ +raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= +-----END CERTIFICATE-----`)) + + //D-TRUST BR Root CA 1 2020 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 +dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu +QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom +AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE-----`)) + + //D-TRUST EV Root CA 1 2020 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 +ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ +raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR +AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE-----`)) + + //DigiCert TLS ECC P384 Root G5 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 +NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg +Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd +lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj +n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB +/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds +Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx +AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE-----`)) + + //DigiCert TLS RSA4096 Root G5 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 +MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 +IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 +7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU +AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces +tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa +zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV +DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q +TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy +z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ +MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk +wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E +FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN +lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN +MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ +u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G +OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh +47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU +FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ +yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP +bEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE-----`)) + + //Certainly Root R1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE +BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN +MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy +dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O +5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl +8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl +DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI +XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN +KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ +AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb +rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 +VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS +p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz +HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v +MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB +GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ +gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH +JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 +fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw +x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S +X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= +-----END CERTIFICATE-----`)) + + //Certainly Root E1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV +UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 +MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu +bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 +fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 +YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E +AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 +rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE-----`)) + + //E-Tugra Global Root CA RSA v3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE-----`)) + + //E-Tugra Global Root CA ECC v3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMwgYAxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAbBgNV +BAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENB +IEVDQyB2MzAeFw0yMDAzMTgwOTQ2NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEP +MA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1 +Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBFQ0MgdjMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQKczLWYHMjLiSF4mDKpL2 +w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YKfWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31 +Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQ +zPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4W +Aie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3 +-----END CERTIFICATE-----`)) + + //Security Communication RootCA3 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw +IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD +b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw +CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE +AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r +hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE +NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2 +/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm +npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY +XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK +p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC +3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf +GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw +CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS +YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu +Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O +H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx +YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ +XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml ++LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn +KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9 +dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm +6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg== +-----END CERTIFICATE-----`)) + + //Security Communication ECC RootCA1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD +VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t +dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL +MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV +BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo +5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW +BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK +BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L +snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e +N9k= +-----END CERTIFICATE-----`)) + + //BJCA Global Root CA1 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG +EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK +Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG +A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD +DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm +CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS +sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn +P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW +yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj +eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn +MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b +OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh +GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK +H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB +AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ +dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 +60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh +TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW +4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp +GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx +4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps +3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S +SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= +-----END CERTIFICATE-----`)) + + //BJCA Global Root CA2 + certs = append(certs, []byte(`-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD +TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg +R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE +BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC +SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl +SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK +/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI +1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 +W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g +UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE-----`)) + + return certs +} + +func rootCerts() *x509.CertPool { + roots := x509.NewCertPool() + raw := rawCerts() + for i := 0; i < len(raw); i++ { + ok := roots.AppendCertsFromPEM(raw[i]) + if !ok { + log.Error("%s", string(raw[i])) + panic("failed to parse root certificate") + } + } + + return roots +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/sslhelpers/ssl_helper.go b/wasm/mix-fetch/go-mix-conn/internal/sslhelpers/ssl_helper.go new file mode 100644 index 0000000000..97d118933b --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/sslhelpers/ssl_helper.go @@ -0,0 +1,15 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package sslhelpers + +import ( + "crypto/tls" +) + +func TlsConfig(serverName string) tls.Config { + return tls.Config{ + ServerName: serverName, + RootCAs: rootCerts(), + } +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/state/fake_connection.go b/wasm/mix-fetch/go-mix-conn/internal/state/fake_connection.go new file mode 100644 index 0000000000..b15841e209 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/state/fake_connection.go @@ -0,0 +1,307 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package state + +import ( + "bytes" + "crypto/tls" + "go-mix-conn/internal/bridge/rust_bridge" + "go-mix-conn/internal/log" + "go-mix-conn/internal/sslhelpers" + "go-mix-conn/internal/types" + "io" + "net" + "os" + "sync" + "time" +) + +// InjectedData is, well, the injected server data that came from the mixnet into this connection +type InjectedData struct { + ServerData <-chan []byte + //RemoteClosed <-chan bool + RemoteDone <-chan struct{} + + RemoteError <-chan error +} + +// ConnectionInjector controls data that goes over corresponding FakeConnection +type ConnectionInjector struct { + ServerData chan<- []byte + RemoteDone chan<- struct{} + //RemoteClosed chan<- bool + RemoteError chan<- error +} + +// FakeConnection is a type implementing net.Conn interface that allows us +// to inspect and control bytes that would normally go onto the wire +type FakeConnection struct { + requestId types.RequestId + remoteAddress string + data *InjectedData + + localDone chan struct{} + + readDeadline connDeadline + writeDeadline connDeadline + + pendingReads chan []byte +} + +// connDeadline is an abstraction for handling timeouts. +// source: https://github.com/golang/go/blob/release-branch.go1.20/src/net/pipe.go#L15 +type connDeadline struct { + mu sync.Mutex // Guards timer and cancel + timer *time.Timer + cancel chan struct{} // Must be non-nil +} + +func makeConnDeadline() connDeadline { + return connDeadline{cancel: make(chan struct{})} +} + +// set sets the point in time when the deadline will time out. +// A timeout event is signaled by closing the channel returned by waiter. +// Once a timeout has occurred, the deadline can be refreshed by specifying a +// t value in the future. +// +// A zero value for t prevents timeout. +// source: https://github.com/golang/go/blob/release-branch.go1.20/src/net/pipe.go#L31 +func (d *connDeadline) set(t time.Time) { + d.mu.Lock() + defer d.mu.Unlock() + + if d.timer != nil && !d.timer.Stop() { + <-d.cancel // Wait for the timer callback to finish and close cancel + } + d.timer = nil + + // Time is zero, then there is no deadline. + closed := isClosedChan(d.cancel) + if t.IsZero() { + if closed { + d.cancel = make(chan struct{}) + } + return + } + + // Time in the future, setup a timer to cancel in the future. + if dur := time.Until(t); dur > 0 { + if closed { + d.cancel = make(chan struct{}) + } + d.timer = time.AfterFunc(dur, func() { + close(d.cancel) + }) + return + } + + // Time in the past, so close immediately. + if !closed { + close(d.cancel) + } +} + +func (d *connDeadline) wait() chan struct{} { + d.mu.Lock() + defer d.mu.Unlock() + return d.cancel +} + +func isClosedChan(c <-chan struct{}) bool { + select { + case <-c: + return true + default: + return false + } +} + +// NewFakeConnection creates a new FakeConnection that implements net.Conn interface alongside +// handlers for injecting data into it +func NewFakeConnection(requestId types.RequestId, remoteAddress string) (*FakeConnection, ConnectionInjector) { + serverData := make(chan []byte, 10) + //remoteClosed := make(chan bool, 1) + remoteError := make(chan error, 1) + + localDone := make(chan struct{}) + remoteDone := make(chan struct{}) + + inj := ConnectionInjector{ + ServerData: serverData, + //RemoteClosed: remoteClosed, + RemoteDone: remoteDone, + RemoteError: remoteError, + } + + conn := &FakeConnection{ + data: &InjectedData{ + ServerData: serverData, + //RemoteClosed: remoteClosed, + RemoteDone: remoteDone, + RemoteError: remoteError, + }, + requestId: requestId, + remoteAddress: remoteAddress, + pendingReads: make(chan []byte, 1), + localDone: localDone, + readDeadline: makeConnDeadline(), + writeDeadline: makeConnDeadline(), + } + + return conn, inj +} + +// NewFakeTlsConn wraps a FakeConnection with all the TLS magic +// note: this returns a tls.Conn in the pre-handshake state +func NewFakeTlsConn(connectionId types.RequestId, remoteAddress string) (*tls.Conn, ConnectionInjector) { + host, _, err := net.SplitHostPort(remoteAddress) + if err != nil { + panic("todo") + } + conn, inj := NewFakeConnection(connectionId, remoteAddress) + tlsConfig := sslhelpers.TlsConfig(host) + tlsConn := tls.Client(conn, &tlsConfig) + return tlsConn, inj +} + +func (conn *FakeConnection) readAndBuffer(in []byte, out []byte) (int, error) { + buf := bytes.NewReader(in) + n, err := buf.Read(out) + + remaining := buf.Len() + if remaining > 0 { + leftover := make([]byte, remaining) + _, _ = buf.Read(leftover) + conn.pendingReads <- leftover + } + + log.Debug("READING INJECTED %d bytes <<<", n) + return n, err +} + +// TODO: so many EOF edge cases here... +func (conn *FakeConnection) Read(p []byte) (int, error) { + switch { + case isClosedChan(conn.localDone): + return 0, io.ErrClosedPipe + //case isClosedChan(conn.data.RemoteDone): + // return 0, io.EOF + case isClosedChan(conn.readDeadline.wait()): + return 0, os.ErrDeadlineExceeded + } + + // TODO: is there really no better way for priority chan reads? + select { + // see if we have any leftover data from the previous read + case incomplete := <-conn.pendingReads: + log.Trace("reading previously incomplete data") + return conn.readAndBuffer(incomplete, p) + default: + // reason for this extra select: + // if we have BOTH server data and closing information - you HAVE TO use up the data first + select { + // if we have any data: do read it + case injectedData := <-conn.data.ServerData: + log.Trace("server data") + return conn.readAndBuffer(injectedData, p) + default: + // we wait for either some data, closing info, an error or timeout + select { + case data := <-conn.data.ServerData: + if len(data) == 0 { + return 0, io.EOF + } + return conn.readAndBuffer(data, p) + case err := <-conn.data.RemoteError: + return 0, err + case <-conn.localDone: + return 0, io.ErrClosedPipe + case <-conn.data.RemoteDone: + return 0, io.EOF + case <-conn.readDeadline.wait(): + return 0, os.ErrDeadlineExceeded + } + } + } +} + +func (conn *FakeConnection) Write(p []byte) (int, error) { + log.Debug("WRITING %d bytes TO 'REMOTE' >>> \n", len(p)) + + switch { + case isClosedChan(conn.localDone): + return 0, io.ErrClosedPipe + //case isClosedChan(conn.data.RemoteDone): + // return 0, io.EOF + case isClosedChan(conn.readDeadline.wait()): + return 0, os.ErrDeadlineExceeded + } + + // TODO: I guess the deadline should take into consideration the recipient actually getting the packet... + err := rust_bridge.RsSendClientData(conn.requestId, p) + if err != nil { + return 0, err + } else { + return len(p), nil + } +} + +func (conn *FakeConnection) Close() error { + log.Debug("closing FakeConnection") + + close(conn.localDone) + ActiveRequests.Remove(conn.requestId) + + // TODO: if we already received information about remote being closed, + // do we have to send a socks5 closing packet? + return rust_bridge.RsFinishMixnetConnection(conn.requestId) +} + +func (conn *FakeConnection) LocalAddr() net.Addr { + log.Warn("TODO: implement LocalAddr FakeConnection") + return nil +} + +func (conn *FakeConnection) RemoteAddr() net.Addr { + log.Warn("TODO: implement RemoteAddr FakeConnection") + return nil +} + +func (conn *FakeConnection) SetDeadline(t time.Time) error { + log.Trace("Setting deadline to %v\n", t) + + if isClosedChan(conn.localDone) || isClosedChan(conn.data.RemoteDone) { + return io.ErrClosedPipe + } + + conn.readDeadline.set(t) + conn.writeDeadline.set(t) + + return nil +} + +func (conn *FakeConnection) SetReadDeadline(t time.Time) error { + log.Trace("Setting read deadline to %v\n", t) + + if isClosedChan(conn.localDone) || isClosedChan(conn.data.RemoteDone) { + return io.ErrClosedPipe + } + + conn.readDeadline.set(t) + + return nil +} + +func (conn *FakeConnection) SetWriteDeadline(t time.Time) error { + log.Trace("Setting write deadline to %v\n", t) + + if isClosedChan(conn.localDone) || isClosedChan(conn.data.RemoteDone) { + return io.ErrClosedPipe + } + + conn.writeDeadline.set(t) + + return nil +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/state/state.go b/wasm/mix-fetch/go-mix-conn/internal/state/state.go new file mode 100644 index 0000000000..a9b99b9630 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/state/state.go @@ -0,0 +1,124 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package state + +import ( + "go-mix-conn/internal/log" + "go-mix-conn/internal/types" + "sync" + "time" +) + +// ALL THE GLOBALS SHOULD GO HERE +var ActiveRequests *CurrentActiveRequests +var RequestTimeout time.Duration = time.Second * 5 + +// 4.4.7 +var MaxRedirections int = 20 + +func InitialiseGlobalState() { + ActiveRequests = &CurrentActiveRequests{ + Mutex: sync.Mutex{}, + Requests: make(map[types.RequestId]*ActiveRequest), + AddressMapping: make(map[string]types.RequestId), + } +} + +type CurrentActiveRequests struct { + sync.Mutex + Requests map[types.RequestId]*ActiveRequest + AddressMapping map[string]types.RequestId +} + +func (ar *CurrentActiveRequests) GetId(canonicalAddr string) types.RequestId { + log.Trace("getting id associated with request for %s", canonicalAddr) + ar.Lock() + defer ar.Unlock() + return ar.AddressMapping[canonicalAddr] +} + +func (ar *CurrentActiveRequests) Exists(id types.RequestId) bool { + log.Trace("checking if request %d exists", id) + ar.Lock() + defer ar.Unlock() + _, exists := ar.Requests[id] + return exists +} + +func (ar *CurrentActiveRequests) ExistsCanonical(canonicalAddr string) bool { + return ar.GetId(canonicalAddr) != 0 +} + +func (ar *CurrentActiveRequests) Insert(id types.RequestId, canonicalAddr string, inj ConnectionInjector) { + log.Trace("inserting request %d for %s", id, canonicalAddr) + ar.Lock() + defer ar.Unlock() + _, exists := ar.Requests[id] + if exists { + panic("attempted to overwrite active connection id") + } + _, exists = ar.AddressMapping[canonicalAddr] + if exists { + panic("attempted to overwrite active connection canonicalAddr") + } + + ar.Requests[id] = &ActiveRequest{injector: inj, canonicalAddr: canonicalAddr} + ar.AddressMapping[canonicalAddr] = id +} + +func (ar *CurrentActiveRequests) Remove(id types.RequestId) { + log.Trace("removing request %d", id) + ar.Lock() + defer ar.Unlock() + req, exists := ar.Requests[id] + if !exists { + panic("attempted to remove active connection id that doesn't exist") + } + _, exists = ar.AddressMapping[req.canonicalAddr] + if !exists { + panic("attempted to remove active connection canonicalAddr that doesn't exist") + } + + delete(ar.Requests, id) + delete(ar.AddressMapping, req.canonicalAddr) +} + +func (ar *CurrentActiveRequests) InjectData(id types.RequestId, data []byte) { + log.Trace("injecting data for %d", id) + ar.Lock() + defer ar.Unlock() + _, exists := ar.Requests[id] + if !exists { + panic("attempted to write to connection that doesn't exist") + } + ar.Requests[id].injector.ServerData <- data +} + +func (ar *CurrentActiveRequests) CloseRemoteSocket(id types.RequestId) { + log.Trace("closing remote socket for %d", id) + ar.Lock() + defer ar.Unlock() + _, exists := ar.Requests[id] + if !exists { + log.Warn("attempted to close remote socket of a connection that doesn't exist") + return + } + close(ar.Requests[id].injector.RemoteDone) +} + +func (ar *CurrentActiveRequests) SendError(id types.RequestId, err error) { + log.Trace("injecting error for %d: %s", id, err) + ar.Lock() + defer ar.Unlock() + _, exists := ar.Requests[id] + if !exists { + panic("attempted to inject error data to connection that doesn't exist") + } + ar.Requests[id].injector.RemoteError <- err +} + +type ActiveRequest struct { + injector ConnectionInjector + canonicalAddr string +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/types/options.go b/wasm/mix-fetch/go-mix-conn/internal/types/options.go new file mode 100644 index 0000000000..6383aa5c5e --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/types/options.go @@ -0,0 +1,37 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package types + +import ( + "fmt" + "go-mix-conn/internal/jstypes" +) + +type RequestOptions struct { + Redirect jstypes.Redirect + Mode jstypes.Mode + CredentialsMode jstypes.CredentialsMode + ReferrerPolicy jstypes.ReferrerPolicy + Referrer jstypes.Referrer + ResponseTainting jstypes.ResponseTainting + Method string +} + +func (opts RequestOptions) String() string { + return fmt.Sprintf( + "{ Redirect: %s, Mode: %s, credentials: %s, ReferrerPolicy: %s, Referrer: %s, ResponseTainting: %s, Method: %s }", + opts.Redirect, + opts.Mode, + opts.CredentialsMode, + opts.ReferrerPolicy, + opts.Referrer, + opts.ResponseTainting, + opts.Method, + ) +} + +type RequestContext struct { + WasRedirected bool + OverwrittenResponseType jstypes.ResponseType +} diff --git a/wasm/mix-fetch/go-mix-conn/internal/types/types.go b/wasm/mix-fetch/go-mix-conn/internal/types/types.go new file mode 100644 index 0000000000..5c366af950 --- /dev/null +++ b/wasm/mix-fetch/go-mix-conn/internal/types/types.go @@ -0,0 +1,6 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +package types + +type RequestId = uint64 diff --git a/wasm/mix-fetch/internal-dev/.gitignore b/wasm/mix-fetch/internal-dev/.gitignore new file mode 100644 index 0000000000..f06235c460 --- /dev/null +++ b/wasm/mix-fetch/internal-dev/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/wasm/mix-fetch/internal-dev/bootstrap.js b/wasm/mix-fetch/internal-dev/bootstrap.js new file mode 100644 index 0000000000..a017926b28 --- /dev/null +++ b/wasm/mix-fetch/internal-dev/bootstrap.js @@ -0,0 +1,5 @@ +// A dependency graph that contains any wasm must all be imported +// asynchronously. This `bootstrap.js` file does the single async import, so +// that no one else needs to worry about it again. +import('./index.js') + .catch(e => console.error('Error importing `index.js`:', e)); diff --git a/wasm/mix-fetch/internal-dev/index.html b/wasm/mix-fetch/internal-dev/index.html new file mode 100644 index 0000000000..ffe5047581 --- /dev/null +++ b/wasm/mix-fetch/internal-dev/index.html @@ -0,0 +1,27 @@ + + + + + + + Nym MixFetch Demo + + + + +

    Mix Fetch Demo

    +
    + + + +
    + + +
    +

    + +

    + + + + \ No newline at end of file diff --git a/wasm/mix-fetch/internal-dev/index.js b/wasm/mix-fetch/internal-dev/index.js new file mode 100644 index 0000000000..20c4a6894d --- /dev/null +++ b/wasm/mix-fetch/internal-dev/index.js @@ -0,0 +1,96 @@ +// Copyright 2020-2023 Nym Technologies SA +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +class WebWorkerClient { + worker = null; + + constructor() { + this.worker = new Worker('./worker.js'); + + this.worker.onmessage = (ev) => { + if (ev.data && ev.data.kind) { + switch (ev.data.kind) { + case 'DisplayString': + const { rawString } = ev.data.args; + displayReceivedRawString(rawString) + break; + } + } + }; + } + + doFetch = (target) => { + if (!this.worker) { + console.error('Could not send message because worker does not exist'); + return; + } + + this.worker.postMessage({ + kind: 'FetchPayload', + args: { + target, + }, + }); + } +} + +let client = null; + +async function main() { + client = new WebWorkerClient(); + + const fetchButton = document.querySelector('#fetch-button'); + fetchButton.onclick = function () { + doFetch(); + } +} + + +async function doFetch() { + const payload = document.getElementById('fetch_payload').value; + await client.doFetch(payload) + + displaySend(`clicked the button and the payload is: ${payload}...`); +} + +/** + * Display messages that have been sent up the websocket. Colours them blue. + * + * @param {string} message + */ +function displaySend(message) { + let timestamp = new Date().toISOString().substr(11, 12); + + let sendDiv = document.createElement('div'); + let paragraph = document.createElement('p'); + paragraph.setAttribute('style', 'color: blue'); + let paragraphContent = document.createTextNode(timestamp + ' sent >>> ' + message); + paragraph.appendChild(paragraphContent); + + sendDiv.appendChild(paragraph); + document.getElementById('output').appendChild(sendDiv); +} + +function displayReceivedRawString(raw) { + let timestamp = new Date().toISOString().substr(11, 12); + let receivedDiv = document.createElement('div'); + let paragraph = document.createElement('p'); + paragraph.setAttribute('style', 'color: green'); + let paragraphContent = document.createTextNode(timestamp + ' received >>> ' + raw); + paragraph.appendChild(paragraphContent); + receivedDiv.appendChild(paragraph); + document.getElementById('output').appendChild(receivedDiv); +} + +main(); diff --git a/wasm/mix-fetch/internal-dev/package.json b/wasm/mix-fetch/internal-dev/package.json new file mode 100644 index 0000000000..105582d79b --- /dev/null +++ b/wasm/mix-fetch/internal-dev/package.json @@ -0,0 +1,41 @@ +{ + "name": "create-wasm-app", + "version": "0.1.0", + "description": "create an app to fetch data through the mixnet", + "main": "index.js", + "bin": { + "create-wasm-app": ".bin/create-wasm-app.js" + }, + "scripts": { + "build": "webpack --config webpack.config.js", + "build:wasm": "cd ../ && make wasm-build", + "start": "webpack-dev-server --port 8001" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/rustwasm/create-wasm-app.git" + }, + "keywords": [ + "webassembly", + "wasm", + "rust", + "webpack" + ], + "author": "Dave Hrycyszyn ", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/nymtech/nym/issues" + }, + "homepage": "https://nymtech.net/docs", + "devDependencies": { + "copy-webpack-plugin": "^11.0.0", + "hello-wasm-pack": "^0.1.0", + "webpack": "^5.70.0", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.7.4" + }, + "dependencies": { + "@nymproject/nym-mix-fetch": "file:../pkg", + "go-mix-conn": "file:../go-mix-conn/build" + } +} diff --git a/wasm/mix-fetch/internal-dev/webpack.config.js b/wasm/mix-fetch/internal-dev/webpack.config.js new file mode 100644 index 0000000000..1cf7d49e34 --- /dev/null +++ b/wasm/mix-fetch/internal-dev/webpack.config.js @@ -0,0 +1,37 @@ +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const path = require('path'); + +module.exports = { + performance: { + hints: false, + maxEntrypointSize: 512000, + maxAssetSize: 512000 + }, + entry: { + bootstrap: './bootstrap.js', + worker: './worker.js', + }, + output: { + path: path.resolve(__dirname, 'dist'), + filename: '[name].js', + }, + mode: 'development', + // mode: 'production', + plugins: [ + new CopyWebpackPlugin({ + patterns: [ + 'index.html', + { + from: '../pkg/*.(js|wasm)', + to: '[name][ext]', + }, + { + from: '../go-mix-conn/build/*.(js|wasm)', + to: '[name][ext]', + }, + ], + }), + + ], + experiments: { syncWebAssembly: true }, +}; diff --git a/wasm/mix-fetch/internal-dev/worker.js b/wasm/mix-fetch/internal-dev/worker.js new file mode 100644 index 0000000000..fd56187f68 --- /dev/null +++ b/wasm/mix-fetch/internal-dev/worker.js @@ -0,0 +1,278 @@ +// Copyright 2020-2023 Nym Technologies SA +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +const RUST_WASM_URL = "nym_mix_fetch_bg.wasm" +const GO_WASM_URL = "main.wasm" + +importScripts('nym_mix_fetch.js'); +importScripts('wasm_exec.js'); + +console.log('Initializing worker'); + +// wasm_bindgen creates a global variable (with the exports attached) that is in scope after `importScripts` +const { + default_debug, + no_cover_debug, + NymClient, + set_panic_hook, + Config, + GatewayEndpointConfig, + ClientStorage, + MixFetchConfig, + send_client_data, + start_new_mixnet_connection, + setupMixFetch, + setupMixFetchWithConfig, + mix_fetch_initialised, + finish_mixnet_connection} = wasm_bindgen; + +let client = null; +let tester = null; +const go = new Go(); // Defined in wasm_exec.js +var goWasm; + +async function logFetchResult(res) { + console.log(res) + let text = await res.text() + console.log("HEADERS: ", ...res.headers) + console.log("STATUS: ", res.status) + console.log("STATUS TEXT: ", res.statusText) + console.log("OK: ", res.ok) + console.log("TYPE: ", res.type) + console.log("URL: ", res.url) + console.log("BODYUSED: ", res.bodyUsed) + console.log("REDIRECTED: ", res.redirected) + console.log("TEXT: ", text) + + self.postMessage({ + kind: 'DisplayString', + args: { + rawString: text, + }, + }); +} + +async function wasm_bindgenSetup() { + const preferredGateway = "6qQYb4ArXANU6HJDxzH4PFCUqYb39Dae2Gem2KpxescM"; + const validator = 'https://qa-nym-api.qa.nymte.ch/api'; + + // local + const mixFetchNetworkRequesterAddress= "2o47bhnXWna6VEyt4mXMGQQAbXfpKmX7BkjkxUz8uQVi.6uQGnCqSczpXwh86NdbsCoDDXuqZQM9Uwko8GE7uC9g8@6qQYb4ArXANU6HJDxzH4PFCUqYb39Dae2Gem2KpxescM"; + // const mixFetchNetworkRequesterAddress= "GqiGWmKRCbGQFSqH88BzLKijvZgipnqhmbNFsmkZw84t.4L8sXFuAUyUYyHZYgMdM3AtiusKnYUft6Pd8e41rrCHA@6qQYb4ArXANU6HJDxzH4PFCUqYb39Dae2Gem2KpxescM"; + + // STEP 1. construct config + // those are just some examples, there are obviously more permutations; + // note, the extra optional argument is of the following type: + // /* + // export interface MixFetchConfigOpts { + // id?: string; + // nymApi?: string; + // nyxd?: string; + // debug?: DebugWasm; + // } + // */ + // + // const debug = no_cover_debug() + // + // #1 + // const config = new MixFetchConfig(mixFetchNetworkRequesterAddress, { id: 'my-awesome-mix-fetch-client', nymApi: validator, debug: debug} ); + // #2 + // const config = new MixFetchConfig(mixFetchNetworkRequesterAddress, { nymApi: validator, debug: debug} ); + // #3 + // const config = new MixFetchConfig(mixFetchNetworkRequesterAddress, { id: 'my-awesome-mix-fetch-client' } ); + // + // #4 + const differentDebug = default_debug() + const updatedTraffic = differentDebug.traffic; + updatedTraffic.use_extended_packet_size = true + updatedTraffic.average_packet_delay_ms = 666; + differentDebug.traffic = updatedTraffic; + + const config = new MixFetchConfig(mixFetchNetworkRequesterAddress, { debug: differentDebug } ); + // + // // STEP 2. setup the client + // // note, the extra optional argument is of the following type: + // /* + // export interface MixFetchOptsSimple { + // preferredGateway?: string; + // storagePassphrase?: string; + // } + // */ + // #1 + await setupMixFetchWithConfig(config) + // + // #2 + // await setupMixFetchWithConfig(config, { storagePassphrase: "foomp" }) + // + // #3 + // await setupMixFetchWithConfig(config, { storagePassphrase: "foomp", preferredGateway }) +} + +async function nativeSetup() { + const preferredGateway = "6qQYb4ArXANU6HJDxzH4PFCUqYb39Dae2Gem2KpxescM"; + const validator = 'https://qa-nym-api.qa.nymte.ch/api'; + + // local + const mixFetchNetworkRequesterAddress= "2o47bhnXWna6VEyt4mXMGQQAbXfpKmX7BkjkxUz8uQVi.6uQGnCqSczpXwh86NdbsCoDDXuqZQM9Uwko8GE7uC9g8@6qQYb4ArXANU6HJDxzH4PFCUqYb39Dae2Gem2KpxescM"; + // const mixFetchNetworkRequesterAddress= "GqiGWmKRCbGQFSqH88BzLKijvZgipnqhmbNFsmkZw84t.4L8sXFuAUyUYyHZYgMdM3AtiusKnYUft6Pd8e41rrCHA@6qQYb4ArXANU6HJDxzH4PFCUqYb39Dae2Gem2KpxescM"; + + // those are just some examples, there are obviously more permutations; + // note, the extra optional argument is of the following type: + /* + export interface MixFetchOpts extends MixFetchOptsSimple { + clientId?: string; + nymApiUrl?: string; + nyxdUrl?: string; + clientOverride?: DebugWasmOverride; + mixFetchOverride?: MixFetchDebugOverride; + } + + where + export interface MixFetchDebugOverride { + requestTimeoutMs?: number; + } + + and `DebugWasmOverride` is a rather nested struct that you can look up yourself : ) + */ + + // #1 + // await setupMixFetch(mixFetchNetworkRequesterAddress) + // #2 + // await setupMixFetch(mixFetchNetworkRequesterAddress, { nymApiUrl: validator }) + // // #3 + const noCoverTrafficOverride = { + traffic: { disableMainPoissonPacketDistribution: true }, + coverTraffic: { disableLoopCoverTrafficStream: true }, + } + const mixFetchOverride = { + requestTimeoutMs: 10000 + } + + await setupMixFetch(mixFetchNetworkRequesterAddress, { storagePassphrase: "foomp", nymApiUrl: validator, clientId: "my-client", clientOverride: noCoverTrafficOverride, mixFetchOverride }) +} + +async function testMixFetch() { + console.log('Instantiating Mix Fetch...'); + // await wasm_bindgenSetup() + + await nativeSetup() + + + console.log('Mix Fetch client running!'); + + // Set callback to handle messages passed to the worker. + self.onmessage = async event => { + if (event.data && event.data.kind) { + switch (event.data.kind) { + case 'FetchPayload': { + const {target} = event.data.args; + const url = target; + + const controller = new AbortController(); + const signal = controller.signal; + + const args = { mode: "cors", redirect: "manual", signal } + // const args = { mode: "unsafe-ignore-cors" } + + setTimeout(() => { + console.warn("timeout") + controller.abort() + }, 10000) + + + try { + console.log('using mixFetch...'); + const mixFetchRes = await mixFetch(url, args) + console.log(">>> MIX FETCH") + await logFetchResult(mixFetchRes) + } catch(e) { + console.error("mix fetch request failure: ", e) + } + + // try { + // console.log('using normal Fetch...'); + // const fetchRes = await fetch(url, args) + // console.log(">>> NORMAL FETCH") + // await logFetchResult(fetchRes) + // } catch(e) { + // console.error("fetch request failure: ", e) + // } + } + } + } + }; +} + + +// TODO: look into https://www.aaron-powell.com/posts/2019-02-08-golang-wasm-5-compiling-with-webpack/ +async function loadGoWasm() { + const resp = await fetch(GO_WASM_URL); + + if ('instantiateStreaming' in WebAssembly) { + const wasmObj = await WebAssembly.instantiateStreaming(resp, go.importObject) + goWasm = wasmObj.instance + go.run(goWasm) + } else { + const bytes = await resp.arrayBuffer() + const wasmObj = await WebAssembly.instantiate(bytes, go.importObject) + goWasm = wasmObj.instance + go.run(goWasm) + } +} + +function setupRsGoBridge() { + // (note: reason for intermediate `__rs_go_bridge__` object is to decrease global scope bloat + // and to discourage users from trying to call those methods directly) + self.__rs_go_bridge__ = {} + self.__rs_go_bridge__.send_client_data = send_client_data + self.__rs_go_bridge__.start_new_mixnet_connection = start_new_mixnet_connection + self.__rs_go_bridge__.mix_fetch_initialised = mix_fetch_initialised + self.__rs_go_bridge__.finish_mixnet_connection = finish_mixnet_connection +} + +async function main() { + console.log(">>>>>>>>>>>>>>>>>>>>> JS WORKER MAIN START"); + + // load rust WASM package + await wasm_bindgen(RUST_WASM_URL); + console.log('Loaded RUST WASM'); + + // load go WASM package + await loadGoWasm(); + console.log("Loaded GO WASM"); + + // sets up better stack traces in case of in-rust panics + set_panic_hook(); + + setupRsGoBridge(); + + goWasmSetLogging("trace") + + // test mixFetch + await testMixFetch(); + // + // // run test on simplified and dedicated tester: + // // await testWithTester() + // + // // hook-up the whole client for testing + // // await testWithNymClient() + // + // // 'Normal' client setup (to send 'normal' messages) + // // await normalNymClientUsage() + // + console.log(">>>>>>>>>>>>>>>>>>>>> JS WORKER MAIN END") +} + +// Let's get started! +main(); \ No newline at end of file diff --git a/clients/webassembly/internal-dev/yarn.lock b/wasm/mix-fetch/internal-dev/yarn.lock similarity index 99% rename from clients/webassembly/internal-dev/yarn.lock rename to wasm/mix-fetch/internal-dev/yarn.lock index ee8eafc744..efd9b8367d 100644 --- a/clients/webassembly/internal-dev/yarn.lock +++ b/wasm/mix-fetch/internal-dev/yarn.lock @@ -74,7 +74,7 @@ fastq "^1.6.0" "@nymproject/nym-client-wasm@file:../pkg": - version "1.1.0" + version "1.1.1" "@types/body-parser@*": version "1.19.2" @@ -1028,6 +1028,9 @@ globby@^12.0.2: merge2 "^1.4.1" slash "^4.0.0" +"go-mix-conn@file:../go-mix-conn/build": + version "0.0.0" + graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" diff --git a/wasm/mix-fetch/src/active_requests.rs b/wasm/mix-fetch/src/active_requests.rs new file mode 100644 index 0000000000..a7407aa317 --- /dev/null +++ b/wasm/mix-fetch/src/active_requests.rs @@ -0,0 +1,142 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::error::MixFetchError; +use crate::go_bridge::{goWasmCloseRemoteSocket, goWasmInjectConnError, goWasmInjectServerData}; +use crate::RequestId; +use nym_ordered_buffer::OrderedMessageBuffer; +use nym_socks5_requests::SocketData; +use rand::{thread_rng, RngCore}; +use std::collections::HashMap; +use std::sync::Arc; +use tokio::sync::Mutex; +use wasm_utils::{console_error, console_log}; + +#[derive(Clone, Default)] +pub struct ActiveRequests { + // TODO: think whether we need sync or async mutex here + inner: Arc>>, +} + +impl ActiveRequests { + pub async fn start_new(&self) -> RequestId { + let mut guard = self.inner.lock().await; + let req = ActiveRequest::new(); + let mut rng = thread_rng(); + let request_id = loop { + let candidate = rng.next_u64(); + if !guard.contains_key(&candidate) { + break candidate; + } + }; + + console_log!("starting new request {request_id}"); + + // it's impossible to insert a duplicate entry here since we're holding the lock for the map + // and we've generated an id that must have been unique + guard.insert(request_id, req); + + request_id + } + + pub async fn get_sending_sequence(&self, id: RequestId) -> Option { + let mut guard = self.inner.lock().await; + if let Some(req) = guard.get_mut(&id) { + Some(req.next_sending_seq()) + } else { + console_error!("attempted to get sending sequence of request {id}, however it no longer exists. Has it been aborted?"); + None + } + } + + pub async fn finish(&self, id: RequestId) { + let mut guard = self.inner.lock().await; + let old = guard.remove(&id); + if old.is_none() { + console_error!("attempted to finish request {id}, but it seems to have never existed?") + } + } + + pub async fn reject(&self, id: RequestId, err: MixFetchError) { + let mut guard = self.inner.lock().await; + let old = guard.remove(&id); + if old.is_none() { + console_error!("attempted to reject request {id}, but it seems to have never existed?") + } + + goWasmInjectConnError(id.to_string(), err.to_string()) + } + + pub async fn try_send_data_to_go(&self, data: SocketData) { + let id = data.header.connection_id; + let mut guard = self.inner.lock().await; + let Some(req) = guard.get_mut(&id) else { + // if there's no data and the socket is closed, we're all good because our local must have already closed + if !data.data.is_empty() || !data.header.local_socket_closed { + console_error!("attempted to send data for request {id}, however it no longer exists. Has it been aborted?"); + } + + // TODO: if it doesn't exist here, make sure to clear Go's memory too + return; + }; + + if let Err(err) = req.insert_data(data) { + console_error!("failed to insert request data: {err}"); + // this unwrap cannot possibly fail as we're holding an exclusive lock for the data + // and we have just borrowed the content + guard.remove(&id).unwrap(); + return goWasmCloseRemoteSocket(id.to_string()); + } + + // TODO: clean this one up + if let Some(contiguous_data) = req.received_data.read() { + // TODO: deal with closing socket, etc. + if !contiguous_data.data.is_empty() { + goWasmInjectServerData(id.to_string(), contiguous_data.data); + } + // TODO: that's very crappy way of doing it. + if Some(contiguous_data.last_sequence) == req.finished_at { + goWasmCloseRemoteSocket(id.to_string()); + } + } + } +} + +struct ActiveRequest { + received_data: OrderedMessageBuffer, + finished_at: Option, + + sending_seq: u64, +} + +impl ActiveRequest { + fn new() -> Self { + ActiveRequest { + received_data: Default::default(), + finished_at: None, + sending_seq: 0, + } + } + + fn next_sending_seq(&mut self) -> u64 { + let next = self.sending_seq; + self.sending_seq += 1; + next + } + + fn insert_data(&mut self, data: SocketData) -> Result<(), MixFetchError> { + if data.header.local_socket_closed { + if let Some(already_finished) = self.finished_at { + return Err(MixFetchError::DuplicateSocketClosure { + request: data.header.connection_id, + first: already_finished, + other: data.header.seq, + }); + } + self.finished_at = Some(data.header.seq) + } + + self.received_data.write(data.header.seq, data.data)?; + Ok(()) + } +} diff --git a/wasm/mix-fetch/src/client.rs b/wasm/mix-fetch/src/client.rs new file mode 100644 index 0000000000..27f871feda --- /dev/null +++ b/wasm/mix-fetch/src/client.rs @@ -0,0 +1,258 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::active_requests::ActiveRequests; +use crate::config::MixFetchConfig; +use crate::error::MixFetchError; +use crate::go_bridge::goWasmSetMixFetchRequestTimeout; +use crate::request_writer::RequestWriter; +use crate::socks_helpers::{socks5_connect_request, socks5_data_request}; +use crate::{config, RequestId}; +use js_sys::Promise; +use nym_socks5_requests::RemoteAddress; +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::future_to_promise; +use wasm_client_core::client::base_client::{BaseClientBuilder, ClientInput, ClientOutput}; +use wasm_client_core::client::inbound_messages::InputMessage; +use wasm_client_core::helpers::setup_gateway_from_api; +use wasm_client_core::init::GatewaySetup; +use wasm_client_core::nym_task::connections::TransmissionLane; +use wasm_client_core::nym_task::TaskManager; +use wasm_client_core::storage::core_client_traits::FullWasmClientStorage; +use wasm_client_core::storage::ClientStorage; +use wasm_client_core::{IdentityKey, QueryReqwestRpcNyxdClient, Recipient}; +use wasm_utils::console_log; +use wasm_utils::error::PromisableResult; + +#[wasm_bindgen] +pub struct MixFetchClient { + mix_fetch_config: config::MixFetch, + + self_address: Recipient, + + client_input: ClientInput, + + requests: ActiveRequests, + + // even though we don't use graceful shutdowns, other components rely on existence of this struct + // and if it's dropped, everything will start going offline + _task_manager: TaskManager, +} + +#[wasm_bindgen] +pub struct MixFetchClientBuilder { + config: MixFetchConfig, + preferred_gateway: Option, + + storage_passphrase: Option, +} + +#[wasm_bindgen] +impl MixFetchClientBuilder { + #[wasm_bindgen(constructor)] + pub fn new( + config: MixFetchConfig, + preferred_gateway: Option, + storage_passphrase: Option, + ) -> Self { + MixFetchClientBuilder { + config, + preferred_gateway, + storage_passphrase, + } + } + + fn initialise_storage( + config: &MixFetchConfig, + base_storage: ClientStorage, + ) -> FullWasmClientStorage { + FullWasmClientStorage::new(&config.base, base_storage) + } + + fn start_reconstructor(client_output: ClientOutput, requests: ActiveRequests) { + RequestWriter::new(client_output, requests).start() + } + + // TODO: combine with normal wasm client + async fn start_client_async(mut self) -> Result { + console_log!("Starting the mix fetch client"); + + let timeout_ms = self.config.mix_fetch.debug.request_timeout.as_millis(); + if timeout_ms > u32::MAX as u128 { + return Err(MixFetchError::InvalidTimeoutValue { timeout_ms }); + } + goWasmSetMixFetchRequestTimeout(timeout_ms as u32); + + let nym_api_endpoints = self.config.base.client.nym_api_urls.clone(); + + // TODO: this will have to be re-used for surbs. but this is a problem for another PR. + let client_store = + ClientStorage::new_async(&self.config.base.client.id, self.storage_passphrase.take()) + .await?; + + let user_chosen = self.preferred_gateway.clone(); + let init_res = + setup_gateway_from_api(&client_store, user_chosen, &nym_api_endpoints).await?; + let storage = Self::initialise_storage(&self.config, client_store); + + let mut base_builder = BaseClientBuilder::::new( + &self.config.base, + storage, + None, + ); + if let Some(authenticated_ephemeral_client) = init_res.authenticated_ephemeral_client { + base_builder = base_builder.with_gateway_setup(GatewaySetup::ReuseConnection { + authenticated_ephemeral_client, + details: init_res.details, + }); + } + let mut started_client = base_builder.start_base().await?; + + let self_address = started_client.address; + + let active_requests = ActiveRequests::default(); + + let client_input = started_client.client_input.register_producer(); + let client_output = started_client.client_output.register_consumer(); + + Self::start_reconstructor(client_output, active_requests.clone()); + + Ok(MixFetchClient { + mix_fetch_config: self.config.mix_fetch, + self_address, + client_input, + requests: active_requests, + _task_manager: started_client.task_manager, + }) + } +} + +#[wasm_bindgen] +impl MixFetchClient { + pub(crate) async fn new_async( + config: MixFetchConfig, + preferred_gateway: Option, + storage_passphrase: Option, + ) -> Result { + MixFetchClientBuilder::new(config, preferred_gateway, storage_passphrase) + .start_client_async() + .await + } + + #[wasm_bindgen(constructor)] + #[allow(clippy::new_ret_no_self)] + pub fn new( + config: MixFetchConfig, + preferred_gateway: Option, + storage_passphrase: Option, + ) -> Promise { + future_to_promise(async move { + Self::new_async(config, preferred_gateway, storage_passphrase) + .await + .into_promise_result() + }) + } + + pub fn self_address(&self) -> String { + self.self_address.to_string() + } + + async fn send_socks_connect( + &self, + request_id: RequestId, + target: RemoteAddress, + ) -> Result<(), MixFetchError> { + let raw_conn_req = socks5_connect_request(request_id, target, self.self_address); + let lane = TransmissionLane::ConnectionId(request_id); + let input = InputMessage::new_regular( + self.mix_fetch_config.network_requester_address, + raw_conn_req, + lane, + None, + ); + + // the expect here is fine as it implies an unrecoverable failure since one of the client core + // tasks has terminated + self.client_input + .input_sender + .send(input) + .await + .expect("the client has stopped listening for requests"); + + Ok(()) + } + + async fn send_socks_data( + &self, + request_id: RequestId, + local_closed: bool, + message_sequence: u64, + data: Vec, + ) -> Result<(), MixFetchError> { + let raw_send_req = socks5_data_request(request_id, local_closed, message_sequence, data); + let lane = TransmissionLane::ConnectionId(request_id); + let input = InputMessage::new_regular( + self.mix_fetch_config.network_requester_address, + raw_send_req, + lane, + None, + ); + + // the expect here is fine as it implies an unrecoverable failure since one of the client core + // tasks has terminated + self.client_input + .input_sender + .send(input) + .await + .expect("the client has stopped listening for requests"); + + Ok(()) + } + + pub(crate) async fn connect_to_mixnet( + &self, + target: String, + ) -> Result { + let request_id = self.requests.start_new().await; + self.send_socks_connect(request_id, target).await?; + + Ok(request_id) + } + + pub(crate) async fn forward_request_content( + &self, + request_id: RequestId, + data: Vec, + ) -> Result<(), MixFetchError> { + let seq = self + .requests + .get_sending_sequence(request_id) + .await + .ok_or(MixFetchError::AbortedRequest { request_id })?; + + self.send_socks_data(request_id, false, seq, data).await + } + + pub(crate) async fn close_local_socket( + &self, + request_id: RequestId, + ) -> Result<(), MixFetchError> { + let seq = self + .requests + .get_sending_sequence(request_id) + .await + .ok_or(MixFetchError::AbortedRequest { request_id })?; + + self.send_socks_data(request_id, true, seq, Vec::new()) + .await + } + + pub(crate) async fn disconnect_from_mixnet( + &self, + request_id: RequestId, + ) -> Result<(), MixFetchError> { + self.close_local_socket(request_id).await?; + self.requests.finish(request_id).await; + Ok(()) + } +} diff --git a/wasm/mix-fetch/src/config.rs b/wasm/mix-fetch/src/config.rs new file mode 100644 index 0000000000..3d8087e169 --- /dev/null +++ b/wasm/mix-fetch/src/config.rs @@ -0,0 +1,153 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +// due to expansion of #[wasm_bindgen] macro on `MixFetch` Config struct +#![allow(clippy::drop_non_drop)] + +use crate::error::MixFetchError; +use serde::{Deserialize, Serialize}; +use std::time::Duration; +use tsify::Tsify; +use wasm_bindgen::prelude::*; +use wasm_client_core::config::{new_base_client_config, BaseClientConfig, ConfigDebug, DebugWasm}; +use wasm_client_core::helpers::parse_recipient; +use wasm_client_core::Recipient; + +const DEFAULT_MIX_FETCH_TIMEOUT: Duration = Duration::from_secs(5); +const DEFAULT_MIX_FETCH_ID: &str = "_default-nym-mix-fetch"; +const MIX_FETCH_CLIENT_ID_PREFIX: &str = "mix-fetch"; + +fn make_mix_fetch_id(id: Option) -> String { + if let Some(provided) = id { + format!("{MIX_FETCH_CLIENT_ID_PREFIX}-{provided}") + } else { + DEFAULT_MIX_FETCH_ID.to_string() + } +} + +#[wasm_bindgen] +#[derive(Debug, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct MixFetchConfig { + pub(crate) base: BaseClientConfig, + + pub(crate) mix_fetch: MixFetch, +} + +#[derive(Tsify, Debug, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct MixFetchConfigOpts { + #[tsify(optional)] + pub id: Option, + + #[tsify(optional)] + pub nym_api: Option, + + #[tsify(optional)] + pub nyxd: Option, + + #[tsify(optional)] + pub debug: Option, +} + +#[wasm_bindgen] +impl MixFetchConfig { + #[wasm_bindgen(constructor)] + pub fn new( + network_requester_address: String, + opts: Option, + ) -> Result { + let version = env!("CARGO_PKG_VERSION").to_string(); + if let Some(opts) = opts { + Ok(MixFetchConfig { + base: new_base_client_config( + make_mix_fetch_id(opts.id), + version, + opts.nym_api, + opts.nyxd, + opts.debug, + )?, + mix_fetch: MixFetch::new(network_requester_address)?, + }) + } else { + Ok(MixFetchConfig { + base: BaseClientConfig::new(make_mix_fetch_id(None), version), + mix_fetch: MixFetch::new(network_requester_address)?, + }) + } + } +} + +#[wasm_bindgen] +impl MixFetchConfig { + pub fn with_mix_fetch_timeout(mut self, timeout_ms: u32) -> Self { + self.mix_fetch.debug.request_timeout = Duration::from_millis(timeout_ms as u64); + self + } +} + +impl MixFetchConfig { + pub fn override_debug>(&mut self, debug: D) { + self.base.debug = debug.into(); + } + + pub fn override_mix_fetch_debug>(&mut self, debug: D) { + self.mix_fetch.debug = debug.into(); + } +} + +#[wasm_bindgen] +#[derive(Debug, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct MixFetch { + pub(crate) network_requester_address: Recipient, + + #[serde(default)] + pub(crate) debug: MixFetchDebug, +} + +impl MixFetch { + pub(crate) fn new(network_requester_address: String) -> Result { + Ok(MixFetch { + network_requester_address: parse_recipient(&network_requester_address)?, + debug: Default::default(), + }) + } +} + +#[wasm_bindgen] +#[derive(Debug, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct MixFetchDebug { + pub(crate) request_timeout: Duration, +} + +impl Default for MixFetchDebug { + fn default() -> Self { + MixFetchDebug { + request_timeout: DEFAULT_MIX_FETCH_TIMEOUT, + } + } +} + +#[derive(Tsify, Debug, Copy, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct MixFetchDebugOverride { + #[tsify(optional)] + pub request_timeout_ms: Option, +} + +impl From for MixFetchDebug { + fn from(value: MixFetchDebugOverride) -> Self { + let def = MixFetchDebug::default(); + + MixFetchDebug { + request_timeout: value + .request_timeout_ms + .map(|d| Duration::from_millis(d as u64)) + .unwrap_or(def.request_timeout), + } + } +} diff --git a/wasm/mix-fetch/src/error.rs b/wasm/mix-fetch/src/error.rs new file mode 100644 index 0000000000..5333f1849c --- /dev/null +++ b/wasm/mix-fetch/src/error.rs @@ -0,0 +1,90 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::harbourmaster::HarbourMasterApiError; +use crate::RequestId; +use js_sys::Promise; +use nym_ordered_buffer::OrderedMessageError; +use nym_socks5_requests::ConnectionError; +use thiserror::Error; +use wasm_client_core::error::WasmCoreError; +use wasm_client_core::ClientCoreError; +use wasm_utils::wasm_error; + +#[derive(Debug, Error)] +pub enum MixFetchError { + #[error(transparent)] + CoreError { + #[from] + source: WasmCoreError, + }, + + #[error("no public network requesters are not available on this network")] + NoNetworkRequesters, + + #[error("could not query for the service providers: {source}")] + HarbourmasterError { + #[from] + source: HarbourMasterApiError, + }, + + #[error("failed to parse mix fetch config options: {source}")] + MalformedConfigOptions { + #[from] + source: serde_wasm_bindgen::Error, + }, + + #[error("mix fetch hasn't been initialised")] + Uninitialised, + + #[error("mix fetch has already been initialised before")] + AlreadyInitialised, + + #[error("provided mix fetch url wasn't a string")] + NotStringMixFetchUrl, + + #[error("request {request_id} has been aborted")] + AbortedRequest { request_id: RequestId }, + + #[error("provided mix fetch url was malformed: {0}")] + MalformedMixFetchUrl(#[from] url::ParseError), + + // the maximum value is u32::MAX which equals to over 49days, which is MORE than enough + #[error("attempted to set request timeout to {timeout_ms}ms")] + InvalidTimeoutValue { timeout_ms: u128 }, + + #[error("network requester has rejected our request: {network_requester_message}")] + ConnectionError { network_requester_message: String }, + + #[error("failed to reconstruct the response: {source}")] + MalformedData { + #[from] + source: OrderedMessageError, + }, + + #[error("received multiple messages about the remote socket being closed for request {request}. The first was on seq {first} and the other on {other}")] + DuplicateSocketClosure { + request: RequestId, + first: u64, + other: u64, + }, +} + +// I dislike this so much - there must be a better way. +impl From for MixFetchError { + fn from(value: ClientCoreError) -> Self { + MixFetchError::CoreError { + source: WasmCoreError::BaseClientError { source: value }, + } + } +} + +impl From for MixFetchError { + fn from(value: ConnectionError) -> Self { + MixFetchError::ConnectionError { + network_requester_message: value.network_requester_error, + } + } +} + +wasm_error!(MixFetchError); diff --git a/wasm/mix-fetch/src/fetch.rs b/wasm/mix-fetch/src/fetch.rs new file mode 100644 index 0000000000..2e2adef992 --- /dev/null +++ b/wasm/mix-fetch/src/fetch.rs @@ -0,0 +1,145 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::client::MixFetchClient; +use crate::config::{MixFetchConfig, MixFetchConfigOpts, MixFetchDebugOverride}; +use crate::error::MixFetchError; +use crate::helpers::get_network_requester; +use js_sys::Promise; +use serde::{Deserialize, Serialize}; +use std::sync::OnceLock; +use tsify::Tsify; +use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::JsValue; +use wasm_bindgen_futures::future_to_promise; +use wasm_client_core::config::r#override::DebugWasmOverride; +use wasm_utils::console_log; +use wasm_utils::error::PromisableResultError; + +pub type RequestId = u64; + +pub(super) static MIX_FETCH: OnceLock = OnceLock::new(); + +#[derive(Tsify, Debug, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct MixFetchOpts { + // ideally we'd have used the `IdentityKey` type alias, but that'd be extremely annoying to get working in TS + #[serde(flatten)] + pub(crate) base: MixFetchOptsSimple, + + #[tsify(optional)] + pub(crate) client_id: Option, + + #[tsify(optional)] + pub(crate) nym_api_url: Option, + + // currently not used, but will be required once we have coconut + #[tsify(optional)] + pub(crate) nyxd_url: Option, + + #[tsify(optional)] + pub(crate) client_override: Option, + + #[tsify(optional)] + pub(crate) mix_fetch_override: Option, +} + +#[derive(Tsify, Debug, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct MixFetchOptsSimple { + // ideally we'd have used the `IdentityKey` type alias, but that'd be extremely annoying to get working in TS + #[tsify(optional)] + pub(crate) preferred_gateway: Option, + + #[tsify(optional)] + pub(crate) preferred_network_requester: Option, + + #[tsify(optional)] + pub(crate) storage_passphrase: Option, +} + +impl<'a> From<&'a MixFetchOpts> for MixFetchConfigOpts { + fn from(value: &'a MixFetchOpts) -> Self { + MixFetchConfigOpts { + id: value.client_id.as_ref().map(|v| v.to_owned()), + nym_api: value.nym_api_url.as_ref().map(|v| v.to_owned()), + nyxd: value.nyxd_url.as_ref().map(|v| v.to_owned()), + debug: value.client_override.as_ref().map(|&v| v.into()), + } + } +} + +// TODO: in the future make the network requester address optional once there exists some API for obtaining NR addresses +#[wasm_bindgen(js_name = setupMixFetch)] +pub fn setup_mix_fetch(opts: MixFetchOpts) -> Promise { + if MIX_FETCH.get().is_some() { + return MixFetchError::AlreadyInitialised.into_rejected_promise(); + } + + // if nym api was overridden, it means we're not using mainnet and we don't have harbourmaster url + // for anything that's not mainnet + if opts.nym_api_url.is_some() && opts.base.preferred_network_requester.is_none() { + return MixFetchError::NoNetworkRequesters.into_rejected_promise(); + } + + future_to_promise(async move { + let network_requester_address = + get_network_requester(opts.base.preferred_network_requester.clone()) + .await + .map_promise_err()?; + + console_log!("going to use {network_requester_address} network requester"); + + let mut config = MixFetchConfig::new(network_requester_address, Some((&opts).into())) + .map_promise_err()?; + if let Some(dbg) = opts.client_override { + config.override_debug(dbg); + } + + if let Some(dbg) = opts.mix_fetch_override { + config.override_mix_fetch_debug(dbg) + } + + setup_mix_fetch_async(config, opts.base) + .await + .map(|_| JsValue::undefined()) + .map_promise_err() + }) +} + +#[wasm_bindgen(js_name = setupMixFetchWithConfig)] +pub fn setup_mix_fetch_with_config(config: MixFetchConfig, opts: MixFetchOptsSimple) -> Promise { + if MIX_FETCH.get().is_some() { + return MixFetchError::AlreadyInitialised.into_rejected_promise(); + } + + future_to_promise(async move { + setup_mix_fetch_async(config, opts) + .await + .map(|_| JsValue::undefined()) + .map_promise_err() + }) +} + +pub(super) fn set_mix_fetch_client(mix_fetch_client: MixFetchClient) -> Result<(), MixFetchError> { + MIX_FETCH + .set(mix_fetch_client) + .map_err(|_| MixFetchError::AlreadyInitialised) +} + +pub(super) fn mix_fetch_client() -> Result<&'static MixFetchClient, MixFetchError> { + MIX_FETCH.get().ok_or(MixFetchError::Uninitialised) +} + +async fn setup_mix_fetch_async( + config: MixFetchConfig, + opts: MixFetchOptsSimple, +) -> Result<(), MixFetchError> { + let preferred_gateway = opts.preferred_gateway; + let storage_passphrase = opts.storage_passphrase; + let client = MixFetchClient::new_async(config, preferred_gateway, storage_passphrase).await?; + set_mix_fetch_client(client)?; + Ok(()) +} diff --git a/wasm/mix-fetch/src/go_bridge.rs b/wasm/mix-fetch/src/go_bridge.rs new file mode 100644 index 0000000000..d9acd8d37c --- /dev/null +++ b/wasm/mix-fetch/src/go_bridge.rs @@ -0,0 +1,99 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::{mix_fetch_client, MIX_FETCH}; +use js_sys::Promise; +use wasm_bindgen::prelude::*; +use wasm_bindgen::JsValue; +use wasm_bindgen_futures::future_to_promise; +use wasm_utils::error::{simple_rejected_promise, PromisableResult}; + +/// Called by go runtime whenever local connection produces any data that has to be sent to the remote. +// +// TODO: currently this requires weird workaround to put it on the global object inside JS... +// need some help from @MS to fix that up. +// this is not expected to be called but a normal user under any circumstances +// (perhaps it should be moved somewhere outside the global object then? +#[wasm_bindgen] +pub fn send_client_data(stringified_request_id: String, data: Vec) -> Promise { + let request_id = match stringified_request_id.parse() { + Ok(id) => id, + Err(err) => { + return simple_rejected_promise(format!("failed to parse received request: {err}")) + } + }; + + future_to_promise(async move { + // this error should be impossible in normal use + // (unless, of course, user is messing around, but then it's their fault for this panic) + let mix_fetch = mix_fetch_client().expect("mix fetch hasn't been setup"); + mix_fetch.forward_request_content(request_id, data).await?; + Ok(JsValue::undefined()) + }) +} + +/// Called by go runtime whenever it establishes new connection +/// (whether the initial one or on any redirection attempt). +// +// TODO: currently this requires weird workaround to put it on the global object inside JS... +// need some help from @MS to fix that up. +// this is not expected to be called but a normal user under any circumstances +// (perhaps it should be moved somewhere outside the global object then? +#[wasm_bindgen] +pub fn start_new_mixnet_connection(target: String) -> Promise { + future_to_promise(async move { + // this error should be impossible in normal use + // (unless, of course, user is messing around, but then it's their fault for this panic) + let mix_fetch = mix_fetch_client().expect("mix fetch hasn't been setup"); + mix_fetch + .connect_to_mixnet(target) + .await + .map(|request_id| request_id.to_string()) + .into_promise_result() + }) +} + +#[wasm_bindgen] +pub fn mix_fetch_initialised() -> bool { + MIX_FETCH.get().is_some() +} + +/// Called by go runtime whenever it's done with a connection +// +// TODO: currently this requires weird workaround to put it on the global object inside JS... +// need some help from @MS to fix that up. +// this is not expected to be called but a normal user under any circumstances +// (perhaps it should be moved somewhere outside the global object then? +#[wasm_bindgen] +pub fn finish_mixnet_connection(stringified_request_id: String) -> Promise { + let request_id = match stringified_request_id.parse() { + Ok(id) => id, + Err(err) => { + return simple_rejected_promise(format!("failed to parse received request: {err}")) + } + }; + + future_to_promise(async move { + // this error should be impossible in normal use + // (unless, of course, user is messing around, but then it's their fault for this panic) + let mix_fetch = mix_fetch_client().expect("mix fetch hasn't been setup"); + mix_fetch.disconnect_from_mixnet(request_id).await?; + Ok(JsValue::undefined()) + }) +} + +// note the namespace (defined in wasm/main.go) +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(js_namespace = __go_rs_bridge__)] + pub(crate) fn goWasmInjectServerData(raw_connection_id: String, data: Vec); + + #[wasm_bindgen(js_namespace = __go_rs_bridge__)] + pub(crate) fn goWasmCloseRemoteSocket(raw_connection_id: String); + + #[wasm_bindgen(js_namespace = __go_rs_bridge__)] + pub(crate) fn goWasmInjectConnError(raw_connection_id: String, error_msg: String); + + #[wasm_bindgen(js_namespace = __go_rs_bridge__)] + pub(crate) fn goWasmSetMixFetchRequestTimeout(timeout_ms: u32); +} diff --git a/wasm/mix-fetch/src/harbourmaster.rs b/wasm/mix-fetch/src/harbourmaster.rs new file mode 100644 index 0000000000..862f6a316a --- /dev/null +++ b/wasm/mix-fetch/src/harbourmaster.rs @@ -0,0 +1,141 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +// this exists inside mix-fetch rather than being made into repo-wide library since it's a temporary solution +// until the API is finalised and endpoints are moved to nym-api + +use reqwest::{IntoUrl, Response, StatusCode}; +use serde::Deserialize; +use thiserror::Error; +use url::Url; + +mod routes { + pub const API_VERSION: &str = "v1"; + + pub const SERVICES: &str = "services"; + + pub const NEW: &str = "new"; +} + +// most of it is copied from the nym-api client +type PathSegments<'a> = &'a [&'a str]; +type Params<'a, K, V> = &'a [(K, V)]; + +const NO_PARAMS: Params<'_, &'_ str, &'_ str> = &[]; + +#[derive(Debug, Error)] +pub enum HarbourMasterApiError { + #[error("there was an issue with the REST request: {source}")] + ReqwestClientError { + #[from] + source: reqwest::Error, + }, + + #[error("not found")] + NotFound, + + #[error("request failed with error message: {0}")] + GenericRequestFailure(String), +} + +pub struct Client { + url: Url, + reqwest_client: reqwest::Client, +} + +impl Client { + pub fn new(url: U) -> Result { + let reqwest_client = reqwest::Client::new(); + Ok(Self { + url: url.into_url()?, + reqwest_client, + }) + } + + async fn send_get_request( + &self, + path: PathSegments<'_>, + params: Params<'_, K, V>, + ) -> Result + where + K: AsRef, + V: AsRef, + { + let url = create_api_url(&self.url, path, params); + Ok(self.reqwest_client.get(url).send().await?) + } + + async fn query_harbourmaster( + &self, + path: PathSegments<'_>, + params: Params<'_, K, V>, + ) -> Result + where + for<'a> T: Deserialize<'a>, + K: AsRef, + V: AsRef, + { + let res = self.send_get_request(path, params).await?; + if res.status().is_success() { + Ok(res.json().await?) + } else if res.status() == StatusCode::NOT_FOUND { + Err(HarbourMasterApiError::NotFound) + } else { + Err(HarbourMasterApiError::GenericRequestFailure( + res.text().await?, + )) + } + } + + // since it's a temporary thing don't worry about paging. + pub async fn get_services_new(&self) -> Result, HarbourMasterApiError> { + self.query_harbourmaster( + &[routes::API_VERSION, routes::SERVICES, routes::NEW], + NO_PARAMS, + ) + .await + } +} + +fn create_api_url, V: AsRef>( + base: &Url, + segments: PathSegments<'_>, + params: Params<'_, K, V>, +) -> Url { + let mut url = base.clone(); + let mut path_segments = url + .path_segments_mut() + .expect("provided validator url does not have a base!"); + for segment in segments { + let segment = segment.strip_prefix('/').unwrap_or(segment); + let segment = segment.strip_suffix('/').unwrap_or(segment); + + path_segments.push(segment); + } + drop(path_segments); + + if !params.is_empty() { + url.query_pairs_mut().extend_pairs(params); + } + + url +} + +// https://gitlab.nymte.ch/nym/shipyard-test-and-earn/-/blob/main/harbour-master/src/http/mod.rs#L13 +#[derive(Debug, Deserialize)] +pub struct PagedResult { + pub page: u32, + pub size: u32, + pub total: i32, + pub items: Vec, +} + +// https://gitlab.nymte.ch/nym/shipyard-test-and-earn/-/blob/main/harbour-master/src/http/services.rs#L32 +#[derive(Debug, Deserialize)] +pub struct ServiceNew { + pub service_provider_client_id: String, + pub ip_address: String, + pub last_successful_ping_utc: String, + pub last_updated_utc: String, + pub routing_score: f32, +} diff --git a/wasm/mix-fetch/src/helpers.rs b/wasm/mix-fetch/src/helpers.rs new file mode 100644 index 0000000000..aee8cb1e7f --- /dev/null +++ b/wasm/mix-fetch/src/helpers.rs @@ -0,0 +1,36 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::error::MixFetchError; +use crate::harbourmaster; +use rand::seq::SliceRandom; +use rand::thread_rng; +use wasm_utils::console_log; + +// since this client is temporary (and will be properly integrated into nym-api eventually), +// we're using hardcoded URL for mainnet +const HARBOUR_MASTER: &str = "https://harbourmaster.nymtech.net"; + +pub(crate) async fn get_network_requester( + preferred: Option, +) -> Result { + if let Some(sp) = preferred { + return Ok(sp); + } + + let client = harbourmaster::Client::new(HARBOUR_MASTER)?; + let providers = client.get_services_new().await?; + console_log!( + "obtained list of {} service providers on the network", + providers.items.len() + ); + + // this will only return a `None` if the list is empty + let mut rng = thread_rng(); + providers + .items + .choose(&mut rng) + .map(|service| &service.service_provider_client_id) + .cloned() + .ok_or(MixFetchError::NoNetworkRequesters) +} diff --git a/wasm/mix-fetch/src/lib.rs b/wasm/mix-fetch/src/lib.rs new file mode 100644 index 0000000000..fcc828469a --- /dev/null +++ b/wasm/mix-fetch/src/lib.rs @@ -0,0 +1,44 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +#[cfg(target_arch = "wasm32")] +mod active_requests; + +#[cfg(target_arch = "wasm32")] +mod client; + +#[cfg(target_arch = "wasm32")] +mod config; + +#[cfg(target_arch = "wasm32")] +pub mod error; + +#[cfg(target_arch = "wasm32")] +mod fetch; + +#[cfg(target_arch = "wasm32")] +mod go_bridge; + +#[cfg(target_arch = "wasm32")] +mod request_writer; + +#[cfg(target_arch = "wasm32")] +mod socks_helpers; + +#[cfg(target_arch = "wasm32")] +mod harbourmaster; + +#[cfg(target_arch = "wasm32")] +mod helpers; + +#[cfg(target_arch = "wasm32")] +pub(crate) use fetch::{mix_fetch_client, RequestId, MIX_FETCH}; + +#[cfg(target_arch = "wasm32")] +use wasm_bindgen::prelude::*; + +#[cfg(target_arch = "wasm32")] +#[wasm_bindgen(start)] +pub fn main() { + wasm_utils::console_log!("[rust main]: rust module loaded") +} diff --git a/wasm/mix-fetch/src/request_writer.rs b/wasm/mix-fetch/src/request_writer.rs new file mode 100644 index 0000000000..7a91c93a61 --- /dev/null +++ b/wasm/mix-fetch/src/request_writer.rs @@ -0,0 +1,83 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::active_requests::ActiveRequests; +use futures::channel::mpsc; +use futures::StreamExt; +use nym_service_providers_common::interface::ResponseContent; +use nym_socks5_requests::{Socks5ProviderResponse, Socks5ResponseContent}; +use wasm_bindgen_futures::spawn_local; +use wasm_client_core::client::base_client::ClientOutput; +use wasm_client_core::client::received_buffer::{ + ReceivedBufferMessage, ReconstructedMessagesReceiver, +}; +use wasm_client_core::ReconstructedMessage; +use wasm_utils::console_error; + +pub(crate) struct RequestWriter { + reconstructed_receiver: ReconstructedMessagesReceiver, + requests: ActiveRequests, +} + +impl RequestWriter { + pub(crate) fn new(client_output: ClientOutput, requests: ActiveRequests) -> Self { + // register our output + let (reconstructed_sender, reconstructed_receiver) = mpsc::unbounded(); + + // tell the buffer to start sending stuff to us + client_output + .received_buffer_request_sender + .unbounded_send(ReceivedBufferMessage::ReceiverAnnounce( + reconstructed_sender, + )) + .expect("the buffer request failed!"); + + RequestWriter { + reconstructed_receiver, + requests, + } + } + + async fn handle_reconstructed(&mut self, reconstructed_message: ReconstructedMessage) { + let (msg, tag) = reconstructed_message.into_inner(); + + if tag.is_some() { + console_error!( + "received a response with an anonymous sender tag - this is highly unexpected!" + ); + } + + match Socks5ProviderResponse::try_from_bytes(&msg) { + Err(err) => { + console_error!("failed to deserialize provider response. it was most likely not a response to our fetch: {err}") + } + Ok(provider_response) => match provider_response.content { + ResponseContent::Control(control) => { + console_error!("received a provider control response even though we didnt send any requests! - {control:#?}") + } + ResponseContent::ProviderData(data_response) => match data_response.content { + Socks5ResponseContent::ConnectionError(err) => { + self.requests.reject(err.connection_id, err.into()).await; + } + Socks5ResponseContent::Query(query) => { + console_error!("received a provider query response even though we didn't send any queries! - {query:#?}") + } + Socks5ResponseContent::NetworkData { content } => { + self.requests.try_send_data_to_go(content).await; + } + }, + }, + } + } + + pub(crate) fn start(mut self) { + spawn_local(async move { + while let Some(reconstructed) = self.reconstructed_receiver.next().await { + for reconstructed_msg in reconstructed { + self.handle_reconstructed(reconstructed_msg).await + } + } + console_error!("we stopped receiving reconstructed messages!") + }) + } +} diff --git a/wasm/mix-fetch/src/socks_helpers.rs b/wasm/mix-fetch/src/socks_helpers.rs new file mode 100644 index 0000000000..827e8ac120 --- /dev/null +++ b/wasm/mix-fetch/src/socks_helpers.rs @@ -0,0 +1,49 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use nym_service_providers_common::interface::ProviderInterfaceVersion; +use nym_socks5_requests::{ + ConnectionId, RemoteAddress, SocketData, Socks5ProtocolVersion, Socks5ProviderRequest, +}; +use wasm_client_core::Recipient; + +pub(crate) const PROVIDER_INTERFACE_VERSION: ProviderInterfaceVersion = + ProviderInterfaceVersion::new_current(); +pub(crate) const SOCKS5_PROTOCOL_VERSION: Socks5ProtocolVersion = + Socks5ProtocolVersion::new_current(); + +// for now explicitly attach return address, we can worry about surbs later +pub(crate) fn socks5_connect_request( + conn_id: ConnectionId, + remote_addr: RemoteAddress, + return_address: Recipient, +) -> Vec { + // Create SOCKS connect request + let request_content = nym_socks5_requests::request::Socks5Request::new_connect( + SOCKS5_PROTOCOL_VERSION, + conn_id, + remote_addr, + Some(return_address), + ); + + // and wrap it in provider request + Socks5ProviderRequest::new_provider_data(PROVIDER_INTERFACE_VERSION, request_content) + .into_bytes() +} + +pub(crate) fn socks5_data_request( + conn_id: ConnectionId, + local_closed: bool, + message_sequence: u64, + data: Vec, +) -> Vec { + // Create SOCKS send request + let request_content = nym_socks5_requests::request::Socks5Request::new_send( + SOCKS5_PROTOCOL_VERSION, + SocketData::new(message_sequence, conn_id, local_closed, data), + ); + + // and wrap it in provider request + Socks5ProviderRequest::new_provider_data(PROVIDER_INTERFACE_VERSION, request_content) + .into_bytes() +} diff --git a/wasm/node-tester/.cargo/config.toml b/wasm/node-tester/.cargo/config.toml new file mode 100644 index 0000000000..bdbe517658 --- /dev/null +++ b/wasm/node-tester/.cargo/config.toml @@ -0,0 +1,3 @@ +[build] +target = "wasm32-unknown-unknown" +target_arch = "wasm32" diff --git a/wasm/node-tester/Cargo.toml b/wasm/node-tester/Cargo.toml new file mode 100644 index 0000000000..b5a59e1641 --- /dev/null +++ b/wasm/node-tester/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "nym-node-tester-wasm" +authors = ["Jedrzej Stuczynski "] +version = "1.2.0-rc.2" +edition = "2021" +keywords = ["nym", "sphinx", "webassembly", "privacy", "tester"] +license = "Apache-2.0" +repository = "https://github.com/nymtech/nym" +rust-version = "1.56" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +futures = { workspace = true } +js-sys = { workspace = true } +rand = { version = "0.7.3", features = ["wasm-bindgen"] } +serde = { workspace = true, features = ["derive"] } +serde-wasm-bindgen = { workspace = true } +tokio = { workspace = true, features = ["sync"] } +wasm-bindgen = { workspace = true } +wasm-bindgen-futures = { workspace = true } +thiserror = { workspace = true } +tsify = { workspace = true, features = ["js"] } + +wasmtimer = { workspace = true } + +nym-node-tester-utils = { path = "../../common/node-tester-utils" } +wasm-client-core = { path = "../../common/wasm/client-core" } +wasm-utils = { path = "../../common/wasm/utils" } + +[package.metadata.wasm-pack.profile.release] +wasm-opt = false + +[profile.release] +lto = true +opt-level = 'z' diff --git a/wasm/node-tester/Makefile b/wasm/node-tester/Makefile new file mode 100644 index 0000000000..3c8440c851 --- /dev/null +++ b/wasm/node-tester/Makefile @@ -0,0 +1,3 @@ +build: + wasm-pack build --scope nymproject --target web --out-dir ../../dist/wasm/node-tester + wasm-opt -Oz -o ../../dist/wasm/node-tester/nym_node_tester_wasm_bg.wasm ../../dist/wasm/node-tester/nym_node_tester_wasm_bg.wasm diff --git a/wasm/node-tester/internal-dev/.gitignore b/wasm/node-tester/internal-dev/.gitignore new file mode 100644 index 0000000000..f06235c460 --- /dev/null +++ b/wasm/node-tester/internal-dev/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/wasm/node-tester/internal-dev/bootstrap.js b/wasm/node-tester/internal-dev/bootstrap.js new file mode 100644 index 0000000000..a017926b28 --- /dev/null +++ b/wasm/node-tester/internal-dev/bootstrap.js @@ -0,0 +1,5 @@ +// A dependency graph that contains any wasm must all be imported +// asynchronously. This `bootstrap.js` file does the single async import, so +// that no one else needs to worry about it again. +import('./index.js') + .catch(e => console.error('Error importing `index.js`:', e)); diff --git a/wasm/node-tester/internal-dev/index.html b/wasm/node-tester/internal-dev/index.html new file mode 100644 index 0000000000..8182be7ab6 --- /dev/null +++ b/wasm/node-tester/internal-dev/index.html @@ -0,0 +1,44 @@ + + + + + + + Nym WebAssembly Demo + + + + +

    + +

    + +

    + +

    +

    + +

    +

    + +

    + +
    + + + +
    + + +

    Send messages from your browser, through the mixnet, and to the recipient using the "send" button.

    +

    Sent messages show in blue, received + messages show in green.

    + +
    +

    + +

    + + + + \ No newline at end of file diff --git a/wasm/node-tester/internal-dev/index.js b/wasm/node-tester/internal-dev/index.js new file mode 100644 index 0000000000..0ff5c3a191 --- /dev/null +++ b/wasm/node-tester/internal-dev/index.js @@ -0,0 +1,173 @@ +// Copyright 2020-2023 Nym Technologies SA +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +class WebWorkerClient { + worker = null; + + constructor() { + this.worker = new Worker('./worker.js'); + + this.worker.onmessage = (ev) => { + if (ev.data && ev.data.kind) { + switch (ev.data.kind) { + case 'Ready': + const {selfAddress} = ev.data.args; + displaySenderAddress(selfAddress); + break; + case 'ReceiveMessage': + const {message, senderTag, isTestPacket } = ev.data.args; + displayReceived(message, senderTag, isTestPacket); + break; + case 'DisplayString': + const { rawString } = ev.data.args; + displayReceivedRawString(rawString) + break; + case 'DisableMagicTestButton': + const magicButton = document.querySelector('#magic-button'); + magicButton.setAttribute('disabled', "true") + break; + case 'DisplayTesterResults': + const {score, sentPackets, receivedPackets, receivedAcks, duplicatePackets, duplicateAcks} = ev.data.args; + const resultText = `Test score: ${score}. Sent ${sentPackets} packets. Received ${receivedPackets} packets and ${receivedAcks} acks back. We also got ${duplicatePackets} duplicate packets and ${duplicateAcks} duplicate acks.` + displayReceivedRawString(resultText) + break; + } + } + }; + } + + sendMessage = (message, recipient) => { + if (!this.worker) { + console.error('Could not send message because worker does not exist'); + return; + } + + this.worker.postMessage({ + kind: 'SendMessage', + args: { + message, recipient, + }, + }); + }; + + sendMagicPayload = (mixnodeIdentity) => { + if (!this.worker) { + console.error('Could not send message because worker does not exist'); + return; + } + + this.worker.postMessage({ + kind: 'MagicPayload', + args: { + mixnodeIdentity, + }, + }); + } +} + +let client = null; + +async function main() { + client = new WebWorkerClient(); + + const sendButton = document.querySelector('#send-button'); + sendButton.onclick = function () { + sendMessageTo(); + }; + + const magicButton = document.querySelector('#magic-button'); + magicButton.onclick = function () { + sendMagicPayload(); + } +} + +/** + * Create a Sphinx packet and send it to the mixnet through the gateway node. + * + * Message and recipient are taken from the values in the user interface. + * + */ +async function sendMessageTo() { + const message = document.getElementById('message').value; + const recipient = document.getElementById('recipient').value; + + await client.sendMessage(message, recipient); + displaySend(message); +} + +async function sendMagicPayload() { + const payload = document.getElementById('magic_payload').value; + await client.sendMagicPayload(payload) + + displaySend(`clicked the button and the payload is: ${payload}...`); +} + +/** + * Display messages that have been sent up the websocket. Colours them blue. + * + * @param {string} message + */ +function displaySend(message) { + let timestamp = new Date().toISOString().substr(11, 12); + + let sendDiv = document.createElement('div'); + let paragraph = document.createElement('p'); + paragraph.setAttribute('style', 'color: blue'); + let paragraphContent = document.createTextNode(timestamp + ' sent >>> ' + message); + paragraph.appendChild(paragraphContent); + + sendDiv.appendChild(paragraph); + document.getElementById('output').appendChild(sendDiv); +} + +/** + * Display received text messages in the browser. Colour them green. + * + * @param {Uint8Array} raw + */ +function displayReceived(raw, sender_tag, isTestPacket) { + let content = new TextDecoder().decode(raw); + if (sender_tag !== undefined) { + console.log("this message also contained some surbs from", sender_tag) + } + + if (isTestPacket) { + const decoded = JSON.parse(content) + content = `Received packet ${decoded.msg_id} / ${decoded.total_msgs} for node ${decoded.encoded_node_identity} (test: ${decoded.test_id})` + } + + displayReceivedRawString(content) +} + +function displayReceivedRawString(raw) { + let timestamp = new Date().toISOString().substr(11, 12); + let receivedDiv = document.createElement('div'); + let paragraph = document.createElement('p'); + paragraph.setAttribute('style', 'color: green'); + let paragraphContent = document.createTextNode(timestamp + ' received >>> ' + raw); + paragraph.appendChild(paragraphContent); + receivedDiv.appendChild(paragraph); + document.getElementById('output').appendChild(receivedDiv); +} + +/** + * Display the nymClient's sender address in the user interface + * + * @param {String} address + */ +function displaySenderAddress(address) { + document.getElementById('sender').value = address; +} + +main(); diff --git a/wasm/node-tester/internal-dev/package.json b/wasm/node-tester/internal-dev/package.json new file mode 100644 index 0000000000..c4f96d644c --- /dev/null +++ b/wasm/node-tester/internal-dev/package.json @@ -0,0 +1,40 @@ +{ + "name": "create-wasm-app", + "version": "0.1.0", + "description": "create an app to consume rust-generated wasm packages", + "main": "index.js", + "bin": { + "create-wasm-app": ".bin/create-wasm-app.js" + }, + "scripts": { + "build": "webpack --config webpack.config.js", + "build:wasm": "cd ../ && make wasm-build", + "start": "webpack-dev-server --port 8001" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/rustwasm/create-wasm-app.git" + }, + "keywords": [ + "webassembly", + "wasm", + "rust", + "webpack" + ], + "author": "Dave Hrycyszyn ", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/nymtech/nym/issues" + }, + "homepage": "https://nymtech.net/docs", + "devDependencies": { + "copy-webpack-plugin": "^11.0.0", + "hello-wasm-pack": "^0.1.0", + "webpack": "^5.70.0", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.7.4" + }, + "dependencies": { + "@nymproject/nym_node_tester_wasm": "file:../../../dist/wasm/node-tester" + } +} diff --git a/wasm/node-tester/internal-dev/webpack.config.js b/wasm/node-tester/internal-dev/webpack.config.js new file mode 100644 index 0000000000..2e7ec5ce87 --- /dev/null +++ b/wasm/node-tester/internal-dev/webpack.config.js @@ -0,0 +1,33 @@ +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const path = require('path'); + +module.exports = { + performance: { + hints: false, + maxEntrypointSize: 512000, + maxAssetSize: 512000 + }, + entry: { + bootstrap: './bootstrap.js', + worker: './worker.js', + }, + output: { + path: path.resolve(__dirname, 'dist'), + filename: '[name].js', + }, + mode: 'development', + // mode: 'production', + plugins: [ + new CopyWebpackPlugin({ + patterns: [ + 'index.html', + { + from: '../../../dist/wasm/node-tester/*.(js|wasm)', + to: '[name][ext]', + }, + ], + }), + + ], + experiments: { syncWebAssembly: true }, +}; diff --git a/wasm/node-tester/internal-dev/worker.js b/wasm/node-tester/internal-dev/worker.js new file mode 100644 index 0000000000..a06e7e8a8c --- /dev/null +++ b/wasm/node-tester/internal-dev/worker.js @@ -0,0 +1,152 @@ +// Copyright 2020-2023 Nym Technologies SA +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +const RUST_WASM_URL = "nym_node_tester_wasm_bg.wasm" + +importScripts('nym_node_tester_wasm.js'); + +console.log('Initializing worker'); + +// wasm_bindgen creates a global variable (with the exports attached) that is in scope after `importScripts` +const { + default_debug, + no_cover_debug, + NymNodeTester, + set_panic_hook, + currentNetworkTopology, +} = wasm_bindgen; + +let client = null; + +function dummyTopology() { + const l1Mixnode = { + mixId: 1, + owner: 'n1lftjhnl35cjsfd533zhgrwrspx6qmumd8vjgp9', + host: '80.85.86.75', + mixPort: 1789, + identityKey: '91mNjhJSBkJ9Lb6f1iuYMDQPLiX3kAv6paSUCWjGRwQz', + sphinxKey: 'DmfN1mL1T95nPXvLK44AQKCpW1pStHNQCi6Fgpz5dxDV', + layer: 1, + version: '1.1.20', + }; + const l2Mixnode = { + mixId: 2, + owner: 'n18ztkyh20gwzrel0e5m4sahd358fq9p4skwa7d3', + host: '139.162.199.75', + mixPort: 1789, + identityKey: 'BkLhuKQNyPS19sHZ3HHKCTKwK7hCU6XiFLndyZZHiB7s', + sphinxKey: '7KGC97tJRhJZKhDqFcsp4Vu715VVxizuD7BktnzuSmZC', + layer: 2, + version: '1.1.20', + }; + const l3Mixnode = { + mixId: 3, + owner: 'n1njq8h4nndp7ngays5el2rdp22hq67lwqcaq3ph', + host: '139.162.244.139', + identityKey: 'EPja9Kv8JtPHsFbzPdBQierMu5GmQy5roE5njyD6dmND', + sphinxKey: 'HWpsZChDrtEH8XNscW3qJMRzdCfUD8N8DmMcKqFv7tcf', + layer: 3, + }; + + const gateway = { + owner: 'n1d9lclqnfddgg57xe5p0fw4ng54m9f95hal5tlq', + host: '85.159.211.99', + mixPort: 1789, + clientsPort: 9000, + identityKey: '6pXQcG1Jt9hxBzMgTbQL5Y58z6mu4KXVRbA1idmibwsw', + sphinxKey: 'GSdqV7GFSwHWQrVV13pNLMeafTLDVFKBKVPxuhdGrpR3', + version: '1.1.19', + }; + + const mixnodes = new Map(); + mixnodes.set(1, [l1Mixnode]); + mixnodes.set(2, [l2Mixnode]); + mixnodes.set(3, [l3Mixnode]); + + const gateways = [gateway]; + + return { + mixnodes, gateways + } +} + + +function printAndDisplayTestResult(result) { + result.log_details(); + + self.postMessage({ + kind: 'DisplayTesterResults', + args: { + score: result.score(), + sentPackets: result.sent_packets, + receivedPackets: result.received_packets, + receivedAcks: result.received_acks, + duplicatePackets: result.duplicate_packets, + duplicateAcks: result.duplicate_acks, + }, + }); +} + +async function testWithTester() { + const preferredGateway = "6pXQcG1Jt9hxBzMgTbQL5Y58z6mu4KXVRbA1idmibwsw"; + const nymApi = 'https://qa-nym-api.qa.nymte.ch/api'; + + // A) construct with hardcoded topology + const topology = dummyTopology() + + // optional arguments: id, gateway + // mandatory (one of) arguments: topology, nymApi + const nodeTester = await new NymNodeTester({ id: "foomp", topology: topology }); + + // B) first get topology directly from nym-api + // const topology = await currentNetworkTopology(nymApi) + // const nodeTester = await new NymNodeTester({topology}); + + // C) use nym-api in the constructor (note: it does no filtering for 'good' nodes on other layers) + // const validator = 'https://qa-nym-api.qa.nymte.ch/api'; + // const nodeTester = await new NymNodeTester({nymApi}); + + self.onmessage = async event => { + if (event.data && event.data.kind) { + switch (event.data.kind) { + case 'MagicPayload': { + const {mixnodeIdentity} = event.data.args; + console.log("starting node test..."); + + let result = await nodeTester.test_node(mixnodeIdentity); + printAndDisplayTestResult(result) + } + } + } + }; +} + +async function main() { + console.log(">>>>>>>>>>>>>>>>>>>>> JS WORKER MAIN START"); + + // load rust WASM package + await wasm_bindgen(RUST_WASM_URL); + console.log('Loaded RUST WASM'); + + // sets up better stack traces in case of in-rust panics + set_panic_hook(); + // + // run test on simplified and dedicated tester: + await testWithTester(); + // + console.log(">>>>>>>>>>>>>>>>>>>>> JS WORKER MAIN END") +} + +// Let's get started! +main(); \ No newline at end of file diff --git a/wasm/node-tester/internal-dev/yarn-error.log b/wasm/node-tester/internal-dev/yarn-error.log new file mode 100644 index 0000000000..d3dea0efe1 --- /dev/null +++ b/wasm/node-tester/internal-dev/yarn-error.log @@ -0,0 +1,2261 @@ +Arguments: + /Users/jedrzej/.nvm/versions/node/v16.20.0/bin/node /Users/jedrzej/.nvm/versions/node/v16.20.0/bin/yarn install + +PATH: + /Users/jedrzej/.nvm/versions/node/v16.20.0/bin:/Library/Frameworks/Python.framework/Versions/3.11/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Apple/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Users/jedrzej/.cargo/bin:/Users/jedrzej/Library/Application Support/JetBrains/Toolbox/scripts + +Yarn version: + 1.22.19 + +Node version: + 16.20.0 + +Platform: + darwin arm64 + +Trace: + SyntaxError: /Users/jedrzej/workspace/nym/wasm/client/internal-dev/package.json: Unexpected token } in JSON at position 1030 + at JSON.parse () + at /Users/jedrzej/.nvm/versions/node/v16.20.0/lib/node_modules/yarn/lib/cli.js:1629:59 + at Generator.next () + at step (/Users/jedrzej/.nvm/versions/node/v16.20.0/lib/node_modules/yarn/lib/cli.js:310:30) + at /Users/jedrzej/.nvm/versions/node/v16.20.0/lib/node_modules/yarn/lib/cli.js:321:13 + +npm manifest: + { + "name": "create-wasm-app", + "version": "0.1.0", + "description": "create an app to consume rust-generated wasm packages", + "main": "index.js", + "bin": { + "create-wasm-app": ".bin/create-wasm-app.js" + }, + "scripts": { + "build": "webpack --config webpack.config.js", + "build:wasm": "cd ../ && make wasm-build", + "start": "webpack-dev-server --port 8001" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/rustwasm/create-wasm-app.git" + }, + "keywords": [ + "webassembly", + "wasm", + "rust", + "webpack" + ], + "author": "Dave Hrycyszyn ", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/nymtech/nym/issues" + }, + "homepage": "https://nymtech.net/docs", + "devDependencies": { + "copy-webpack-plugin": "^10.2.4", + "hello-wasm-pack": "^0.1.0", + "webpack": "^5.70.0", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.7.4" + }, + "dependencies": { + "@nymproject/nym-client-wasm": "file:../pkg", + } + } + +yarn manifest: + No manifest + +Lockfile: + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. + # yarn lockfile v1 + + + "@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + + "@jridgewell/gen-mapping@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + + "@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + + "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + + "@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + + "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + + "@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + + "@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + + "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + + "@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + + "@nymproject/nym-client-wasm@file:../pkg": + version "1.1.1" + + "@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + + "@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + + "@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + + "@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + + "@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + + "@types/eslint@*": + version "8.37.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" + integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + + "@types/estree@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + + "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.33" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + + "@types/express@*", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + + "@types/http-proxy@^1.17.8": + version "1.17.10" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.10.tgz#e576c8e4a0cc5c6a138819025a88e167ebb38d6c" + integrity sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g== + dependencies: + "@types/node" "*" + + "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + + "@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + + "@types/node@*": + version "18.15.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" + integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== + + "@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + + "@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + + "@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + + "@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + + "@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + dependencies: + "@types/mime" "*" + "@types/node" "*" + + "@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + + "@types/ws@^8.5.1": + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + + "@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + + "@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + + "@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + + "@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + + "@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + + "@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + + "@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + + "@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + + "@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + + "@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + + "@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + + "@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + + "@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + + "@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + + "@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + + "@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + + "@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + + "@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + + "@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + + "@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + + acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + + acorn@^8.5.0, acorn@^8.7.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + + ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + + ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + + ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + + ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + + ajv@^8.0.0, ajv@^8.8.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + + ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + + anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + + array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + + array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + + array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== + + balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + + batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + + binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + + body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + + bonjour-service@^1.0.11: + version "1.1.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + + brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + + braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + + browserslist@^4.14.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + + buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + + bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + + bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + + call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + + caniuse-lite@^1.0.30001449: + version "1.0.30001474" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz#13b6fe301a831fe666cce8ca4ef89352334133d5" + integrity sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q== + + chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + + chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + + clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + + colorette@^2.0.10, colorette@^2.0.14: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + + commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + + commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + + compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + + compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + + concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + + connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + + content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + + content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + + cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + + cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + + copy-webpack-plugin@^10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" + integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg== + dependencies: + fast-glob "^3.2.7" + glob-parent "^6.0.1" + globby "^12.0.2" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + + core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + + cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + + debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + + debug@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + + default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + + define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + + depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + + depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + + destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + + detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + + dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + + dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + + dns-packet@^5.2.2: + version "5.5.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.5.0.tgz#f59cbf3396c130957c56a6ad5fd3959ccdc30065" + integrity sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + + ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + + electron-to-chromium@^1.4.284: + version "1.4.352" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.352.tgz#be96bd7c2f4b980deebc9338a49a67430a33ed73" + integrity sha512-ikFUEyu5/q+wJpMOxWxTaEVk2M1qKqTGKKyfJmod1CPZxKfYnxVS41/GCBQg21ItBpZybyN8sNpRqCUGm+Zc4Q== + + encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + + enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + + envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + + es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + + escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + + escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + + eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + + esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + + estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + + estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + + etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + + eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + + events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + + execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + + express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + + fast-glob@^3.2.7: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + + fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + + fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + + fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + + faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + + fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + + finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + + find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + + follow-redirects@^1.0.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + + forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + + fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + + fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + + fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + + fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + + function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + + get-intrinsic@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + + get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + + glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + + glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + + glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + + glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + + globby@^12.0.2: + version "12.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22" + integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== + dependencies: + array-union "^3.0.1" + dir-glob "^3.0.1" + fast-glob "^3.2.7" + ignore "^5.1.9" + merge2 "^1.4.1" + slash "^4.0.0" + + "go-mix-conn@file:../go-mix-conn/build": + version "0.0.0" + + graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + + handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + + has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + + has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + + has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + + hello-wasm-pack@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/hello-wasm-pack/-/hello-wasm-pack-0.1.0.tgz#482a2e3371828056ac35f5b5fec76c0b99dcd530" + integrity sha512-3hx0GDkDLf/a9ThCMV2qG4mwza8N/MCtm8aeFFc/cdBCL2zMJ1kW1wjNl7xPqD1lz8Yl5+uhnc/cpui4dLwz/w== + + hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + + html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + + http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + + http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + + http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + + http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + + http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + + http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + + human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + + iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + + ignore@^5.1.9: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + + import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + + inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + + inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + + inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + + interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + + ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + + ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + + is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + + is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + + is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + + is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + + is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + + is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + + is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + + is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + + is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + + is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + + isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + + isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + + isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + + jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + + json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + + json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + + json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + + kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + + launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" + + loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + + locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + + media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + + memfs@^3.4.3: + version "3.4.13" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.13.tgz#248a8bd239b3c240175cd5ec548de5227fc4f345" + integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== + dependencies: + fs-monkey "^1.0.3" + + merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + + merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + + merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + + methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + + micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + + mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + + mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + + mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + + mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + + minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + + minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + + ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + + ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + + ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + + multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + + negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + + neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + + node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + + node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + + normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + + npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + + object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + + obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + + on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + + on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + + once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + + onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + + open@^8.0.9: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + + p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + + p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + + p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + + p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + + parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + + path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + + path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + + path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + + path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + + path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + + path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + + picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + + pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + + process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + + proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + + punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + + qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + + queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + + randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + + range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + + raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + + readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + + readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + + readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + + rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + + require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + + requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + + resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + + resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + + resolve@^1.9.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + + retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + + reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + + rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + + run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + + safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + + "safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + + schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + + schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + + select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + + selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + + send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + + serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + + serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + + serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + + setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + + setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + + shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + + shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + + shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + + shell-quote@^1.7.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" + integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== + + side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + + signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + + slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + + sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + + source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + + source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + + spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + + spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + + statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + + "statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + + string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + + string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + + strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + + supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + + supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + + tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + + terser-webpack-plugin@^5.1.3: + version "5.3.7" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" + integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.5" + + terser@^5.16.5: + version "5.16.8" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.8.tgz#ccde583dabe71df3f4ed02b65eb6532e0fae15d5" + integrity sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + + thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + + to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + + toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + + type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + + unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + + update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + + uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + + util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + + utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + + uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + + vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + + watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + + wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + + webpack-cli@^4.9.2: + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + + webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + + webpack-dev-server@^4.7.4: + version "4.13.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz#d97445481d78691efe6d9a3b230833d802fc31f9" + integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + + webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + + webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + + webpack@^5.70.0: + version "5.77.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.77.0.tgz#dea3ad16d7ea6b84aa55fa42f4eac9f30e7eb9b4" + integrity sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + + websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + + websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + + which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + + wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + + wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + + ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== diff --git a/wasm/node-tester/internal-dev/yarn.lock b/wasm/node-tester/internal-dev/yarn.lock new file mode 100644 index 0000000000..df787a4a65 --- /dev/null +++ b/wasm/node-tester/internal-dev/yarn.lock @@ -0,0 +1,2189 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nymproject/nym_node_tester_wasm@file:../../../dist/wasm/node-tester": + version "1.0.0" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.37.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" + integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.33" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-proxy@^1.17.8": + version "1.17.10" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.10.tgz#e576c8e4a0cc5c6a138819025a88e167ebb38d6c" + integrity sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/node@*": + version "18.15.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" + integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/ws@^8.5.1": + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + +"@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn@^8.5.0, acorn@^8.7.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.1.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caniuse-lite@^1.0.30001449: + version "1.0.30001474" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz#13b6fe301a831fe666cce8ca4ef89352334133d5" + integrity sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q== + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-webpack-plugin@^10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" + integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg== + dependencies: + fast-glob "^3.2.7" + glob-parent "^6.0.1" + globby "^12.0.2" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.5.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.5.0.tgz#f59cbf3396c130957c56a6ad5fd3959ccdc30065" + integrity sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.284: + version "1.4.352" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.352.tgz#be96bd7c2f4b980deebc9338a49a67430a33ed73" + integrity sha512-ikFUEyu5/q+wJpMOxWxTaEVk2M1qKqTGKKyfJmod1CPZxKfYnxVS41/GCBQg21ItBpZybyN8sNpRqCUGm+Zc4Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.7: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +follow-redirects@^1.0.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-intrinsic@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globby@^12.0.2: + version "12.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22" + integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== + dependencies: + array-union "^3.0.1" + dir-glob "^3.0.1" + fast-glob "^3.2.7" + ignore "^5.1.9" + merge2 "^1.4.1" + slash "^4.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hello-wasm-pack@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/hello-wasm-pack/-/hello-wasm-pack-0.1.0.tgz#482a2e3371828056ac35f5b5fec76c0b99dcd530" + integrity sha512-3hx0GDkDLf/a9ThCMV2qG4mwza8N/MCtm8aeFFc/cdBCL2zMJ1kW1wjNl7xPqD1lz8Yl5+uhnc/cpui4dLwz/w== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^5.1.9: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.4.3: + version "3.4.13" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.13.tgz#248a8bd239b3c240175cd5ec548de5227fc4f345" + integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== + dependencies: + fs-monkey "^1.0.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.9.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" + integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.3.7" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" + integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.5" + +terser@^5.16.5: + version "5.16.8" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.8.tgz#ccde583dabe71df3f4ed02b65eb6532e0fae15d5" + integrity sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webpack-cli@^4.9.2: + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.7.4: + version "4.13.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz#d97445481d78691efe6d9a3b230833d802fc31f9" + integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.70.0: + version "5.77.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.77.0.tgz#dea3ad16d7ea6b84aa55fa42f4eac9f30e7eb9b4" + integrity sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== diff --git a/clients/webassembly/src/tester/ephemeral_receiver.rs b/wasm/node-tester/src/ephemeral_receiver.rs similarity index 96% rename from clients/webassembly/src/tester/ephemeral_receiver.rs rename to wasm/node-tester/src/ephemeral_receiver.rs index 2d3117addd..a7a9545de6 100644 --- a/clients/webassembly/src/tester/ephemeral_receiver.rs +++ b/wasm/node-tester/src/ephemeral_receiver.rs @@ -1,11 +1,11 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::tester::helpers::{NodeTestResult, WasmTestMessageExt}; +use crate::types::{NodeTestResult, WasmTestMessageExt}; use futures::StreamExt; use nym_node_tester_utils::processor::Received; use nym_node_tester_utils::receiver::ReceivedReceiver; -use nym_sphinx::chunking::fragment::FragmentIdentifier; +use nym_node_tester_utils::FragmentIdentifier; use std::collections::HashSet; use std::time::Duration; use tokio::sync::MutexGuard as AsyncMutexGuard; diff --git a/wasm/node-tester/src/error.rs b/wasm/node-tester/src/error.rs new file mode 100644 index 0000000000..41004c755c --- /dev/null +++ b/wasm/node-tester/src/error.rs @@ -0,0 +1,64 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use js_sys::Promise; +use nym_node_tester_utils::error::NetworkTestingError; +use thiserror::Error; +use wasm_client_core::error::WasmCoreError; +use wasm_client_core::topology::WasmTopologyError; +use wasm_client_core::{ClientCoreError, GatewayClientError}; +use wasm_utils::wasm_error; + +#[derive(Debug, Error)] +pub enum NodeTesterError { + #[error( + "A node test is already in progress. Wait for it to finish before starting another one." + )] + TestInProgress, + + #[error( + "both nymApi address and explicit topology were specified - please use only one of them" + )] + DuplicateTopologySource, + + #[error("neither nymApi address or explicit topology were specified")] + NoTopologySource, + + #[error("could not parse provided tester arguments: {err}")] + MalformedNodeTesterArguments { err: String }, + + #[error(transparent)] + CoreError { + #[from] + source: WasmCoreError, + }, + + #[error("provided topology was malformed: {source}")] + InvalidTopology { + #[from] + source: WasmTopologyError, + }, + + #[error("failed to test the node: {source}")] + NodeTestingFailure { + #[from] + source: NetworkTestingError, + }, + + #[error("experienced an error with the gateway connection: {source}")] + GatewayConnectionError { + #[from] + source: GatewayClientError, + }, +} + +// I dislike this so much - there must be a better way. +impl From for NodeTesterError { + fn from(value: ClientCoreError) -> Self { + NodeTesterError::CoreError { + source: WasmCoreError::BaseClientError { source: value }, + } + } +} + +wasm_error!(NodeTesterError); diff --git a/clients/webassembly/src/tester/helpers.rs b/wasm/node-tester/src/helpers.rs similarity index 62% rename from clients/webassembly/src/tester/helpers.rs rename to wasm/node-tester/src/helpers.rs index b2ce1b9e5c..fa7790e2f6 100644 --- a/clients/webassembly/src/tester/helpers.rs +++ b/wasm/node-tester/src/helpers.rs @@ -4,19 +4,18 @@ // due to expansion of #[wasm_bindgen] macro on NodeTestResult #![allow(clippy::drop_non_drop)] -use crate::error::WasmClientError; +use crate::error::NodeTesterError; use crate::tester::LockedGatewayClient; +use crate::types::WasmTestMessageExt; use js_sys::Promise; use nym_node_tester_utils::processor::Received; use nym_node_tester_utils::receiver::ReceivedReceiver; -use serde::{Deserialize, Serialize}; -use std::fmt::{Display, Formatter}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use tokio::sync::{Mutex as AsyncMutex, MutexGuard as AsyncMutexGuard}; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::future_to_promise; -use wasm_utils::{console_log, console_warn}; +use wasm_utils::console_warn; #[derive(Clone)] pub(super) struct ReceivedReceiverWrapper(Arc>>); @@ -46,55 +45,6 @@ impl ReceivedReceiverWrapper { } } -#[derive(Serialize, Deserialize, Copy, Clone)] -pub struct WasmTestMessageExt { - pub test_id: u32, -} - -impl WasmTestMessageExt { - pub fn new(test_id: u32) -> Self { - WasmTestMessageExt { test_id } - } -} - -// TODO: maybe put it in the tester utils -#[wasm_bindgen] -pub struct NodeTestResult { - pub sent_packets: u32, - pub received_packets: u32, - pub received_acks: u32, - - pub duplicate_packets: u32, - pub duplicate_acks: u32, -} - -impl Display for NodeTestResult { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - writeln!(f, "Test results: ")?; - writeln!(f, "Total score: {:.2}%", self.score())?; - writeln!(f, "Sent packets: {}", self.sent_packets)?; - writeln!(f, "Received (valid) packets: {}", self.received_packets)?; - writeln!(f, "Received (valid) acks: {}", self.received_acks)?; - writeln!(f, "Received duplicate packets: {}", self.duplicate_packets)?; - write!(f, "Received duplicate acks: {}", self.duplicate_acks) - } -} - -#[wasm_bindgen] -impl NodeTestResult { - pub fn log_details(&self) { - console_log!("{}", self) - } - - pub fn score(&self) -> f32 { - let expected = self.sent_packets * 2; - let actual = (self.received_packets + self.received_acks) - .saturating_sub(self.duplicate_packets + self.duplicate_acks); - - actual as f32 / expected as f32 * 100. - } -} - pub(crate) struct TestMarker { value: Arc, } @@ -127,7 +77,7 @@ impl GatewayReconnection for LockedGatewayClient { guard .disconnect() .await - .map_err(|err| JsValue::from(WasmClientError::from(err)))?; + .map_err(|err| JsValue::from(NodeTesterError::from(err)))?; Ok(JsValue::undefined()) }) } @@ -140,7 +90,7 @@ impl GatewayReconnection for LockedGatewayClient { guard .try_reconnect() .await - .map_err(|err| JsValue::from(WasmClientError::from(err)))?; + .map_err(|err| JsValue::from(NodeTesterError::from(err)))?; Ok(JsValue::undefined()) }) } diff --git a/wasm/node-tester/src/lib.rs b/wasm/node-tester/src/lib.rs new file mode 100644 index 0000000000..c1774c7966 --- /dev/null +++ b/wasm/node-tester/src/lib.rs @@ -0,0 +1,20 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +#[cfg(target_arch = "wasm32")] +mod ephemeral_receiver; + +#[cfg(target_arch = "wasm32")] +pub mod error; + +#[cfg(target_arch = "wasm32")] +mod helpers; + +#[cfg(target_arch = "wasm32")] +pub mod tester; + +#[cfg(target_arch = "wasm32")] +pub mod types; + +#[cfg(target_arch = "wasm32")] +pub use wasm_client_core::set_panic_hook; diff --git a/clients/webassembly/src/tester/mod.rs b/wasm/node-tester/src/tester.rs similarity index 72% rename from clients/webassembly/src/tester/mod.rs rename to wasm/node-tester/src/tester.rs index ba70062f3b..5a5d7f5f34 100644 --- a/clients/webassembly/src/tester/mod.rs +++ b/wasm/node-tester/src/tester.rs @@ -1,52 +1,46 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::constants::NODE_TESTER_ID; -use crate::error::WasmClientError; -use crate::helpers::{current_network_topology_async, setup_from_topology}; -use crate::storage::ClientStorage; -use crate::tester::ephemeral_receiver::EphemeralTestReceiver; -use crate::tester::helpers::{ - GatewayReconnection, NodeTestResult, ReceivedReceiverWrapper, TestMarker, WasmTestMessageExt, -}; -use crate::topology::WasmNymTopology; +use crate::ephemeral_receiver::EphemeralTestReceiver; +use crate::error::NodeTesterError; +use crate::helpers::{GatewayReconnection, ReceivedReceiverWrapper, TestMarker}; +use crate::types::{NodeTestResult, WasmTestMessageExt}; use futures::channel::mpsc; use js_sys::Promise; -use nym_bandwidth_controller::BandwidthController; -use nym_client_core::client::key_manager::ManagedKeys; -use nym_client_core::init::{InitialisationDetails, InitialisationResult}; -use nym_credential_storage::ephemeral_storage::EphemeralStorage; -use nym_gateway_client::GatewayClient; use nym_node_tester_utils::receiver::SimpleMessageReceiver; -use nym_node_tester_utils::{NodeTester, TestMessage}; -use nym_sphinx::addressing::clients::Recipient; -use nym_sphinx::addressing::nodes::NodeIdentity; -use nym_sphinx::params::PacketSize; -use nym_sphinx::preparer::PreparedFragment; +use nym_node_tester_utils::{NodeTester, PacketSize, PreparedFragment}; use nym_task::TaskManager; -use nym_topology::NymTopology; -use nym_validator_client::client::IdentityKey; -use nym_validator_client::QueryReqwestRpcNyxdClient; use rand::rngs::OsRng; +use serde::{Deserialize, Serialize}; use std::collections::HashSet; use std::sync::atomic::{AtomicBool, AtomicU32, Ordering}; use std::sync::{Arc, Mutex as SyncMutex}; use std::time::Duration; use tokio::sync::Mutex as AsyncMutex; +use tsify::Tsify; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::future_to_promise; -use wasm_utils::{check_promise_result, console_log, PromisableResult}; +use wasm_client_core::helpers::{ + current_network_topology_async, setup_from_topology, EphemeralCredentialStorage, +}; +use wasm_client_core::storage::ClientStorage; +use wasm_client_core::topology::WasmNymTopology; +use wasm_client_core::{ + nym_task, BandwidthController, GatewayClient, IdentityKey, InitialisationDetails, + InitialisationResult, ManagedKeys, NodeIdentity, NymTopology, QueryReqwestRpcNyxdClient, + Recipient, +}; +use wasm_utils::check_promise_result; +use wasm_utils::error::PromisableResult; -mod ephemeral_receiver; -pub(crate) mod helpers; - -pub type NodeTestMessage = TestMessage; -type LockedGatewayClient = - Arc>>; +pub const NODE_TESTER_ID: &str = "_nym-node-tester"; pub(crate) const DEFAULT_TEST_TIMEOUT: Duration = Duration::from_secs(10); pub(crate) const DEFAULT_TEST_PACKETS: u32 = 20; +pub(crate) type LockedGatewayClient = + Arc>>; + #[wasm_bindgen] pub struct NymNodeTester { test_in_progress: Arc, @@ -78,7 +72,8 @@ pub struct NymNodeTesterBuilder { base_topology: NymTopology, // unimplemented - bandwidth_controller: Option>, + bandwidth_controller: + Option>, } fn address(keys: &ManagedKeys, gateway_identity: NodeIdentity) -> Recipient { @@ -89,55 +84,69 @@ fn address(keys: &ManagedKeys, gateway_identity: NodeIdentity) -> Recipient { ) } +#[derive(Tsify, Debug, Clone, Serialize, Deserialize)] +#[tsify(into_wasm_abi, from_wasm_abi)] +#[serde(rename_all = "camelCase")] +pub struct NymNodeTesterOpts { + #[tsify(optional)] + id: Option, + + #[tsify(optional)] + nym_api: Option, + + #[tsify(optional)] + topology: Option, + + #[tsify(optional)] + gateway: Option, +} + #[wasm_bindgen] impl NymNodeTesterBuilder { #[wasm_bindgen(constructor)] - pub fn new( - base_topology: WasmNymTopology, - id: Option, - gateway: Option, - ) -> NymNodeTesterBuilder { - NymNodeTesterBuilder { - id, - gateway, - base_topology: base_topology.into(), - bandwidth_controller: None, + #[allow(clippy::new_ret_no_self)] + pub fn new(args: NymNodeTesterOpts) -> Promise { + future_to_promise(async move { Self::new_async(args).await.into_promise_result() }) + } + + async fn new_async(args: NymNodeTesterOpts) -> Result { + if args.nym_api.is_some() && args.topology.is_some() { + return Err(NodeTesterError::DuplicateTopologySource); + } + if args.nym_api.is_none() && args.topology.is_none() { + return Err(NodeTesterError::NoTopologySource); } - } - async fn _new_with_api( - api_url: String, - id: Option, - gateway: Option, - ) -> Result { - let topology = current_network_topology_async(api_url).await?; - Ok(NymNodeTesterBuilder::new(topology, id, gateway)) - } + let topology = if let Some(topology) = args.topology { + topology + } else { + // the unwrap here is fine as we just ensured one of the branches would be true + current_network_topology_async(args.nym_api.unwrap()).await? + }; - pub fn new_with_api( - api_url: String, - id: Option, - gateway: Option, - ) -> Promise { - future_to_promise(async move { - Self::_new_with_api(api_url, id, gateway) - .await - .into_promise_result() + Ok(NymNodeTesterBuilder { + gateway: args.gateway, + id: args.id, + base_topology: topology.try_into()?, + bandwidth_controller: None, }) } async fn gateway_info( &self, client_store: &ClientStorage, - ) -> Result { + ) -> Result { if let Ok(loaded) = InitialisationDetails::try_load(client_store, client_store).await { Ok(loaded.into()) } else { - setup_from_topology(self.gateway.clone(), &self.base_topology, client_store).await + Ok( + setup_from_topology(self.gateway.clone(), &self.base_topology, client_store) + .await?, + ) } } - async fn _setup_client(mut self) -> Result { + async fn _setup_client(mut self) -> Result { let task_manager = TaskManager::default(); let storage_id = if let Some(client_id) = &self.id { @@ -227,7 +236,7 @@ async fn test_mixnode( processed_receiver: ReceivedReceiverWrapper, _test_marker: TestMarker, timeout: Duration, -) -> Result { +) -> Result { let num_test_packets = test_packets.len() as u32; let expected_ack_ids = test_packets @@ -258,38 +267,17 @@ async fn test_mixnode( impl NymNodeTester { #[wasm_bindgen(constructor)] #[allow(clippy::new_ret_no_self)] - pub fn new( - topology: WasmNymTopology, - id: Option, - gateway: Option, - ) -> Promise { - console_log!("constructing node tester!"); - NymNodeTesterBuilder::new(topology, id, gateway).setup_client() + pub fn new(args: NymNodeTesterOpts) -> Promise { + future_to_promise(async move { Self::new_async(args).await.into_promise_result() }) } - async fn _new_with_api( - api_url: String, - id: Option, - gateway: Option, - ) -> Result { - NymNodeTesterBuilder::_new_with_api(api_url, id, gateway) + async fn new_async(args: NymNodeTesterOpts) -> Result { + NymNodeTesterBuilder::new_async(args) .await? ._setup_client() .await } - pub fn new_with_api( - api_url: String, - id: Option, - gateway: Option, - ) -> Promise { - future_to_promise(async move { - Self::_new_with_api(api_url, id, gateway) - .await - .into_promise_result() - }) - } - pub fn disconnect_from_gateway(&self) -> Promise { self.gateway_client.disconnect_from_gateway() } @@ -303,7 +291,7 @@ impl NymNodeTester { mixnode_identity: String, test_nonce: u32, num_test_packets: u32, - ) -> Result, WasmClientError> { + ) -> Result, NodeTesterError> { let test_ext = WasmTestMessageExt::new(test_nonce); let mut tester_permit = self.tester.lock().expect("mutex got poisoned"); tester_permit @@ -330,7 +318,7 @@ impl NymNodeTester { // mark start of the test if self.test_in_progress.swap(true, Ordering::SeqCst) { - return WasmClientError::TestInProgress.into_rejected_promise(); + return NodeTesterError::TestInProgress.into_rejected_promise(); } // prepare test packets diff --git a/wasm/node-tester/src/types.rs b/wasm/node-tester/src/types.rs new file mode 100644 index 0000000000..e1a5dcf766 --- /dev/null +++ b/wasm/node-tester/src/types.rs @@ -0,0 +1,59 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use nym_node_tester_utils::TestMessage; +use serde::{Deserialize, Serialize}; +use std::fmt::{Display, Formatter}; +use wasm_bindgen::prelude::wasm_bindgen; +use wasm_utils::console_log; + +pub type NodeTestMessage = TestMessage; + +#[derive(Serialize, Deserialize, Copy, Clone)] +pub struct WasmTestMessageExt { + pub test_id: u32, +} + +impl WasmTestMessageExt { + pub fn new(test_id: u32) -> Self { + WasmTestMessageExt { test_id } + } +} + +// TODO: maybe put it in the tester utils +#[wasm_bindgen] +pub struct NodeTestResult { + pub sent_packets: u32, + pub received_packets: u32, + pub received_acks: u32, + + pub duplicate_packets: u32, + pub duplicate_acks: u32, +} + +impl Display for NodeTestResult { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + writeln!(f, "Test results: ")?; + writeln!(f, "Total score: {:.2}%", self.score())?; + writeln!(f, "Sent packets: {}", self.sent_packets)?; + writeln!(f, "Received (valid) packets: {}", self.received_packets)?; + writeln!(f, "Received (valid) acks: {}", self.received_acks)?; + writeln!(f, "Received duplicate packets: {}", self.duplicate_packets)?; + write!(f, "Received duplicate acks: {}", self.duplicate_acks) + } +} + +#[wasm_bindgen] +impl NodeTestResult { + pub fn log_details(&self) { + console_log!("{}", self) + } + + pub fn score(&self) -> f32 { + let expected = self.sent_packets * 2; + let actual = (self.received_packets + self.received_acks) + .saturating_sub(self.duplicate_packets + self.duplicate_acks); + + actual as f32 / expected as f32 * 100. + } +} diff --git a/yarn.lock b/yarn.lock index ca5ac7a967..d6dc50eb8e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,6 +34,14 @@ dependencies: "@babel/highlight" "^7.22.5" +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" @@ -44,6 +52,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== +"@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + "@babel/core@7.12.9": version "7.12.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" @@ -108,6 +121,27 @@ gensync "^1.0.0-beta.2" json5 "^2.2.2" +"@babel/core@^7.22.10": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.15.tgz#15d4fd03f478a459015a4b94cfbb3bd42c48d2f4" + integrity sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.22.15" + "@babel/helpers" "^7.22.15" + "@babel/parser" "^7.22.15" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.15" + "@babel/types" "^7.22.15" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.22.5", "@babel/generator@^7.7.2": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" @@ -118,6 +152,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339" + integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== + dependencies: + "@babel/types" "^7.22.15" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/generator@^7.22.7": version "7.22.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5" @@ -153,6 +197,17 @@ lru-cache "^5.1.1" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-compilation-targets@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" @@ -179,6 +234,21 @@ "@babel/helper-split-export-declaration" "^7.22.5" semver "^6.3.0" +"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz#bb2bf0debfe39b831986a4efbf4066586819c6e4" @@ -214,6 +284,17 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + "@babel/helper-environment-visitor@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" @@ -234,6 +315,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz#b95a144896f6d491ca7863576f820f3628818621" + integrity sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA== + dependencies: + "@babel/types" "^7.22.15" + "@babel/helper-member-expression-to-functions@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" @@ -248,6 +336,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" @@ -262,6 +357,17 @@ "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.9": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz#40ad2f6950f143900e9c1c72363c0b431a606082" + integrity sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.15" + "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" @@ -289,6 +395,15 @@ "@babel/helper-wrap-function" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helper-remap-async-to-generator@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" + integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" + "@babel/helper-replace-supers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc" @@ -301,6 +416,15 @@ "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helper-replace-supers@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" + integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-simple-access@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" @@ -334,11 +458,21 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-validator-identifier@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" + integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== + "@babel/helper-validator-identifier@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + "@babel/helper-validator-option@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" @@ -354,6 +488,15 @@ "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helper-wrap-function@^7.22.9": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" + integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.10" + "@babel/helpers@^7.12.5", "@babel/helpers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" @@ -363,6 +506,15 @@ "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helpers@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.15.tgz#f09c3df31e86e3ea0b7ff7556d85cdebd47ea6f1" + integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.15" + "@babel/types" "^7.22.15" + "@babel/helpers@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" @@ -381,16 +533,37 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" + integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== +"@babel/parser@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.15.tgz#d34592bfe288a32e741aa0663dbc4829fcd55160" + integrity sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA== + "@babel/parser@^7.22.7": version "7.22.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" @@ -398,6 +571,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" @@ -685,6 +867,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-async-generator-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" + integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-transform-async-generator-functions@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz#7336356d23380eda9a56314974f053a020dab0c3" @@ -718,6 +910,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-block-scoping@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz#494eb82b87b5f8b1d8f6f28ea74078ec0a10a841" + integrity sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-class-properties@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" @@ -726,6 +925,15 @@ "@babel/helper-create-class-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-transform-class-static-block@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" @@ -750,6 +958,21 @@ "@babel/helper-split-export-declaration" "^7.22.5" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" @@ -765,6 +988,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-destructuring@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz#e7404ea5bb3387073b9754be654eecb578324694" + integrity sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" @@ -780,6 +1010,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-dynamic-import@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" @@ -796,6 +1034,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-transform-export-namespace-from@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" @@ -819,6 +1065,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-function-name@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" @@ -828,6 +1081,14 @@ "@babel/helper-function-name" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-transform-json-strings@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" @@ -843,6 +1104,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-transform-logical-assignment-operators@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" @@ -866,6 +1135,15 @@ "@babel/helper-module-transforms" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-modules-commonjs@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz#b11810117ed4ee7691b29bd29fd9f3f98276034f" + integrity sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg== + dependencies: + "@babel/helper-module-transforms" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/plugin-transform-modules-commonjs@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" @@ -875,6 +1153,16 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" +"@babel/plugin-transform-modules-systemjs@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" + integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/plugin-transform-modules-systemjs@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" @@ -908,6 +1196,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" @@ -916,6 +1212,14 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-transform-numeric-separator@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" @@ -924,6 +1228,17 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-object-rest-spread@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" @@ -943,6 +1258,14 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-replace-supers" "^7.22.5" +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-transform-optional-catch-binding@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" @@ -951,6 +1274,15 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" +"@babel/plugin-transform-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz#d7a5996c2f7ca4ad2ad16dbb74444e5c4385b1ba" + integrity sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-transform-optional-chaining@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz#1003762b9c14295501beb41be72426736bedd1e0" @@ -967,6 +1299,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-private-methods@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" @@ -975,6 +1314,16 @@ "@babel/helper-create-class-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-transform-private-property-in-object@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" @@ -1032,6 +1381,14 @@ "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + "@babel/plugin-transform-regenerator@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" @@ -1083,6 +1440,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-typescript@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" + integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + "@babel/plugin-transform-typescript@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz#5c0f7adfc1b5f38c4dbc8f79b1f0f8074134bd7d" @@ -1093,6 +1460,13 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-typescript" "^7.22.5" +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-unicode-escapes@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" @@ -1210,6 +1584,92 @@ core-js-compat "^3.30.2" semver "^6.3.0" +"@babel/preset-env@^7.22.10": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.15.tgz#142716f8e00bc030dae5b2ac6a46fbd8b3e18ff8" + integrity sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.15" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.15" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.11" + "@babel/plugin-transform-classes" "^7.22.15" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.15" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.11" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.11" + "@babel/plugin-transform-for-of" "^7.22.15" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.11" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.15" + "@babel/plugin-transform-modules-systemjs" "^7.22.11" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" + "@babel/plugin-transform-numeric-separator" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.15" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.11" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.15" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + core-js-compat "^3.31.0" + semver "^6.3.1" + "@babel/preset-flow@^7.12.1": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.22.5.tgz#876f24ab6b38bd79703a93f32020ca2162312784" @@ -1219,6 +1679,15 @@ "@babel/helper-validator-option" "^7.22.5" "@babel/plugin-transform-flow-strip-types" "^7.22.5" +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + "@babel/preset-modules@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" @@ -1253,6 +1722,17 @@ "@babel/plugin-transform-modules-commonjs" "^7.22.5" "@babel/plugin-transform-typescript" "^7.22.5" +"@babel/preset-typescript@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.15.tgz#43db30516fae1d417d748105a0bc95f637239d48" + integrity sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.15" + "@babel/plugin-transform-typescript" "^7.22.15" + "@babel/register@^7.12.1": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.22.5.tgz#e4d8d0f615ea3233a27b5c6ada6750ee59559939" @@ -1299,6 +1779,15 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + "@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.22.5", "@babel/traverse@^7.7.2": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" @@ -1315,6 +1804,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.15.tgz#75be4d2d6e216e880e93017f4e2389aeb77ef2d9" + integrity sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + debug "^4.1.0" + globals "^11.1.0" + "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": version "7.22.8" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" @@ -1340,6 +1845,15 @@ "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" +"@babel/types@^7.22.10", "@babel/types@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.15.tgz#266cb21d2c5fd0b3931e7a91b6dd72d2f617d282" + integrity sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.15" + to-fast-properties "^2.0.0" + "@base2/pretty-print-object@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" @@ -2245,6 +2759,13 @@ dependencies: "@sinclair/typebox" "^0.27.8" +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + "@jest/source-map@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" @@ -2424,6 +2945,18 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" @@ -2690,7 +3223,7 @@ resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.4.tgz#7e4b491d8081b6d45ae51556d82cb16b31315a19" integrity sha512-yFrMWcrlI0TqRN5jpb6Ma9iI7sGTHpytdzzL33oskFHNQ8UgrtPas33Y1K7sWAMwCrr1qbWDrOHLAQG4tAzuSw== -"@mui/icons-material@^5.0.0", "@mui/icons-material@^5.2.0", "@mui/icons-material@^5.5.0": +"@mui/icons-material@^5.0.0", "@mui/icons-material@^5.2.0": version "5.11.16" resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.11.16.tgz#417fa773c56672e39d6ccfed9ac55591985f0d38" integrity sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A== @@ -3130,11 +3663,6 @@ "@cosmjs/stargate" "^0.25.5" axios "^0.21.1" -"@nymproject/sdk@^1.1.8": - version "1.1.8" - resolved "https://registry.yarnpkg.com/@nymproject/sdk/-/sdk-1.1.8.tgz#384ee824971dee413755b14634c3d60fb22eff9a" - integrity sha512-nAyem2wqTfc6l9e6Y7JR2V1teDfwjxMHpRjxg90FMkUWl/JP7Ww752gDsSq3nvObLt+cvxjWMHy1mswvwQfZyQ== - "@octokit/auth-token@^3.0.0": version "3.0.4" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.4.tgz#70e941ba742bdd2b49bdb7393e821dea8520a3db" @@ -3427,6 +3955,15 @@ "@rollup/pluginutils" "^5.0.1" resolve "^1.22.1" +"@rollup/plugin-url@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-url/-/plugin-url-8.0.1.tgz#8da005d4be8cb4439357c929c73c85ceb5d979a4" + integrity sha512-8ajztphXb5e19dk3Iwjtm2eSYJR8jFQubZ8pJ1GG2MBMM7/qUedLnZAN+Vt4jqbcT/m27jfjIBocvrzV0giNRw== + dependencies: + "@rollup/pluginutils" "^5.0.1" + make-dir "^3.1.0" + mime "^3.0.0" + "@rollup/plugin-wasm@^6.1.1": version "6.1.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-wasm/-/plugin-wasm-6.1.3.tgz#8d26a320780b15bf89d8d266ceda50823d5f978b" @@ -5993,6 +6530,11 @@ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== +"@webpack-cli/configtest@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" + integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== + "@webpack-cli/info@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" @@ -6000,11 +6542,21 @@ dependencies: envinfo "^7.7.3" +"@webpack-cli/info@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" + integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== + "@webpack-cli/serve@^1.7.0": version "1.7.0" resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== +"@webpack-cli/serve@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" + integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -6267,9 +6819,9 @@ ansi-regex@^6.0.1: integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-sequence-parser@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz#4d790f31236ac20366b23b3916b789e1bde39aed" - integrity sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" + integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== ansi-styles@^3.2.1: version "3.2.1" @@ -6690,6 +7242,14 @@ babel-loader@^8.0.0, babel-loader@^8.2.3, babel-loader@^8.3.0: make-dir "^3.1.0" schema-utils "^2.6.5" +babel-loader@^9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" + integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== + dependencies: + find-cache-dir "^4.0.0" + schema-utils "^4.0.0" + babel-plugin-add-react-displayname@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" @@ -6764,6 +7324,15 @@ babel-plugin-polyfill-corejs2@^0.4.3: "@babel/helper-define-polyfill-provider" "^0.4.0" semver "^6.1.1" +babel-plugin-polyfill-corejs2@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" + babel-plugin-polyfill-corejs3@^0.1.0: version "0.1.7" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" @@ -6780,6 +7349,14 @@ babel-plugin-polyfill-corejs3@^0.8.1: "@babel/helper-define-polyfill-provider" "^0.4.0" core-js-compat "^3.30.1" +babel-plugin-polyfill-corejs3@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.31.0" + babel-plugin-polyfill-regenerator@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" @@ -6787,6 +7364,13 @@ babel-plugin-polyfill-regenerator@^0.5.0: dependencies: "@babel/helper-define-polyfill-provider" "^0.4.0" +babel-plugin-polyfill-regenerator@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + babel-plugin-react-docgen@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz#7cc8e2f94e8dc057a06e953162f0810e4e72257b" @@ -7162,6 +7746,16 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4 node-releases "^2.0.12" update-browserslist-db "^1.0.11" +browserslist@^4.21.10: + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== + dependencies: + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -7453,6 +8047,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001503: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz#2b7ad5265392d6d2de25cd8776d1ab3899570d14" integrity sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA== +caniuse-lite@^1.0.30001517: + version "1.0.30001527" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz#813826554828245ccee776c850566dce12bdeaba" + integrity sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -7483,7 +8082,7 @@ chalk@4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.0.0, chalk@^2.4.1: +chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -7924,6 +8523,11 @@ commander@2, commander@^2.19.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commander@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -8191,6 +8795,18 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + core-js-compat@^3.30.1, core-js-compat@^3.30.2, core-js-compat@^3.8.1: version "3.31.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.0.tgz#4030847c0766cc0e803dcdfb30055d7ef2064bf1" @@ -8198,6 +8814,13 @@ core-js-compat@^3.30.1, core-js-compat@^3.30.2, core-js-compat@^3.8.1: dependencies: browserslist "^4.21.5" +core-js-compat@^3.31.0: + version "3.32.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" + integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== + dependencies: + browserslist "^4.21.10" + core-js-pure@^3.23.3: version "3.31.0" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.31.0.tgz#052fd9e82fbaaf86457f5db1fadcd06f15966ff2" @@ -8405,7 +9028,7 @@ css-loader@^5.0.1: schema-utils "^3.0.0" semver "^7.3.5" -css-loader@^6.7.3: +css-loader@^6.7.3, css-loader@^6.8.1: version "6.8.1" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== @@ -8431,6 +9054,18 @@ css-minimizer-webpack-plugin@^3.0.2: serialize-javascript "^6.0.0" source-map "^0.6.1" +css-minimizer-webpack-plugin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz#33effe662edb1a0bf08ad633c32fa75d0f7ec565" + integrity sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + cssnano "^6.0.1" + jest-worker "^29.4.3" + postcss "^8.4.24" + schema-utils "^4.0.1" + serialize-javascript "^6.0.1" + css-select@^4.1.3: version "4.3.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" @@ -8442,6 +9077,17 @@ css-select@^4.1.3: domutils "^2.8.0" nth-check "^2.0.1" +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -8450,6 +9096,22 @@ css-tree@^1.1.2, css-tree@^1.1.3: mdn-data "2.0.14" source-map "^0.6.1" +css-tree@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" + css-unit-converter@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" @@ -8463,7 +9125,7 @@ css-vendor@^2.0.8: "@babel/runtime" "^7.8.3" is-in-browser "^1.0.2" -css-what@^6.0.1: +css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== @@ -8513,11 +9175,51 @@ cssnano-preset-default@^5.2.14: postcss-svgo "^5.1.0" postcss-unique-selectors "^5.1.1" +cssnano-preset-default@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz#2a93247140d214ddb9f46bc6a3562fa9177fe301" + integrity sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^4.0.0" + postcss-calc "^9.0.0" + postcss-colormin "^6.0.0" + postcss-convert-values "^6.0.0" + postcss-discard-comments "^6.0.0" + postcss-discard-duplicates "^6.0.0" + postcss-discard-empty "^6.0.0" + postcss-discard-overridden "^6.0.0" + postcss-merge-longhand "^6.0.0" + postcss-merge-rules "^6.0.1" + postcss-minify-font-values "^6.0.0" + postcss-minify-gradients "^6.0.0" + postcss-minify-params "^6.0.0" + postcss-minify-selectors "^6.0.0" + postcss-normalize-charset "^6.0.0" + postcss-normalize-display-values "^6.0.0" + postcss-normalize-positions "^6.0.0" + postcss-normalize-repeat-style "^6.0.0" + postcss-normalize-string "^6.0.0" + postcss-normalize-timing-functions "^6.0.0" + postcss-normalize-unicode "^6.0.0" + postcss-normalize-url "^6.0.0" + postcss-normalize-whitespace "^6.0.0" + postcss-ordered-values "^6.0.0" + postcss-reduce-initial "^6.0.0" + postcss-reduce-transforms "^6.0.0" + postcss-svgo "^6.0.0" + postcss-unique-selectors "^6.0.0" + cssnano-utils@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== +cssnano-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-4.0.0.tgz#d1da885ec04003ab19505ff0e62e029708d36b08" + integrity sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw== + cssnano@^5.0.6: version "5.1.15" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" @@ -8527,6 +9229,14 @@ cssnano@^5.0.6: lilconfig "^2.0.3" yaml "^1.10.2" +cssnano@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.0.1.tgz#87c38c4cd47049c735ab756d7e77ac3ca855c008" + integrity sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg== + dependencies: + cssnano-preset-default "^6.0.1" + lilconfig "^2.1.0" + csso@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" @@ -8534,6 +9244,13 @@ csso@^4.2.0: dependencies: css-tree "^1.1.2" +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== + dependencies: + css-tree "~2.2.0" + cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" @@ -9166,6 +9883,15 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" @@ -9176,7 +9902,7 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@^2.0.1, domelementtype@^2.2.0: +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== @@ -9195,6 +9921,13 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: dependencies: domelementtype "^2.2.0" +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -9204,6 +9937,15 @@ domutils@^2.5.2, domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -9245,6 +9987,13 @@ dotenv-webpack@^7.0.3: dependencies: dotenv-defaults "^2.0.2" +dotenv-webpack@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-8.0.1.tgz#6656550460a8076fab20e5ac2eac867e72478645" + integrity sha512-CdrgfhZOnx4uB18SgaoP9XHRN2v48BbjuXQsZY5ixs5A8579NxQkmMxRtI7aTwSiSQcM2ao12Fdu+L3ZS3bG4w== + dependencies: + dotenv-defaults "^2.0.2" + dotenv@^16.0.3: version "16.3.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" @@ -9297,6 +10046,11 @@ electron-to-chromium@^1.4.431: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.445.tgz#058d2c5f3a2981ab1a37440f5a5e42d15672aa6d" integrity sha512-++DB+9VK8SBJwC+X1zlMfJ1tMA3F0ipi39GdEp+x3cV2TyBihqAgad8cNMWtLDEkbH39nlDQP7PfGrDr3Dr7HA== +electron-to-chromium@^1.4.477: + version "1.4.508" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" + integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== + elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -9392,7 +10146,7 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^4.4.0: +entities@^4.2.0, entities@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== @@ -10307,6 +11061,17 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" +fast-glob@^3.2.11, fast-glob@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -10506,6 +11271,14 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== + dependencies: + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" + find-root@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" @@ -10549,6 +11322,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -10665,6 +11446,24 @@ fork-ts-checker-webpack-plugin@^7.2.1: semver "^7.3.5" tapable "^2.2.1" +fork-ts-checker-webpack-plugin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz#dae45dfe7298aa5d553e2580096ced79b6179504" + integrity sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg== + dependencies: + "@babel/code-frame" "^7.16.7" + chalk "^4.1.2" + chokidar "^3.5.3" + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + fs-extra "^10.0.0" + memfs "^3.4.1" + minimatch "^3.0.4" + node-abort-controller "^3.0.1" + schema-utils "^3.1.1" + semver "^7.3.5" + tapable "^2.2.1" + form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -11005,7 +11804,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^6.0.2: +glob-parent@^6.0.1, glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -11136,6 +11935,17 @@ globby@11.1.0, globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" +globby@^13.1.1: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -11532,7 +12342,7 @@ html-void-elements@^1.0.0: resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== -html-webpack-plugin@>=5.0.0, html-webpack-plugin@^5.0.0, html-webpack-plugin@^5.3.2: +html-webpack-plugin@>=5.0.0, html-webpack-plugin@^5.0.0, html-webpack-plugin@^5.3.2, html-webpack-plugin@^5.5.3: version "5.5.3" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== @@ -11739,7 +12549,7 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.4, ignore@^5.2.0: +ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -11899,6 +12709,11 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + ip@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" @@ -13393,6 +14208,18 @@ jest-util@^29.5.0: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.3.tgz#e15c3eac8716440d1ed076f09bc63ace1aebca63" + integrity sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" @@ -13462,6 +14289,16 @@ jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: merge-stream "^2.0.0" supports-color "^8.0.0" +jest-worker@^29.4.3: + version "29.6.4" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.4.tgz#f34279f4afc33c872b470d4af21b281ac616abd3" + integrity sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q== + dependencies: + "@types/node" "*" + jest-util "^29.6.3" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jest-worker@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.1.tgz#64b015f0e985ef3a8ad049b61fe92b3db74a5319" @@ -13946,7 +14783,7 @@ lie@3.1.1: dependencies: immediate "~3.0.5" -lilconfig@^2.0.3: +lilconfig@^2.0.3, lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== @@ -14057,6 +14894,13 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" @@ -14511,6 +15355,16 @@ mdn-data@2.0.14: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + mdurl@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -14981,6 +15835,11 @@ mime@^2.4.4: resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -15008,7 +15867,7 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -mini-css-extract-plugin@^2.2.2: +mini-css-extract-plugin@^2.2.2, mini-css-extract-plugin@^2.7.6: version "2.7.6" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== @@ -15525,6 +16384,11 @@ node-releases@^2.0.12: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + nodemon@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.0.1.tgz#affe822a2c5f21354466b2fc8ae83277d27dadc7" @@ -16167,6 +17031,13 @@ p-limit@^3.0.2, p-limit@^3.1.0: dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -16195,6 +17066,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map-series@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" @@ -16498,6 +17376,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -16655,6 +17538,13 @@ pkg-dir@^5.0.0: dependencies: find-up "^5.0.0" +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + pnp-webpack-plugin@1.6.4: version "1.6.4" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" @@ -16682,6 +17572,14 @@ postcss-calc@^8.2.3: postcss-selector-parser "^6.0.9" postcss-value-parser "^4.2.0" +postcss-calc@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" + integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ== + dependencies: + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + postcss-colormin@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" @@ -16692,6 +17590,16 @@ postcss-colormin@^5.3.1: colord "^2.9.1" postcss-value-parser "^4.2.0" +postcss-colormin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.0.0.tgz#d4250652e952e1c0aca70c66942da93d3cdeaafe" + integrity sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + postcss-convert-values@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" @@ -16700,26 +17608,54 @@ postcss-convert-values@^5.1.3: browserslist "^4.21.4" postcss-value-parser "^4.2.0" +postcss-convert-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz#ec94a954957e5c3f78f0e8f65dfcda95280b8996" + integrity sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + postcss-discard-comments@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== +postcss-discard-comments@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz#9ca335e8b68919f301b24ba47dde226a42e535fe" + integrity sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw== + postcss-discard-duplicates@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== +postcss-discard-duplicates@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz#c26177a6c33070922e67e9a92c0fd23d443d1355" + integrity sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA== + postcss-discard-empty@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== +postcss-discard-empty@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz#06c1c4fce09e22d2a99e667c8550eb8a3a1b9aee" + integrity sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ== + postcss-discard-overridden@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== +postcss-discard-overridden@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz#49c5262db14e975e349692d9024442de7cd8e234" + integrity sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw== + postcss-flexbugs-fixes@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" @@ -16746,6 +17682,14 @@ postcss-merge-longhand@^5.1.7: postcss-value-parser "^4.2.0" stylehacks "^5.1.1" +postcss-merge-longhand@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz#6f627b27db939bce316eaa97e22400267e798d69" + integrity sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^6.0.0" + postcss-merge-rules@^5.1.4: version "5.1.4" resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" @@ -16756,6 +17700,16 @@ postcss-merge-rules@^5.1.4: cssnano-utils "^3.1.0" postcss-selector-parser "^6.0.5" +postcss-merge-rules@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz#39f165746404e646c0f5c510222ccde4824a86aa" + integrity sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + cssnano-utils "^4.0.0" + postcss-selector-parser "^6.0.5" + postcss-minify-font-values@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" @@ -16763,6 +17717,13 @@ postcss-minify-font-values@^5.1.0: dependencies: postcss-value-parser "^4.2.0" +postcss-minify-font-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz#68d4a028f9fa5f61701974724b2cc9445d8e6070" + integrity sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA== + dependencies: + postcss-value-parser "^4.2.0" + postcss-minify-gradients@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" @@ -16772,6 +17733,15 @@ postcss-minify-gradients@^5.1.1: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" +postcss-minify-gradients@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz#22b5c88cc63091dadbad34e31ff958404d51d679" + integrity sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA== + dependencies: + colord "^2.9.1" + cssnano-utils "^4.0.0" + postcss-value-parser "^4.2.0" + postcss-minify-params@^5.1.4: version "5.1.4" resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" @@ -16781,6 +17751,15 @@ postcss-minify-params@^5.1.4: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" +postcss-minify-params@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz#2b3a85a9e3b990d7a16866f430f5fd1d5961b539" + integrity sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^4.0.0" + postcss-value-parser "^4.2.0" + postcss-minify-selectors@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" @@ -16788,6 +17767,13 @@ postcss-minify-selectors@^5.2.1: dependencies: postcss-selector-parser "^6.0.5" +postcss-minify-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz#5046c5e8680a586e5a0cad52cc9aa36d6be5bda2" + integrity sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g== + dependencies: + postcss-selector-parser "^6.0.5" + postcss-modules-extract-imports@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" @@ -16854,6 +17840,11 @@ postcss-normalize-charset@^5.1.0: resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== +postcss-normalize-charset@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz#36cc12457259064969fb96f84df491652a4b0975" + integrity sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ== + postcss-normalize-display-values@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" @@ -16861,6 +17852,13 @@ postcss-normalize-display-values@^5.1.0: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize-display-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz#8d2961415078644d8c6bbbdaf9a2fdd60f546cd4" + integrity sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize-positions@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" @@ -16868,6 +17866,13 @@ postcss-normalize-positions@^5.1.1: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize-positions@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz#25b96df99a69f8925f730eaee0be74416865e301" + integrity sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize-repeat-style@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" @@ -16875,6 +17880,13 @@ postcss-normalize-repeat-style@^5.1.1: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize-repeat-style@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz#ddf30ad8762feb5b1eb97f39f251acd7b8353299" + integrity sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize-string@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" @@ -16882,6 +17894,13 @@ postcss-normalize-string@^5.1.0: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize-string@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz#948282647a51e409d69dde7910f0ac2ff97cb5d8" + integrity sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize-timing-functions@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" @@ -16889,6 +17908,13 @@ postcss-normalize-timing-functions@^5.1.0: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize-timing-functions@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz#5f13e650b8c43351989fc5de694525cc2539841c" + integrity sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize-unicode@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" @@ -16897,6 +17923,14 @@ postcss-normalize-unicode@^5.1.1: browserslist "^4.21.4" postcss-value-parser "^4.2.0" +postcss-normalize-unicode@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz#741b3310f874616bdcf07764f5503695d3604730" + integrity sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + postcss-normalize-url@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" @@ -16905,6 +17939,13 @@ postcss-normalize-url@^5.1.0: normalize-url "^6.0.1" postcss-value-parser "^4.2.0" +postcss-normalize-url@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz#d0a31e962a16401fb7deb7754b397a323fb650b4" + integrity sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw== + dependencies: + postcss-value-parser "^4.2.0" + postcss-normalize-whitespace@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" @@ -16912,6 +17953,13 @@ postcss-normalize-whitespace@^5.1.1: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize-whitespace@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz#accb961caa42e25ca4179b60855b79b1f7129d4d" + integrity sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw== + dependencies: + postcss-value-parser "^4.2.0" + postcss-ordered-values@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" @@ -16920,6 +17968,14 @@ postcss-ordered-values@^5.1.3: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" +postcss-ordered-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz#374704cdff25560d44061d17ba3c6308837a3218" + integrity sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg== + dependencies: + cssnano-utils "^4.0.0" + postcss-value-parser "^4.2.0" + postcss-reduce-initial@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" @@ -16928,6 +17984,14 @@ postcss-reduce-initial@^5.1.2: browserslist "^4.21.4" caniuse-api "^3.0.0" +postcss-reduce-initial@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz#7d16e83e60e27e2fa42f56ec0b426f1da332eca7" + integrity sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + postcss-reduce-transforms@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" @@ -16935,7 +17999,14 @@ postcss-reduce-transforms@^5.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: +postcss-reduce-transforms@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz#28ff2601a6d9b96a2f039b3501526e1f4d584a46" + integrity sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: version "6.0.13" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== @@ -16951,6 +18022,14 @@ postcss-svgo@^5.1.0: postcss-value-parser "^4.2.0" svgo "^2.7.0" +postcss-svgo@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.0.tgz#7b18742d38d4505a0455bbe70d52b49f00eaf69d" + integrity sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^3.0.2" + postcss-unique-selectors@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" @@ -16958,6 +18037,13 @@ postcss-unique-selectors@^5.1.1: dependencies: postcss-selector-parser "^6.0.5" +postcss-unique-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz#c94e9b0f7bffb1203894e42294b5a1b3fb34fbe1" + integrity sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw== + dependencies: + postcss-selector-parser "^6.0.5" + postcss-value-parser@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" @@ -16985,6 +18071,15 @@ postcss@^8.2.15, postcss@^8.3.5, postcss@^8.4.21: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.24: + version "8.4.29" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" + integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prebuild-install@^7.0.0, prebuild-install@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" @@ -17583,7 +18678,7 @@ react-merge-refs@^1.0.0: resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-1.1.0.tgz#73d88b892c6c68cbb7a66e0800faa374f4c38b06" integrity sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ== -react-refresh-typescript@^2.0.2, react-refresh-typescript@^2.0.3: +react-refresh-typescript@^2.0.2: version "2.0.9" resolved "https://registry.yarnpkg.com/react-refresh-typescript/-/react-refresh-typescript-2.0.9.tgz#f8a86efcb34f8d717100230564b9b57477d74b10" integrity sha512-chAnOO4vpxm/3WkgOVmti+eN8yUtkJzeGkOigV6UA9eDFz12W34e/SsYe2H5+RwYJ3+sfSZkVbiXcG1chEBxlg== @@ -17879,6 +18974,13 @@ rechoir@^0.7.0: dependencies: resolve "^1.9.0" +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -17927,6 +19029,13 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -18473,7 +19582,7 @@ schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: +schema-utils@^4.0.0, schema-utils@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== @@ -18526,6 +19635,11 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + semver@^7.5.3: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" @@ -18824,6 +19938,11 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -18911,7 +20030,7 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.2: +source-map-js@^1.0.1, source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -19381,7 +20500,7 @@ style-loader@^2.0.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -style-loader@^3.3.1: +style-loader@^3.3.1, style-loader@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== @@ -19408,6 +20527,14 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" +stylehacks@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.0.0.tgz#9fdd7c217660dae0f62e14d51c89f6c01b3cb738" + integrity sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + stylis@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" @@ -19470,6 +20597,18 @@ svgo@^2.7.0, svgo@^2.8.0: picocolors "^1.0.0" stable "^0.1.8" +svgo@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.0.2.tgz#5e99eeea42c68ee0dc46aa16da093838c262fe0a" + integrity sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^5.1.0" + css-tree "^2.2.1" + csso "^5.0.5" + picocolors "^1.0.0" + symbol-observable@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" @@ -19701,6 +20840,16 @@ thread-loader@^3.0.4: neo-async "^2.6.2" schema-utils "^3.0.0" +thread-loader@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-4.0.2.tgz#f7b4484beab1f928818d8ecd96ef20c618d1fadc" + integrity sha512-UOk/KBydsQjh4Ja5kocxDUzhv11KYptHN/h8gdSwo6/MBkYrWqQua6K2qwlpXnCXS9c/uLs8F/JF8rpveF0+fA== + dependencies: + json-parse-better-errors "^1.0.2" + loader-runner "^4.1.0" + neo-async "^2.6.2" + schema-utils "^4.0.1" + throat@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" @@ -19936,7 +21085,7 @@ ts-jest@^29.1.0: semver "^7.5.3" yargs-parser "^21.0.1" -ts-loader@^9.4.2: +ts-loader@^9.4.2, ts-loader@^9.4.4: version "9.4.4" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.4.tgz#6ceaf4d58dcc6979f84125335904920884b7cee4" integrity sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w== @@ -20002,6 +21151,15 @@ tsconfig-paths-webpack-plugin@^3.5.2: enhanced-resolve "^5.7.0" tsconfig-paths "^3.9.0" +tsconfig-paths-webpack-plugin@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz#3c6892c5e7319c146eee1e7302ed9e6f2be4f763" + integrity sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^4.1.2" + tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0, tsconfig-paths@^3.9.0: version "3.14.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" @@ -20882,6 +22040,25 @@ webpack-cli@^4.8.0: rechoir "^0.7.0" webpack-merge "^5.7.3" +webpack-cli@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" + integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^2.1.1" + "@webpack-cli/info" "^2.0.2" + "@webpack-cli/serve" "^2.0.5" + colorette "^2.0.14" + commander "^10.0.1" + cross-spawn "^7.0.3" + envinfo "^7.7.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^5.7.3" + webpack-dev-middleware@^3.7.3: version "3.7.3" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" @@ -20916,7 +22093,7 @@ webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.5.0: +webpack-dev-server@^4.15.1, webpack-dev-server@^4.5.0: version "4.15.1" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== @@ -20981,7 +22158,7 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" -webpack-merge@^5.7.3, webpack-merge@^5.8.0: +webpack-merge@^5.7.3, webpack-merge@^5.8.0, webpack-merge@^5.9.0: version "5.9.0" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== @@ -21073,6 +22250,36 @@ webpack@4: watchpack "^2.4.0" webpack-sources "^3.2.3" +webpack@^5.88.2: + version "5.88.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" + integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.7" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" @@ -21476,6 +22683,11 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + yup@^0.32.9: version "0.32.11" resolved "https://registry.yarnpkg.com/yup/-/yup-0.32.11.tgz#d67fb83eefa4698607982e63f7ca4c5ed3cf18c5" From 90a925ee621431d5d264b1d49a5ccaf1548bea15 Mon Sep 17 00:00:00 2001 From: Mark Sinclair <14054343+mmsinclair@users.noreply.github.com> Date: Thu, 7 Sep 2023 12:45:48 +0100 Subject: [PATCH 29/47] Add auto-generated contract client (#3861) * Add auto-generated contract client * Use HTTPS instead of websockets --------- Co-authored-by: Mark Sinclair --- sdk/typescript/codegen/.gitignore | 2 + .../codegen/contract-clients/.eslintrc.json | 5 + .../codegen/contract-clients/README.md | 34 + .../codegen/contract-clients/build.mjs | 36 + .../contract-clients/internal-dev/index.ts | 18 + .../internal-dev/package-lock.json | 28 + .../internal-dev/package.json | 14 + .../contract-clients/package-lock.json | 6508 +++++++++++++++++ .../codegen/contract-clients/package.json | 29 + .../src/CoconutBandwidth.client.ts | 130 + .../src/CoconutBandwidth.types.ts | 67 + .../contract-clients/src/CoconutDkg.client.ts | 283 + .../contract-clients/src/CoconutDkg.types.ts | 154 + .../src/Cw3FlexMultisig.client.ts | 308 + .../src/Cw3FlexMultisig.types.ts | 355 + .../contract-clients/src/Cw4Group.client.ts | 188 + .../contract-clients/src/Cw4Group.types.ts | 67 + .../contract-clients/src/Mixnet.client.ts | 1673 +++++ .../contract-clients/src/Mixnet.types.ts | 799 ++ .../src/NameService.client.ts | 241 + .../contract-clients/src/NameService.types.ts | 108 + .../src/ServiceProviderDirectory.client.ts | 224 + .../src/ServiceProviderDirectory.types.ts | 104 + .../contract-clients/src/Vesting.client.ts | 1058 +++ .../contract-clients/src/Vesting.types.ts | 379 + .../codegen/contract-clients/src/index.ts | 35 + .../codegen/contract-clients/src/types.ts | 4 + .../codegen/contract-clients/tsconfig.json | 41 + .../codegen/contract-clients/typedoc.json | 31 + 29 files changed, 12923 insertions(+) create mode 100644 sdk/typescript/codegen/.gitignore create mode 100644 sdk/typescript/codegen/contract-clients/.eslintrc.json create mode 100644 sdk/typescript/codegen/contract-clients/README.md create mode 100644 sdk/typescript/codegen/contract-clients/build.mjs create mode 100644 sdk/typescript/codegen/contract-clients/internal-dev/index.ts create mode 100644 sdk/typescript/codegen/contract-clients/internal-dev/package-lock.json create mode 100644 sdk/typescript/codegen/contract-clients/internal-dev/package.json create mode 100644 sdk/typescript/codegen/contract-clients/package-lock.json create mode 100644 sdk/typescript/codegen/contract-clients/package.json create mode 100644 sdk/typescript/codegen/contract-clients/src/CoconutBandwidth.client.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/CoconutBandwidth.types.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/CoconutDkg.client.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/CoconutDkg.types.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/Cw3FlexMultisig.client.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/Cw3FlexMultisig.types.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/Cw4Group.client.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/Cw4Group.types.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/Mixnet.client.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/Mixnet.types.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/NameService.client.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/NameService.types.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/ServiceProviderDirectory.client.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/ServiceProviderDirectory.types.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/Vesting.client.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/Vesting.types.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/index.ts create mode 100644 sdk/typescript/codegen/contract-clients/src/types.ts create mode 100644 sdk/typescript/codegen/contract-clients/tsconfig.json create mode 100644 sdk/typescript/codegen/contract-clients/typedoc.json diff --git a/sdk/typescript/codegen/.gitignore b/sdk/typescript/codegen/.gitignore new file mode 100644 index 0000000000..53253fe4cb --- /dev/null +++ b/sdk/typescript/codegen/.gitignore @@ -0,0 +1,2 @@ +docs +dist \ No newline at end of file diff --git a/sdk/typescript/codegen/contract-clients/.eslintrc.json b/sdk/typescript/codegen/contract-clients/.eslintrc.json new file mode 100644 index 0000000000..83e95d88a7 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "parserOptions": { + "project": "./tsconfig.eslint.json" + } +} diff --git a/sdk/typescript/codegen/contract-clients/README.md b/sdk/typescript/codegen/contract-clients/README.md new file mode 100644 index 0000000000..c311b7e9c7 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/README.md @@ -0,0 +1,34 @@ +# Nym Smart Contract Clients + +This package contains read-only query and signing clients for all Nym's smart contracts. + +## Usage + +First install the package and its dependencies from Cosmos Stargate: + +``` +npm install @nymproject/contract-clients @cosmjs/cosmwasm-stargate @cosmjs/proto-signing +``` + +Then execute some methods, signing them with a mnemonic: + +```ts +import { contracts } from '@nymproject/contract-clients'; +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm-stargate"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +async function main() { + // generate a signer from a mnemonic + const signer = await DirectSecp256k1HdWallet.fromMnemonic("..."); + const accounts = await signer.getAccounts(); + + // make a signing client for the Nym Mixnet contract on mainnet + const cosmWasmSigningClient = await SigningCosmWasmClient.connectWithSigner("rpc.nymtech.net:443", signer); + const client = new contracts.Mixnet.MixnetClient(cosmWasmSigningClient, accounts[0].address, 'n17srjznxl9dvzdkpwpw24gg668wc73val88a6m5ajg6ankwvz9wtst0cznr'); + + // delegate 1 NYM to mixnode with id 100 + const result = await client.delegateToMixnode({ mixId: 100 }, 'auto', undefined, [{ amount: `${1_000_000}`, denom: 'unym' }]); + + console.log(`Tx Hash = ${result.transactionHash}`); +} +``` diff --git a/sdk/typescript/codegen/contract-clients/build.mjs b/sdk/typescript/codegen/contract-clients/build.mjs new file mode 100644 index 0000000000..5a6b6220f6 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/build.mjs @@ -0,0 +1,36 @@ +import codegen from '@cosmwasm/ts-codegen'; + +codegen + .default({ + contracts: [ + { name: 'coconut-bandwidth', dir: '../../../../contracts/coconut-bandwidth' }, + { name: 'coconut-dkg', dir: '../../../../contracts/coconut-dkg' }, + { name: 'mixnet', dir: '../../../../contracts/mixnet' }, + { name: 'cw3-flex-multisig', dir: '../../../../contracts/multisig/cw3-flex-multisig' }, + { name: 'cw4-group', dir: '../../../../contracts/multisig/cw4-group' }, + { name: 'name-service', dir: '../../../../contracts/name-service' }, + { name: 'service-provider-directory', dir: '../../../../contracts/service-provider-directory' }, + { name: 'vesting', dir: '../../../../contracts/vesting' }, + ], + outPath: './src', + + // options are completely optional ;) + options: { + bundle: { + bundleFile: 'index.ts', + scope: 'contracts', + }, + types: { + enabled: true, + }, + client: { + enabled: true, + }, + // useContractsHooks: { + // enabled: false, + // }, + }, + }) + .then(() => { + console.log('✨ all done!'); + }); diff --git a/sdk/typescript/codegen/contract-clients/internal-dev/index.ts b/sdk/typescript/codegen/contract-clients/internal-dev/index.ts new file mode 100644 index 0000000000..ec5a003726 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/internal-dev/index.ts @@ -0,0 +1,18 @@ +import { contracts } from '@nymproject/contract-clients'; +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm-stargate"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +async function main() { + // generate a signer from a mnemonic + const signer = await DirectSecp256k1HdWallet.fromMnemonic("..."); + const accounts = await signer.getAccounts(); + + // make a signing client for the Nym Mixnet contract on mainnet + const cosmWasmSigningClient = await SigningCosmWasmClient.connectWithSigner("https://rpc.nymtech.net:443", signer); + const client = new contracts.Mixnet.MixnetClient(cosmWasmSigningClient, accounts[0].address, 'n17srjznxl9dvzdkpwpw24gg668wc73val88a6m5ajg6ankwvz9wtst0cznr'); + + // delegate 1 NYM to mixnode with id 100 + const result = await client.delegateToMixnode({ mixId: 100 }, 'auto', undefined, [{ amount: `${1_000_000}`, denom: 'unym' }]); + + console.log(`Tx Hash = ${result.transactionHash}`); +} diff --git a/sdk/typescript/codegen/contract-clients/internal-dev/package-lock.json b/sdk/typescript/codegen/contract-clients/internal-dev/package-lock.json new file mode 100644 index 0000000000..04498662ff --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/internal-dev/package-lock.json @@ -0,0 +1,28 @@ +{ + "name": "internal-dev-contract-clients", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "internal-dev-contract-clients", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@nymproject/contract-clients": "file:.." + } + }, + "..": { + "version": "1.0.0", + "license": "Apache-2.0", + "devDependencies": { + "@cosmwasm/ts-codegen": "^0.35.3", + "typescript": "^4.6.2" + } + }, + "node_modules/@nymproject/contract-clients": { + "resolved": "..", + "link": true + } + } +} diff --git a/sdk/typescript/codegen/contract-clients/internal-dev/package.json b/sdk/typescript/codegen/contract-clients/internal-dev/package.json new file mode 100644 index 0000000000..e41a628208 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/internal-dev/package.json @@ -0,0 +1,14 @@ +{ + "name": "internal-dev-contract-clients", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "@nymproject/contract-clients": "file:.." + }, + "author": "", + "license": "ISC" +} diff --git a/sdk/typescript/codegen/contract-clients/package-lock.json b/sdk/typescript/codegen/contract-clients/package-lock.json new file mode 100644 index 0000000000..219b1f89f7 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/package-lock.json @@ -0,0 +1,6508 @@ +{ + "name": "@nymproject/contract-clients", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@nymproject/contract-clients", + "version": "1.0.0", + "license": "Apache-2.0", + "devDependencies": { + "@cosmwasm/ts-codegen": "^0.35.3", + "nodemon": "3.0.1", + "npm-run-all": "^4.1.5", + "reload": "^3.2.1", + "typedoc": "^0.24.8", + "typescript": "^4.6.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", + "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", + "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", + "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.10", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/parser": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/traverse": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", + "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz", + "integrity": "sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-default-from": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.22.5.tgz", + "integrity": "sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", + "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", + "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", + "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", + "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz", + "integrity": "sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", + "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.18.10", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.18.10", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", + "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", + "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/parser": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", + "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cosmwasm/ts-codegen": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@cosmwasm/ts-codegen/-/ts-codegen-0.35.3.tgz", + "integrity": "sha512-L7T4yjAQIWJ/h0YmqVjihzv78ZbqGD/f0G8EJTwccsPXqWzbcnXzQKsvtFXpDp6AzaJKVMchFHfp6ZPRP3boUQ==", + "dev": true, + "dependencies": { + "@babel/core": "7.18.10", + "@babel/generator": "7.18.12", + "@babel/parser": "7.18.11", + "@babel/plugin-proposal-class-properties": "7.18.6", + "@babel/plugin-proposal-export-default-from": "7.18.10", + "@babel/plugin-proposal-object-rest-spread": "7.18.9", + "@babel/plugin-transform-runtime": "7.18.10", + "@babel/preset-env": "7.18.10", + "@babel/preset-typescript": "^7.18.6", + "@babel/runtime": "^7.18.9", + "@babel/traverse": "7.18.11", + "@babel/types": "7.18.10", + "@pyramation/json-schema-to-typescript": " 11.0.4", + "case": "1.6.3", + "dargs": "7.0.0", + "deepmerge": "4.2.2", + "dotty": "0.1.2", + "fuzzy": "0.1.3", + "glob": "8.0.3", + "inquirerer": "0.1.3", + "long": "^5.2.0", + "minimist": "1.2.6", + "mkdirp": "1.0.4", + "parse-package-name": "1.0.0", + "rimraf": "3.0.2", + "shelljs": "0.8.5", + "wasm-ast-types": "^0.26.2" + }, + "bin": { + "cosmwasm-ts-codegen": "main/ts-codegen.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", + "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "node_modules/@pyramation/json-schema-ref-parser": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@pyramation/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", + "integrity": "sha512-L5kToHAEc1Q87R8ZwWFaNa4tPHr8Hnm+U+DRdUVq3tUtk+EX4pCqSd34Z6EMxNi/bjTzt1syAG9J2Oo1YFlqSg==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + }, + "node_modules/@pyramation/json-schema-to-typescript": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@pyramation/json-schema-to-typescript/-/json-schema-to-typescript-11.0.4.tgz", + "integrity": "sha512-+aSzXDLhMHOEdV2cJ7Tjg/9YenjHU5BCmClVygzwxJZ1R16NOfEn7lTAwVzb/2jivOSnhjHzMJbnSf8b6rd1zg==", + "dev": true, + "dependencies": { + "@pyramation/json-schema-ref-parser": "9.0.6", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", + "get-stdin": "^8.0.0", + "glob": "^7.1.6", + "glob-promise": "^4.2.2", + "is-glob": "^4.0.3", + "lodash": "^4.17.21", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "prettier": "^2.6.2" + }, + "bin": { + "json2ts": "dist/src/cli.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@pyramation/json-schema-to-typescript/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@pyramation/json-schema-to-typescript/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@pyramation/json-schema-to-typescript/node_modules/glob-promise": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" + }, + "peerDependencies": { + "glob": "^7.1.6" + } + }, + "node_modules/@pyramation/json-schema-to-typescript/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.197", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", + "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.5.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.3.tgz", + "integrity": "sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-stringify": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ast-stringify/-/ast-stringify-0.1.0.tgz", + "integrity": "sha512-J1PgFYV3RG6r37+M6ySZJH406hR82okwGvFM9hLXpOvdx4WC4GEW8/qiw6pi1hKTrqcRvoHP8a7mp87egYr6iA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.11.2" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", + "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.2", + "core-js-compat": "^3.21.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001522", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", + "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/case": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", + "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotty": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotty/-/dotty-0.1.2.tgz", + "integrity": "sha512-V0EWmKeH3DEhMwAZ+8ZB2Ao4OK6p++Z0hsDtZq3N0+0ZMVqkzrcEGROvOnZpLnvBg5PTNG23JEDLAm64gPaotQ==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.499", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.499.tgz", + "integrity": "sha512-0NmjlYBLKVHva4GABWAaHuPJolnDuL0AhV3h1hES6rcLCWEIbRL6/8TghfsVwkx6TEroQVdliX7+aLysUpKvjw==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzy": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", + "integrity": "sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer-autocomplete-prompt": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-0.11.1.tgz", + "integrity": "sha512-VM4eNiyRD4CeUc2cyKni+F8qgHwL9WC4LdOr+mEC85qP/QNsDV+ysVqUrJYhw1TmDQu1QVhc8hbaL7wfk8SJxw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^2.0.0", + "chalk": "^1.1.3", + "figures": "^2.0.0", + "inquirer": "3.1.1", + "lodash": "^4.17.4", + "run-async": "^2.3.0", + "util": "^0.10.3" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha512-tH/fSoQp4DrEodDK3QpdiWiZTSe7sBJ9eOqcQBZ0o9HTM+5M/viSEn+sPMoTuPjQQ8n++w3QJoPEjt8LVPcrCg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", + "dev": true + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/inquirer": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.1.tgz", + "integrity": "sha512-H50sHQwgvvaTBd3HpKMVtL/u6LoHDvYym51gd7bGQe/+9HkCE+J0/3N5FJLfd6O6oz44hHewC2Pc2LodzWVafQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.0.0", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/inquirerer": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/inquirerer/-/inquirerer-0.1.3.tgz", + "integrity": "sha512-yGgLUOqPxTsINBjZNZeLi3cv2zgxXtw9feaAOSJf2j6AqIT5Uxs5ZOqOrfAf+xP65Sicla1FD3iDxa3D6TsCAQ==", + "dev": true, + "dependencies": { + "colors": "^1.1.2", + "inquirer": "^6.0.0", + "inquirer-autocomplete-prompt": "^0.11.1" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", + "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nodemon/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nodemon/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm-run-all/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-package-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-package-name/-/parse-package-name-1.0.0.tgz", + "integrity": "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/reload": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/reload/-/reload-3.2.1.tgz", + "integrity": "sha512-ZdM8ZSEeI72zkhh6heMEvJ0vHZoovZXcJI6Zae8CzS7o5vO/WjZsAMMr0y1+3I/fCN7y7ZxABoUwwCswcLHkjQ==", + "dev": true, + "dependencies": { + "cli-color": "~2.0.0", + "commander": "~9.4.0", + "finalhandler": "~1.2.0", + "minimist": "~1.2.0", + "open": "^8.0.0", + "serve-static": "~1.15.0", + "supervisor": "~0.12.0", + "ws": "~8.11.0" + }, + "bin": { + "reload": "bin/reload" + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA==", + "dev": true + }, + "node_modules/rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg==", + "dev": true, + "dependencies": { + "rx-lite": "*" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/shelljs/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/shiki": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", + "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "dev": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/supervisor": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/supervisor/-/supervisor-0.12.0.tgz", + "integrity": "sha512-iBYeU5Or4WiiIa3+ns1DpHIiHjNNXSuYUiixKcznewwo4ImBJ8EobktaAo2csOcauhrz4SvKRTou8Z2C3W28+A==", + "dev": true, + "bin": { + "node-supervisor": "lib/cli-wrapper.js", + "supervisor": "lib/cli-wrapper.js" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedoc": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", + "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.0", + "shiki": "^0.14.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 14.14" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/wasm-ast-types": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/wasm-ast-types/-/wasm-ast-types-0.26.2.tgz", + "integrity": "sha512-DM34W0Sexd/BreN4g1ZjfaDC8hkKIw3FykV7vT9KdhCoroH+Qncz+jvSEI0fEDqbtJkWiP9Z+u61a5LPObHKaA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.18.9", + "@babel/types": "7.18.10", + "@jest/transform": "28.1.3", + "ast-stringify": "0.1.0", + "case": "1.6.3", + "deepmerge": "4.2.2" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } +} diff --git a/sdk/typescript/codegen/contract-clients/package.json b/sdk/typescript/codegen/contract-clients/package.json new file mode 100644 index 0000000000..7f70204918 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/package.json @@ -0,0 +1,29 @@ +{ + "name": "@nymproject/contract-clients", + "version": "1.2.0-rc.1", + "description": "A client for all Nym smart contracts", + "main": "dist/index.js", + "browser": "dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "build": "tsc", + "build:autogen": "node build.mjs", + "docs:dev": "run-p docs:watch docs:serve ", + "docs:generate": "typedoc", + "docs:generate:prod": "typedoc --basePath ./docs/tsdoc/nymproject/contract-clients/", + "docs:prod:build": "scripts/build-prod-docs-collect.sh", + "docs:serve": "reload -b -d ./docs -p 3000", + "docs:watch": "nodemon --ext ts --watch './src/**/*' --watch './typedoc.json' --exec \"yarn docs:generate\"" + }, + "devDependencies": { + "@cosmwasm/ts-codegen": "^0.35.3", + "nodemon": "3.0.1", + "npm-run-all": "^4.1.5", + "reload": "^3.2.1", + "typescript": "^4.6.2", + "typedoc": "^0.24.8" + }, + "keywords": [], + "author": "", + "license": "Apache-2.0" +} diff --git a/sdk/typescript/codegen/contract-clients/src/CoconutBandwidth.client.ts b/sdk/typescript/codegen/contract-clients/src/CoconutBandwidth.client.ts new file mode 100644 index 0000000000..a28f6af9b4 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/CoconutBandwidth.client.ts @@ -0,0 +1,130 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; +import { StdFee } from "@cosmjs/amino"; +import { InstantiateMsg, ExecuteMsg, Uint128, DepositData, SpendCredentialData, Coin, QueryMsg, MigrateMsg, Addr, SpendCredentialStatus, PagedSpendCredentialResponse, SpendCredential, SpendCredentialResponse } from "./CoconutBandwidth.types"; + +export interface CoconutBandwidthReadOnlyInterface { + contractAddress: string; + getSpentCredential: ({ + blindedSerialNumber + }: { + blindedSerialNumber: string; + }) => Promise; + getAllSpentCredentials: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }) => Promise; +} +export class CoconutBandwidthQueryClient implements CoconutBandwidthReadOnlyInterface { + client: CosmWasmClient; + contractAddress: string; + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client; + this.contractAddress = contractAddress; + this.getSpentCredential = this.getSpentCredential.bind(this); + this.getAllSpentCredentials = this.getAllSpentCredentials.bind(this); + } + + getSpentCredential = async ({ + blindedSerialNumber + }: { + blindedSerialNumber: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_spent_credential: { + blinded_serial_number: blindedSerialNumber + } + }); + }; + getAllSpentCredentials = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_all_spent_credentials: { + limit, + start_after: startAfter + } + }); + }; +} +export interface CoconutBandwidthInterface extends CoconutBandwidthReadOnlyInterface { + contractAddress: string; + sender: string; + depositFunds: ({ + data + }: { + data: DepositData; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + spendCredential: ({ + data + }: { + data: SpendCredentialData; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + releaseFunds: ({ + funds + }: { + funds: Coin; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; +} +export class CoconutBandwidthClient extends CoconutBandwidthQueryClient implements CoconutBandwidthInterface { + client: SigningCosmWasmClient; + sender: string; + contractAddress: string; + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress); + this.client = client; + this.sender = sender; + this.contractAddress = contractAddress; + this.depositFunds = this.depositFunds.bind(this); + this.spendCredential = this.spendCredential.bind(this); + this.releaseFunds = this.releaseFunds.bind(this); + } + + depositFunds = async ({ + data + }: { + data: DepositData; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + deposit_funds: { + data + } + }, fee, memo, _funds); + }; + spendCredential = async ({ + data + }: { + data: SpendCredentialData; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + spend_credential: { + data + } + }, fee, memo, _funds); + }; + releaseFunds = async ({ + funds + }: { + funds: Coin; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + release_funds: { + funds + } + }, fee, memo, _funds); + }; +} diff --git a/sdk/typescript/codegen/contract-clients/src/CoconutBandwidth.types.ts b/sdk/typescript/codegen/contract-clients/src/CoconutBandwidth.types.ts new file mode 100644 index 0000000000..f6ef153300 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/CoconutBandwidth.types.ts @@ -0,0 +1,67 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +export interface InstantiateMsg { + mix_denom: string; + multisig_addr: string; + pool_addr: string; +} +export type ExecuteMsg = { + deposit_funds: { + data: DepositData; + }; +} | { + spend_credential: { + data: SpendCredentialData; + }; +} | { + release_funds: { + funds: Coin; + }; +}; +export type Uint128 = string; +export interface DepositData { + deposit_info: string; + encryption_key: string; + identity_key: string; +} +export interface SpendCredentialData { + blinded_serial_number: string; + funds: Coin; + gateway_cosmos_address: string; +} +export interface Coin { + amount: Uint128; + denom: string; + [k: string]: unknown; +} +export type QueryMsg = { + get_spent_credential: { + blinded_serial_number: string; + }; +} | { + get_all_spent_credentials: { + limit?: number | null; + start_after?: string | null; + }; +}; +export interface MigrateMsg {} +export type Addr = string; +export type SpendCredentialStatus = "in_progress" | "spent"; +export interface PagedSpendCredentialResponse { + per_page: number; + spend_credentials: SpendCredential[]; + start_next_after?: string | null; +} +export interface SpendCredential { + blinded_serial_number: string; + funds: Coin; + gateway_cosmos_address: Addr; + status: SpendCredentialStatus; +} +export interface SpendCredentialResponse { + spend_credential?: SpendCredential | null; +} \ No newline at end of file diff --git a/sdk/typescript/codegen/contract-clients/src/CoconutDkg.client.ts b/sdk/typescript/codegen/contract-clients/src/CoconutDkg.client.ts new file mode 100644 index 0000000000..c86b48d22c --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/CoconutDkg.client.ts @@ -0,0 +1,283 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; +import { Coin, StdFee } from "@cosmjs/amino"; +import { InstantiateMsg, TimeConfiguration, ExecuteMsg, ContractSafeBytes, Addr, QueryMsg, MigrateMsg, PagedDealerResponse, DealerDetails, Timestamp, Uint64, EpochState, Epoch, DealerType, DealerDetailsResponse, PagedDealingsResponse, ContractDealing, NullableInitialReplacementData, InitialReplacementData, PagedVKSharesResponse, ContractVKShare } from "./CoconutDkg.types"; + +export interface CoconutDkgReadOnlyInterface { + contractAddress: string; + getCurrentEpochState: () => Promise; + getCurrentEpochThreshold: () => Promise; + getInitialDealers: () => Promise; + getDealerDetails: ({ + dealerAddress + }: { + dealerAddress: string; + }) => Promise; + getCurrentDealers: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }) => Promise; + getPastDealers: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }) => Promise; + getDealing: ({ + idx, + limit, + startAfter + }: { + idx: number; + limit?: number; + startAfter?: string; + }) => Promise; + getVerificationKeys: ({ + epochId, + limit, + startAfter + }: { + epochId: number; + limit?: number; + startAfter?: string; + }) => Promise; +} +export class CoconutDkgQueryClient implements CoconutDkgReadOnlyInterface { + client: CosmWasmClient; + contractAddress: string; + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client; + this.contractAddress = contractAddress; + this.getCurrentEpochState = this.getCurrentEpochState.bind(this); + this.getCurrentEpochThreshold = this.getCurrentEpochThreshold.bind(this); + this.getInitialDealers = this.getInitialDealers.bind(this); + this.getDealerDetails = this.getDealerDetails.bind(this); + this.getCurrentDealers = this.getCurrentDealers.bind(this); + this.getPastDealers = this.getPastDealers.bind(this); + this.getDealing = this.getDealing.bind(this); + this.getVerificationKeys = this.getVerificationKeys.bind(this); + } + + getCurrentEpochState = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_current_epoch_state: {} + }); + }; + getCurrentEpochThreshold = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_current_epoch_threshold: {} + }); + }; + getInitialDealers = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_initial_dealers: {} + }); + }; + getDealerDetails = async ({ + dealerAddress + }: { + dealerAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_dealer_details: { + dealer_address: dealerAddress + } + }); + }; + getCurrentDealers = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_current_dealers: { + limit, + start_after: startAfter + } + }); + }; + getPastDealers = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_past_dealers: { + limit, + start_after: startAfter + } + }); + }; + getDealing = async ({ + idx, + limit, + startAfter + }: { + idx: number; + limit?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_dealing: { + idx, + limit, + start_after: startAfter + } + }); + }; + getVerificationKeys = async ({ + epochId, + limit, + startAfter + }: { + epochId: number; + limit?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_verification_keys: { + epoch_id: epochId, + limit, + start_after: startAfter + } + }); + }; +} +export interface CoconutDkgInterface extends CoconutDkgReadOnlyInterface { + contractAddress: string; + sender: string; + registerDealer: ({ + announceAddress, + bteKeyWithProof, + resharing + }: { + announceAddress: string; + bteKeyWithProof: string; + resharing: boolean; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + commitDealing: ({ + dealingBytes, + resharing + }: { + dealingBytes: ContractSafeBytes; + resharing: boolean; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + commitVerificationKeyShare: ({ + resharing, + share + }: { + resharing: boolean; + share: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + verifyVerificationKeyShare: ({ + owner, + resharing + }: { + owner: Addr; + resharing: boolean; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + surpassedThreshold: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + advanceEpochState: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; +} +export class CoconutDkgClient extends CoconutDkgQueryClient implements CoconutDkgInterface { + client: SigningCosmWasmClient; + sender: string; + contractAddress: string; + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress); + this.client = client; + this.sender = sender; + this.contractAddress = contractAddress; + this.registerDealer = this.registerDealer.bind(this); + this.commitDealing = this.commitDealing.bind(this); + this.commitVerificationKeyShare = this.commitVerificationKeyShare.bind(this); + this.verifyVerificationKeyShare = this.verifyVerificationKeyShare.bind(this); + this.surpassedThreshold = this.surpassedThreshold.bind(this); + this.advanceEpochState = this.advanceEpochState.bind(this); + } + + registerDealer = async ({ + announceAddress, + bteKeyWithProof, + resharing + }: { + announceAddress: string; + bteKeyWithProof: string; + resharing: boolean; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + register_dealer: { + announce_address: announceAddress, + bte_key_with_proof: bteKeyWithProof, + resharing + } + }, fee, memo, _funds); + }; + commitDealing = async ({ + dealingBytes, + resharing + }: { + dealingBytes: ContractSafeBytes; + resharing: boolean; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + commit_dealing: { + dealing_bytes: dealingBytes, + resharing + } + }, fee, memo, _funds); + }; + commitVerificationKeyShare = async ({ + resharing, + share + }: { + resharing: boolean; + share: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + commit_verification_key_share: { + resharing, + share + } + }, fee, memo, _funds); + }; + verifyVerificationKeyShare = async ({ + owner, + resharing + }: { + owner: Addr; + resharing: boolean; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + verify_verification_key_share: { + owner, + resharing + } + }, fee, memo, _funds); + }; + surpassedThreshold = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + surpassed_threshold: {} + }, fee, memo, _funds); + }; + advanceEpochState = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + advance_epoch_state: {} + }, fee, memo, _funds); + }; +} diff --git a/sdk/typescript/codegen/contract-clients/src/CoconutDkg.types.ts b/sdk/typescript/codegen/contract-clients/src/CoconutDkg.types.ts new file mode 100644 index 0000000000..1f90bc5ed3 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/CoconutDkg.types.ts @@ -0,0 +1,154 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +export interface InstantiateMsg { + group_addr: string; + mix_denom: string; + multisig_addr: string; + time_configuration?: TimeConfiguration | null; +} +export interface TimeConfiguration { + dealing_exchange_time_secs: number; + in_progress_time_secs: number; + public_key_submission_time_secs: number; + verification_key_finalization_time_secs: number; + verification_key_submission_time_secs: number; + verification_key_validation_time_secs: number; +} +export type ExecuteMsg = { + register_dealer: { + announce_address: string; + bte_key_with_proof: string; + resharing: boolean; + }; +} | { + commit_dealing: { + dealing_bytes: ContractSafeBytes; + resharing: boolean; + }; +} | { + commit_verification_key_share: { + resharing: boolean; + share: string; + }; +} | { + verify_verification_key_share: { + owner: Addr; + resharing: boolean; + }; +} | { + surpassed_threshold: {}; +} | { + advance_epoch_state: {}; +}; +export type ContractSafeBytes = number[]; +export type Addr = string; +export type QueryMsg = { + get_current_epoch_state: {}; +} | { + get_current_epoch_threshold: {}; +} | { + get_initial_dealers: {}; +} | { + get_dealer_details: { + dealer_address: string; + }; +} | { + get_current_dealers: { + limit?: number | null; + start_after?: string | null; + }; +} | { + get_past_dealers: { + limit?: number | null; + start_after?: string | null; + }; +} | { + get_dealing: { + idx: number; + limit?: number | null; + start_after?: string | null; + }; +} | { + get_verification_keys: { + epoch_id: number; + limit?: number | null; + start_after?: string | null; + }; +}; +export interface MigrateMsg {} +export interface PagedDealerResponse { + dealers: DealerDetails[]; + per_page: number; + start_next_after?: Addr | null; +} +export interface DealerDetails { + address: Addr; + announce_address: string; + assigned_index: number; + bte_public_key_with_proof: string; +} +export type Timestamp = Uint64; +export type Uint64 = number; +export type EpochState = "in_progress" | { + public_key_submission: { + resharing: boolean; + }; +} | { + dealing_exchange: { + resharing: boolean; + }; +} | { + verification_key_submission: { + resharing: boolean; + }; +} | { + verification_key_validation: { + resharing: boolean; + }; +} | { + verification_key_finalization: { + resharing: boolean; + }; +}; +export interface Epoch { + epoch_id: number; + finish_timestamp: Timestamp; + state: EpochState; + time_configuration: TimeConfiguration; +} +export type DealerType = "current" | "past" | "unknown"; +export interface DealerDetailsResponse { + dealer_type: DealerType; + details?: DealerDetails | null; +} +export interface PagedDealingsResponse { + dealings: ContractDealing[]; + per_page: number; + start_next_after?: Addr | null; +} +export interface ContractDealing { + dealer: Addr; + dealing: ContractSafeBytes; +} +export type NullableInitialReplacementData = InitialReplacementData | null; +export interface InitialReplacementData { + initial_dealers: Addr[]; + initial_height: number; +} +export interface PagedVKSharesResponse { + per_page: number; + shares: ContractVKShare[]; + start_next_after?: Addr | null; +} +export interface ContractVKShare { + announce_address: string; + epoch_id: number; + node_index: number; + owner: Addr; + share: string; + verified: boolean; +} \ No newline at end of file diff --git a/sdk/typescript/codegen/contract-clients/src/Cw3FlexMultisig.client.ts b/sdk/typescript/codegen/contract-clients/src/Cw3FlexMultisig.client.ts new file mode 100644 index 0000000000..cfe3b9f76f --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/Cw3FlexMultisig.client.ts @@ -0,0 +1,308 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; +import { StdFee } from "@cosmjs/amino"; +import { Executor, Addr, Duration, Uint128, UncheckedDenom, Threshold, Decimal, InstantiateMsg, UncheckedDepositInfo, ExecuteMsg, Expiration, Timestamp, Uint64, CosmosMsgForEmpty, BankMsg, StakingMsg, DistributionMsg, Binary, IbcMsg, WasmMsg, GovMsg, VoteOption, Vote, Coin, Empty, IbcTimeout, IbcTimeoutBlock, MemberChangedHookMsg, MemberDiff, QueryMsg, MigrateMsg, Cw4Contract, Denom, Config, DepositInfo, Status, ThresholdResponse, ProposalListResponseForEmpty, ProposalResponseForEmpty, VoterListResponse, VoterDetail, VoteListResponse, VoteInfo, VoteResponse, VoterResponse } from "./Cw3FlexMultisig.types"; + +export interface Cw3FlexMultisigReadOnlyInterface { + contractAddress: string; + threshold: () => Promise; + proposal: ({ + proposalId + }: { + proposalId: number; + }) => Promise; + listProposals: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }) => Promise; + reverseProposals: ({ + limit, + startBefore + }: { + limit?: number; + startBefore?: number; + }) => Promise; + vote: ({ + proposalId, + voter + }: { + proposalId: number; + voter: string; + }) => Promise; + listVotes: ({ + limit, + proposalId, + startAfter + }: { + limit?: number; + proposalId: number; + startAfter?: string; + }) => Promise; + voter: ({ + address + }: { + address: string; + }) => Promise; + listVoters: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }) => Promise; + config: () => Promise; +} +export class Cw3FlexMultisigQueryClient implements Cw3FlexMultisigReadOnlyInterface { + client: CosmWasmClient; + contractAddress: string; + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client; + this.contractAddress = contractAddress; + this.threshold = this.threshold.bind(this); + this.proposal = this.proposal.bind(this); + this.listProposals = this.listProposals.bind(this); + this.reverseProposals = this.reverseProposals.bind(this); + this.vote = this.vote.bind(this); + this.listVotes = this.listVotes.bind(this); + this.voter = this.voter.bind(this); + this.listVoters = this.listVoters.bind(this); + this.config = this.config.bind(this); + } + + threshold = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + threshold: {} + }); + }; + proposal = async ({ + proposalId + }: { + proposalId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + proposal: { + proposal_id: proposalId + } + }); + }; + listProposals = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + list_proposals: { + limit, + start_after: startAfter + } + }); + }; + reverseProposals = async ({ + limit, + startBefore + }: { + limit?: number; + startBefore?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + reverse_proposals: { + limit, + start_before: startBefore + } + }); + }; + vote = async ({ + proposalId, + voter + }: { + proposalId: number; + voter: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + vote: { + proposal_id: proposalId, + voter + } + }); + }; + listVotes = async ({ + limit, + proposalId, + startAfter + }: { + limit?: number; + proposalId: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + list_votes: { + limit, + proposal_id: proposalId, + start_after: startAfter + } + }); + }; + voter = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + voter: { + address + } + }); + }; + listVoters = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + list_voters: { + limit, + start_after: startAfter + } + }); + }; + config = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + config: {} + }); + }; +} +export interface Cw3FlexMultisigInterface extends Cw3FlexMultisigReadOnlyInterface { + contractAddress: string; + sender: string; + propose: ({ + description, + latest, + msgs, + title + }: { + description: string; + latest?: Expiration; + msgs: CosmosMsgForEmpty[]; + title: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + // vote: ({ + // proposalId, + // vote + // }: { + // proposalId: number; + // vote: Vote; + // }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + execute: ({ + proposalId + }: { + proposalId: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + close: ({ + proposalId + }: { + proposalId: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + memberChangedHook: ({ + diffs + }: { + diffs: MemberDiff[]; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; +} +export class Cw3FlexMultisigClient extends Cw3FlexMultisigQueryClient implements Cw3FlexMultisigInterface { + client: SigningCosmWasmClient; + sender: string; + contractAddress: string; + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress); + this.client = client; + this.sender = sender; + this.contractAddress = contractAddress; + this.propose = this.propose.bind(this); + this.vote = this.vote.bind(this); + this.execute = this.execute.bind(this); + this.close = this.close.bind(this); + this.memberChangedHook = this.memberChangedHook.bind(this); + } + + propose = async ({ + description, + latest, + msgs, + title + }: { + description: string; + latest?: Expiration; + msgs: CosmosMsgForEmpty[]; + title: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + propose: { + description, + latest, + msgs, + title + } + }, fee, memo, _funds); + }; + // vote = async ({ + // proposalId, + // vote + // }: { + // proposalId: number; + // vote: Vote; + // }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + // return await this.client.execute(this.sender, this.contractAddress, { + // vote: { + // proposal_id: proposalId, + // vote + // } + // }, fee, memo, _funds); + // }; + execute = async ({ + proposalId + }: { + proposalId: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + execute: { + proposal_id: proposalId + } + }, fee, memo, _funds); + }; + close = async ({ + proposalId + }: { + proposalId: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + close: { + proposal_id: proposalId + } + }, fee, memo, _funds); + }; + memberChangedHook = async ({ + diffs + }: { + diffs: MemberDiff[]; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + member_changed_hook: { + diffs + } + }, fee, memo, _funds); + }; +} diff --git a/sdk/typescript/codegen/contract-clients/src/Cw3FlexMultisig.types.ts b/sdk/typescript/codegen/contract-clients/src/Cw3FlexMultisig.types.ts new file mode 100644 index 0000000000..570e09b83d --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/Cw3FlexMultisig.types.ts @@ -0,0 +1,355 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +export type Executor = "member" | { + only: Addr; +}; +export type Addr = string; +export type Duration = { + height: number; +} | { + time: number; +}; +export type Uint128 = string; +export type UncheckedDenom = { + native: string; +} | { + cw20: string; +}; +export type Threshold = { + absolute_count: { + weight: number; + }; +} | { + absolute_percentage: { + percentage: Decimal; + }; +} | { + threshold_quorum: { + quorum: Decimal; + threshold: Decimal; + }; +}; +export type Decimal = string; +export interface InstantiateMsg { + coconut_bandwidth_contract_address: string; + coconut_dkg_contract_address: string; + executor?: Executor | null; + group_addr: string; + max_voting_period: Duration; + proposal_deposit?: UncheckedDepositInfo | null; + threshold: Threshold; +} +export interface UncheckedDepositInfo { + amount: Uint128; + denom: UncheckedDenom; + refund_failed_proposals: boolean; +} +export type ExecuteMsg = { + propose: { + description: string; + latest?: Expiration | null; + msgs: CosmosMsgForEmpty[]; + title: string; + }; +} | { + vote: { + proposal_id: number; + vote: Vote; + }; +} | { + execute: { + proposal_id: number; + }; +} | { + close: { + proposal_id: number; + }; +} | { + member_changed_hook: MemberChangedHookMsg; +}; +export type Expiration = { + at_height: number; +} | { + at_time: Timestamp; +} | { + never: {}; +}; +export type Timestamp = Uint64; +export type Uint64 = string; +export type CosmosMsgForEmpty = { + bank: BankMsg; +} | { + custom: Empty; +} | { + staking: StakingMsg; +} | { + distribution: DistributionMsg; +} | { + stargate: { + type_url: string; + value: Binary; + [k: string]: unknown; + }; +} | { + ibc: IbcMsg; +} | { + wasm: WasmMsg; +} | { + gov: GovMsg; +}; +export type BankMsg = { + send: { + amount: Coin[]; + to_address: string; + [k: string]: unknown; + }; +} | { + burn: { + amount: Coin[]; + [k: string]: unknown; + }; +}; +export type StakingMsg = { + delegate: { + amount: Coin; + validator: string; + [k: string]: unknown; + }; +} | { + undelegate: { + amount: Coin; + validator: string; + [k: string]: unknown; + }; +} | { + redelegate: { + amount: Coin; + dst_validator: string; + src_validator: string; + [k: string]: unknown; + }; +}; +export type DistributionMsg = { + set_withdraw_address: { + address: string; + [k: string]: unknown; + }; +} | { + withdraw_delegator_reward: { + validator: string; + [k: string]: unknown; + }; +}; +export type Binary = string; +export type IbcMsg = { + transfer: { + amount: Coin; + channel_id: string; + timeout: IbcTimeout; + to_address: string; + [k: string]: unknown; + }; +} | { + send_packet: { + channel_id: string; + data: Binary; + timeout: IbcTimeout; + [k: string]: unknown; + }; +} | { + close_channel: { + channel_id: string; + [k: string]: unknown; + }; +}; +export type WasmMsg = { + execute: { + contract_addr: string; + funds: Coin[]; + msg: Binary; + [k: string]: unknown; + }; +} | { + instantiate: { + admin?: string | null; + code_id: number; + funds: Coin[]; + label: string; + msg: Binary; + [k: string]: unknown; + }; +} | { + migrate: { + contract_addr: string; + msg: Binary; + new_code_id: number; + [k: string]: unknown; + }; +} | { + update_admin: { + admin: string; + contract_addr: string; + [k: string]: unknown; + }; +} | { + clear_admin: { + contract_addr: string; + [k: string]: unknown; + }; +}; +export type GovMsg = { + vote: { + proposal_id: number; + vote: VoteOption; + [k: string]: unknown; + }; +}; +export type VoteOption = "yes" | "no" | "abstain" | "no_with_veto"; +export type Vote = "yes" | "no" | "abstain" | "veto"; +export interface Coin { + amount: Uint128; + denom: string; + [k: string]: unknown; +} +export interface Empty { + [k: string]: unknown; +} +export interface IbcTimeout { + block?: IbcTimeoutBlock | null; + timestamp?: Timestamp | null; + [k: string]: unknown; +} +export interface IbcTimeoutBlock { + height: number; + revision: number; + [k: string]: unknown; +} +export interface MemberChangedHookMsg { + diffs: MemberDiff[]; +} +export interface MemberDiff { + key: string; + new?: number | null; + old?: number | null; +} +export type QueryMsg = { + threshold: {}; +} | { + proposal: { + proposal_id: number; + }; +} | { + list_proposals: { + limit?: number | null; + start_after?: number | null; + }; +} | { + reverse_proposals: { + limit?: number | null; + start_before?: number | null; + }; +} | { + vote: { + proposal_id: number; + voter: string; + }; +} | { + list_votes: { + limit?: number | null; + proposal_id: number; + start_after?: string | null; + }; +} | { + voter: { + address: string; + }; +} | { + list_voters: { + limit?: number | null; + start_after?: string | null; + }; +} | { + config: {}; +}; +export interface MigrateMsg { + coconut_bandwidth_address: string; + coconut_dkg_address: string; +} +export type Cw4Contract = Addr; +export type Denom = { + native: string; +} | { + cw20: Addr; +}; +export interface Config { + coconut_bandwidth_addr: Addr; + coconut_dkg_addr: Addr; + executor?: Executor | null; + group_addr: Cw4Contract; + max_voting_period: Duration; + proposal_deposit?: DepositInfo | null; + threshold: Threshold; +} +export interface DepositInfo { + amount: Uint128; + denom: Denom; + refund_failed_proposals: boolean; +} +export type Status = "pending" | "open" | "rejected" | "passed" | "executed"; +export type ThresholdResponse = { + absolute_count: { + total_weight: number; + weight: number; + }; +} | { + absolute_percentage: { + percentage: Decimal; + total_weight: number; + }; +} | { + threshold_quorum: { + quorum: Decimal; + threshold: Decimal; + total_weight: number; + }; +}; +export interface ProposalListResponseForEmpty { + proposals: ProposalResponseForEmpty[]; +} +export interface ProposalResponseForEmpty { + deposit?: DepositInfo | null; + description: string; + expires: Expiration; + id: number; + msgs: CosmosMsgForEmpty[]; + proposer: Addr; + status: Status; + threshold: ThresholdResponse; + title: string; +} +export interface VoterListResponse { + voters: VoterDetail[]; +} +export interface VoterDetail { + addr: string; + weight: number; +} +export interface VoteListResponse { + votes: VoteInfo[]; +} +export interface VoteInfo { + proposal_id: number; + vote: Vote; + voter: string; + weight: number; +} +export interface VoteResponse { + vote?: VoteInfo | null; +} +export interface VoterResponse { + weight?: number | null; +} \ No newline at end of file diff --git a/sdk/typescript/codegen/contract-clients/src/Cw4Group.client.ts b/sdk/typescript/codegen/contract-clients/src/Cw4Group.client.ts new file mode 100644 index 0000000000..42482b9aba --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/Cw4Group.client.ts @@ -0,0 +1,188 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; +import { Coin, StdFee } from "@cosmjs/amino"; +import { InstantiateMsg, Member, ExecuteMsg, QueryMsg, MigrateMsg, AdminResponse, HooksResponse, MemberListResponse, MemberResponse, TotalWeightResponse } from "./Cw4Group.types"; + +export interface Cw4GroupReadOnlyInterface { + contractAddress: string; + admin: () => Promise; + totalWeight: ({ + atHeight + }: { + atHeight?: number; + }) => Promise; + listMembers: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }) => Promise; + member: ({ + addr, + atHeight + }: { + addr: string; + atHeight?: number; + }) => Promise; + hooks: () => Promise; +} +export class Cw4GroupQueryClient implements Cw4GroupReadOnlyInterface { + client: CosmWasmClient; + contractAddress: string; + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client; + this.contractAddress = contractAddress; + this.admin = this.admin.bind(this); + this.totalWeight = this.totalWeight.bind(this); + this.listMembers = this.listMembers.bind(this); + this.member = this.member.bind(this); + this.hooks = this.hooks.bind(this); + } + + admin = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + admin: {} + }); + }; + totalWeight = async ({ + atHeight + }: { + atHeight?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + total_weight: { + at_height: atHeight + } + }); + }; + listMembers = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + list_members: { + limit, + start_after: startAfter + } + }); + }; + member = async ({ + addr, + atHeight + }: { + addr: string; + atHeight?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + member: { + addr, + at_height: atHeight + } + }); + }; + hooks = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + hooks: {} + }); + }; +} +export interface Cw4GroupInterface extends Cw4GroupReadOnlyInterface { + contractAddress: string; + sender: string; + updateAdmin: ({ + admin + }: { + admin?: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateMembers: ({ + add, + remove + }: { + add: Member[]; + remove: string[]; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + addHook: ({ + addr + }: { + addr: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + removeHook: ({ + addr + }: { + addr: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; +} +export class Cw4GroupClient extends Cw4GroupQueryClient implements Cw4GroupInterface { + client: SigningCosmWasmClient; + sender: string; + contractAddress: string; + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress); + this.client = client; + this.sender = sender; + this.contractAddress = contractAddress; + this.updateAdmin = this.updateAdmin.bind(this); + this.updateMembers = this.updateMembers.bind(this); + this.addHook = this.addHook.bind(this); + this.removeHook = this.removeHook.bind(this); + } + + updateAdmin = async ({ + admin + }: { + admin?: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_admin: { + admin + } + }, fee, memo, _funds); + }; + updateMembers = async ({ + add, + remove + }: { + add: Member[]; + remove: string[]; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_members: { + add, + remove + } + }, fee, memo, _funds); + }; + addHook = async ({ + addr + }: { + addr: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + add_hook: { + addr + } + }, fee, memo, _funds); + }; + removeHook = async ({ + addr + }: { + addr: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + remove_hook: { + addr + } + }, fee, memo, _funds); + }; +} diff --git a/sdk/typescript/codegen/contract-clients/src/Cw4Group.types.ts b/sdk/typescript/codegen/contract-clients/src/Cw4Group.types.ts new file mode 100644 index 0000000000..6fe03352a2 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/Cw4Group.types.ts @@ -0,0 +1,67 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +export interface InstantiateMsg { + admin?: string | null; + members: Member[]; +} +export interface Member { + addr: string; + weight: number; +} +export type ExecuteMsg = { + update_admin: { + admin?: string | null; + }; +} | { + update_members: { + add: Member[]; + remove: string[]; + }; +} | { + add_hook: { + addr: string; + }; +} | { + remove_hook: { + addr: string; + }; +}; +export type QueryMsg = { + admin: {}; +} | { + total_weight: { + at_height?: number | null; + }; +} | { + list_members: { + limit?: number | null; + start_after?: string | null; + }; +} | { + member: { + addr: string; + at_height?: number | null; + }; +} | { + hooks: {}; +}; +export interface MigrateMsg {} +export interface AdminResponse { + admin?: string | null; +} +export interface HooksResponse { + hooks: string[]; +} +export interface MemberListResponse { + members: Member[]; +} +export interface MemberResponse { + weight?: number | null; +} +export interface TotalWeightResponse { + weight: number; +} \ No newline at end of file diff --git a/sdk/typescript/codegen/contract-clients/src/Mixnet.client.ts b/sdk/typescript/codegen/contract-clients/src/Mixnet.client.ts new file mode 100644 index 0000000000..c775e31a3d --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/Mixnet.client.ts @@ -0,0 +1,1673 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; +import { StdFee } from "@cosmjs/amino"; +import { Decimal, Percent, InstantiateMsg, Duration, InitialRewardingParams, ExecuteMsg, Layer, FamilyHead, MessageSignature, Uint128, ContractStateParams, Coin, IntervalRewardingParamsUpdate, LayerAssignment, MixNodeCostParams, MixNode, MixNodeConfigUpdate, Gateway, GatewayConfigUpdate, QueryMsg, MigrateMsg, Addr, PagedAllDelegationsResponse, Delegation, PagedFamiliesResponse, Family, PagedMembersResponse, MixnodeDetailsByIdentityResponse, MixNodeDetails, MixNodeBond, PendingMixNodeChanges, MixNodeRewarding, ContractVersion, ContractBuildInformation, CurrentIntervalResponse, Interval, MixNodeDelegationResponse, PagedDelegatorDelegationsResponse, EpochState, EpochStatus, EstimatedCurrentEpochRewardResponse, FamilyByHeadResponse, FamilyByLabelResponse, FamilyMembersByHeadResponse, FamilyMembersByLabelResponse, GatewayBondResponse, GatewayBond, PagedGatewayResponse, LayerDistribution, PagedMixnodeBondsResponse, PagedMixnodesDetailsResponse, PagedMixNodeDelegationsResponse, MixnodeDetailsResponse, MixnodeRewardingDetailsResponse, NumberOfPendingEventsResponse, GatewayOwnershipResponse, MixOwnershipResponse, PendingRewardResponse, PendingEpochEventKind, PendingEpochEventResponse, PendingEpochEventData, PendingEpochEventsResponse, PendingEpochEvent, PendingIntervalEventKind, PendingIntervalEventResponse, PendingIntervalEventData, PendingIntervalEventsResponse, PendingIntervalEvent, RewardedSetNodeStatus, PagedRewardedSetResponse, RewardingParams, IntervalRewardParams, String, Uint32, StakeSaturationResponse, ContractState, UnbondedMixnodeResponse, UnbondedMixnode, PagedUnbondedMixnodesResponse } from "./Mixnet.types"; +import { GetCw2ContractVersionResponse } from './types'; +export interface MixnetReadOnlyInterface { + contractAddress: string; + getAllFamiliesPaged: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }) => Promise; + getAllMembersPaged: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }) => Promise; + getFamilyByHead: ({ + head + }: { + head: string; + }) => Promise; + getFamilyByLabel: ({ + label + }: { + label: string; + }) => Promise; + getFamilyMembersByHead: ({ + head + }: { + head: string; + }) => Promise; + getFamilyMembersByLabel: ({ + label + }: { + label: string; + }) => Promise; + getContractVersion: () => Promise; + getCw2ContractVersion: () => Promise; + getRewardingValidatorAddress: () => Promise; + getStateParams: () => Promise; + getState: () => Promise; + getRewardingParams: () => Promise; + getEpochStatus: () => Promise; + getCurrentIntervalDetails: () => Promise; + getRewardedSet: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }) => Promise; + getMixNodeBonds: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }) => Promise; + getMixNodesDetailed: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }) => Promise; + getUnbondedMixNodes: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }) => Promise; + getUnbondedMixNodesByOwner: ({ + limit, + owner, + startAfter + }: { + limit?: number; + owner: string; + startAfter?: number; + }) => Promise; + getUnbondedMixNodesByIdentityKey: ({ + identityKey, + limit, + startAfter + }: { + identityKey: string; + limit?: number; + startAfter?: number; + }) => Promise; + getOwnedMixnode: ({ + address + }: { + address: string; + }) => Promise; + getMixnodeDetails: ({ + mixId + }: { + mixId: number; + }) => Promise; + getMixnodeRewardingDetails: ({ + mixId + }: { + mixId: number; + }) => Promise; + getStakeSaturation: ({ + mixId + }: { + mixId: number; + }) => Promise; + getUnbondedMixNodeInformation: ({ + mixId + }: { + mixId: number; + }) => Promise; + getBondedMixnodeDetailsByIdentity: ({ + mixIdentity + }: { + mixIdentity: string; + }) => Promise; + getLayerDistribution: () => Promise; + getGateways: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }) => Promise; + getGatewayBond: ({ + identity + }: { + identity: string; + }) => Promise; + getOwnedGateway: ({ + address + }: { + address: string; + }) => Promise; + getMixnodeDelegations: ({ + limit, + mixId, + startAfter + }: { + limit?: number; + mixId: number; + startAfter?: string; + }) => Promise; + getDelegatorDelegations: ({ + delegator, + limit, + startAfter + }: { + delegator: string; + limit?: number; + startAfter?: number[][]; + }) => Promise; + getDelegationDetails: ({ + delegator, + mixId, + proxy + }: { + delegator: string; + mixId: number; + proxy?: string; + }) => Promise; + getAllDelegations: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number[][]; + }) => Promise; + getPendingOperatorReward: ({ + address + }: { + address: string; + }) => Promise; + getPendingMixNodeOperatorReward: ({ + mixId + }: { + mixId: number; + }) => Promise; + getPendingDelegatorReward: ({ + address, + mixId, + proxy + }: { + address: string; + mixId: number; + proxy?: string; + }) => Promise; + getEstimatedCurrentEpochOperatorReward: ({ + estimatedPerformance, + mixId + }: { + estimatedPerformance: Percent; + mixId: number; + }) => Promise; + getEstimatedCurrentEpochDelegatorReward: ({ + address, + estimatedPerformance, + mixId, + proxy + }: { + address: string; + estimatedPerformance: Percent; + mixId: number; + proxy?: string; + }) => Promise; + getPendingEpochEvents: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }) => Promise; + getPendingIntervalEvents: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }) => Promise; + getPendingEpochEvent: ({ + eventId + }: { + eventId: number; + }) => Promise; + getPendingIntervalEvent: ({ + eventId + }: { + eventId: number; + }) => Promise; + getNumberOfPendingEvents: () => Promise; + getSigningNonce: ({ + address + }: { + address: string; + }) => Promise; +} +export class MixnetQueryClient implements MixnetReadOnlyInterface { + client: CosmWasmClient; + contractAddress: string; + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client; + this.contractAddress = contractAddress; + this.getAllFamiliesPaged = this.getAllFamiliesPaged.bind(this); + this.getAllMembersPaged = this.getAllMembersPaged.bind(this); + this.getFamilyByHead = this.getFamilyByHead.bind(this); + this.getFamilyByLabel = this.getFamilyByLabel.bind(this); + this.getFamilyMembersByHead = this.getFamilyMembersByHead.bind(this); + this.getFamilyMembersByLabel = this.getFamilyMembersByLabel.bind(this); + this.getContractVersion = this.getContractVersion.bind(this); + this.getCw2ContractVersion = this.getCw2ContractVersion.bind(this); + this.getRewardingValidatorAddress = this.getRewardingValidatorAddress.bind(this); + this.getStateParams = this.getStateParams.bind(this); + this.getState = this.getState.bind(this); + this.getRewardingParams = this.getRewardingParams.bind(this); + this.getEpochStatus = this.getEpochStatus.bind(this); + this.getCurrentIntervalDetails = this.getCurrentIntervalDetails.bind(this); + this.getRewardedSet = this.getRewardedSet.bind(this); + this.getMixNodeBonds = this.getMixNodeBonds.bind(this); + this.getMixNodesDetailed = this.getMixNodesDetailed.bind(this); + this.getUnbondedMixNodes = this.getUnbondedMixNodes.bind(this); + this.getUnbondedMixNodesByOwner = this.getUnbondedMixNodesByOwner.bind(this); + this.getUnbondedMixNodesByIdentityKey = this.getUnbondedMixNodesByIdentityKey.bind(this); + this.getOwnedMixnode = this.getOwnedMixnode.bind(this); + this.getMixnodeDetails = this.getMixnodeDetails.bind(this); + this.getMixnodeRewardingDetails = this.getMixnodeRewardingDetails.bind(this); + this.getStakeSaturation = this.getStakeSaturation.bind(this); + this.getUnbondedMixNodeInformation = this.getUnbondedMixNodeInformation.bind(this); + this.getBondedMixnodeDetailsByIdentity = this.getBondedMixnodeDetailsByIdentity.bind(this); + this.getLayerDistribution = this.getLayerDistribution.bind(this); + this.getGateways = this.getGateways.bind(this); + this.getGatewayBond = this.getGatewayBond.bind(this); + this.getOwnedGateway = this.getOwnedGateway.bind(this); + this.getMixnodeDelegations = this.getMixnodeDelegations.bind(this); + this.getDelegatorDelegations = this.getDelegatorDelegations.bind(this); + this.getDelegationDetails = this.getDelegationDetails.bind(this); + this.getAllDelegations = this.getAllDelegations.bind(this); + this.getPendingOperatorReward = this.getPendingOperatorReward.bind(this); + this.getPendingMixNodeOperatorReward = this.getPendingMixNodeOperatorReward.bind(this); + this.getPendingDelegatorReward = this.getPendingDelegatorReward.bind(this); + this.getEstimatedCurrentEpochOperatorReward = this.getEstimatedCurrentEpochOperatorReward.bind(this); + this.getEstimatedCurrentEpochDelegatorReward = this.getEstimatedCurrentEpochDelegatorReward.bind(this); + this.getPendingEpochEvents = this.getPendingEpochEvents.bind(this); + this.getPendingIntervalEvents = this.getPendingIntervalEvents.bind(this); + this.getPendingEpochEvent = this.getPendingEpochEvent.bind(this); + this.getPendingIntervalEvent = this.getPendingIntervalEvent.bind(this); + this.getNumberOfPendingEvents = this.getNumberOfPendingEvents.bind(this); + this.getSigningNonce = this.getSigningNonce.bind(this); + } + + getAllFamiliesPaged = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_all_families_paged: { + limit, + start_after: startAfter + } + }); + }; + getAllMembersPaged = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_all_members_paged: { + limit, + start_after: startAfter + } + }); + }; + getFamilyByHead = async ({ + head + }: { + head: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_family_by_head: { + head + } + }); + }; + getFamilyByLabel = async ({ + label + }: { + label: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_family_by_label: { + label + } + }); + }; + getFamilyMembersByHead = async ({ + head + }: { + head: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_family_members_by_head: { + head + } + }); + }; + getFamilyMembersByLabel = async ({ + label + }: { + label: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_family_members_by_label: { + label + } + }); + }; + getContractVersion = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_contract_version: {} + }); + }; + getCw2ContractVersion = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_cw2_contract_version: {} + }); + }; + getRewardingValidatorAddress = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_rewarding_validator_address: {} + }); + }; + getStateParams = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_state_params: {} + }); + }; + getState = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_state: {} + }); + }; + getRewardingParams = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_rewarding_params: {} + }); + }; + getEpochStatus = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_epoch_status: {} + }); + }; + getCurrentIntervalDetails = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_current_interval_details: {} + }); + }; + getRewardedSet = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_rewarded_set: { + limit, + start_after: startAfter + } + }); + }; + getMixNodeBonds = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_mix_node_bonds: { + limit, + start_after: startAfter + } + }); + }; + getMixNodesDetailed = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_mix_nodes_detailed: { + limit, + start_after: startAfter + } + }); + }; + getUnbondedMixNodes = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_unbonded_mix_nodes: { + limit, + start_after: startAfter + } + }); + }; + getUnbondedMixNodesByOwner = async ({ + limit, + owner, + startAfter + }: { + limit?: number; + owner: string; + startAfter?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_unbonded_mix_nodes_by_owner: { + limit, + owner, + start_after: startAfter + } + }); + }; + getUnbondedMixNodesByIdentityKey = async ({ + identityKey, + limit, + startAfter + }: { + identityKey: string; + limit?: number; + startAfter?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_unbonded_mix_nodes_by_identity_key: { + identity_key: identityKey, + limit, + start_after: startAfter + } + }); + }; + getOwnedMixnode = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_owned_mixnode: { + address + } + }); + }; + getMixnodeDetails = async ({ + mixId + }: { + mixId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_mixnode_details: { + mix_id: mixId + } + }); + }; + getMixnodeRewardingDetails = async ({ + mixId + }: { + mixId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_mixnode_rewarding_details: { + mix_id: mixId + } + }); + }; + getStakeSaturation = async ({ + mixId + }: { + mixId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_stake_saturation: { + mix_id: mixId + } + }); + }; + getUnbondedMixNodeInformation = async ({ + mixId + }: { + mixId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_unbonded_mix_node_information: { + mix_id: mixId + } + }); + }; + getBondedMixnodeDetailsByIdentity = async ({ + mixIdentity + }: { + mixIdentity: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_bonded_mixnode_details_by_identity: { + mix_identity: mixIdentity + } + }); + }; + getLayerDistribution = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_layer_distribution: {} + }); + }; + getGateways = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_gateways: { + limit, + start_after: startAfter + } + }); + }; + getGatewayBond = async ({ + identity + }: { + identity: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_gateway_bond: { + identity + } + }); + }; + getOwnedGateway = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_owned_gateway: { + address + } + }); + }; + getMixnodeDelegations = async ({ + limit, + mixId, + startAfter + }: { + limit?: number; + mixId: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_mixnode_delegations: { + limit, + mix_id: mixId, + start_after: startAfter + } + }); + }; + getDelegatorDelegations = async ({ + delegator, + limit, + startAfter + }: { + delegator: string; + limit?: number; + startAfter?: number[][]; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_delegator_delegations: { + delegator, + limit, + start_after: startAfter + } + }); + }; + getDelegationDetails = async ({ + delegator, + mixId, + proxy + }: { + delegator: string; + mixId: number; + proxy?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_delegation_details: { + delegator, + mix_id: mixId, + proxy + } + }); + }; + getAllDelegations = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number[][]; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_all_delegations: { + limit, + start_after: startAfter + } + }); + }; + getPendingOperatorReward = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_pending_operator_reward: { + address + } + }); + }; + getPendingMixNodeOperatorReward = async ({ + mixId + }: { + mixId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_pending_mix_node_operator_reward: { + mix_id: mixId + } + }); + }; + getPendingDelegatorReward = async ({ + address, + mixId, + proxy + }: { + address: string; + mixId: number; + proxy?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_pending_delegator_reward: { + address, + mix_id: mixId, + proxy + } + }); + }; + getEstimatedCurrentEpochOperatorReward = async ({ + estimatedPerformance, + mixId + }: { + estimatedPerformance: Percent; + mixId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_estimated_current_epoch_operator_reward: { + estimated_performance: estimatedPerformance, + mix_id: mixId + } + }); + }; + getEstimatedCurrentEpochDelegatorReward = async ({ + address, + estimatedPerformance, + mixId, + proxy + }: { + address: string; + estimatedPerformance: Percent; + mixId: number; + proxy?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_estimated_current_epoch_delegator_reward: { + address, + estimated_performance: estimatedPerformance, + mix_id: mixId, + proxy + } + }); + }; + getPendingEpochEvents = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_pending_epoch_events: { + limit, + start_after: startAfter + } + }); + }; + getPendingIntervalEvents = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_pending_interval_events: { + limit, + start_after: startAfter + } + }); + }; + getPendingEpochEvent = async ({ + eventId + }: { + eventId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_pending_epoch_event: { + event_id: eventId + } + }); + }; + getPendingIntervalEvent = async ({ + eventId + }: { + eventId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_pending_interval_event: { + event_id: eventId + } + }); + }; + getNumberOfPendingEvents = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_number_of_pending_events: {} + }); + }; + getSigningNonce = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_signing_nonce: { + address + } + }); + }; +} +export interface MixnetInterface extends MixnetReadOnlyInterface { + contractAddress: string; + sender: string; + assignNodeLayer: ({ + layer, + mixId + }: { + layer: Layer; + mixId: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + createFamily: ({ + label + }: { + label: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + joinFamily: ({ + familyHead, + joinPermit + }: { + familyHead: FamilyHead; + joinPermit: MessageSignature; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + leaveFamily: ({ + familyHead + }: { + familyHead: FamilyHead; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + kickFamilyMember: ({ + member + }: { + member: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + createFamilyOnBehalf: ({ + label, + ownerAddress + }: { + label: string; + ownerAddress: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + joinFamilyOnBehalf: ({ + familyHead, + joinPermit, + memberAddress + }: { + familyHead: FamilyHead; + joinPermit: MessageSignature; + memberAddress: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + leaveFamilyOnBehalf: ({ + familyHead, + memberAddress + }: { + familyHead: FamilyHead; + memberAddress: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + kickFamilyMemberOnBehalf: ({ + headAddress, + member + }: { + headAddress: string; + member: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateRewardingValidatorAddress: ({ + address + }: { + address: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateContractStateParams: ({ + updatedParameters + }: { + updatedParameters: ContractStateParams; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateActiveSetSize: ({ + activeSetSize, + forceImmediately + }: { + activeSetSize: number; + forceImmediately: boolean; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateRewardingParams: ({ + forceImmediately, + updatedParams + }: { + forceImmediately: boolean; + updatedParams: IntervalRewardingParamsUpdate; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateIntervalConfig: ({ + epochDurationSecs, + epochsInInterval, + forceImmediately + }: { + epochDurationSecs: number; + epochsInInterval: number; + forceImmediately: boolean; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + beginEpochTransition: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + advanceCurrentEpoch: ({ + expectedActiveSetSize, + newRewardedSet + }: { + expectedActiveSetSize: number; + newRewardedSet: LayerAssignment[]; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + reconcileEpochEvents: ({ + limit + }: { + limit?: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + bondMixnode: ({ + costParams, + mixNode, + ownerSignature + }: { + costParams: MixNodeCostParams; + mixNode: MixNode; + ownerSignature: MessageSignature; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + bondMixnodeOnBehalf: ({ + costParams, + mixNode, + owner, + ownerSignature + }: { + costParams: MixNodeCostParams; + mixNode: MixNode; + owner: string; + ownerSignature: MessageSignature; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + pledgeMore: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + pledgeMoreOnBehalf: ({ + owner + }: { + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + decreasePledge: ({ + decreaseBy + }: { + decreaseBy: Coin; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + decreasePledgeOnBehalf: ({ + decreaseBy, + owner + }: { + decreaseBy: Coin; + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + unbondMixnode: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + unbondMixnodeOnBehalf: ({ + owner + }: { + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateMixnodeCostParams: ({ + newCosts + }: { + newCosts: MixNodeCostParams; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateMixnodeCostParamsOnBehalf: ({ + newCosts, + owner + }: { + newCosts: MixNodeCostParams; + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateMixnodeConfig: ({ + newConfig + }: { + newConfig: MixNodeConfigUpdate; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateMixnodeConfigOnBehalf: ({ + newConfig, + owner + }: { + newConfig: MixNodeConfigUpdate; + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + bondGateway: ({ + gateway, + ownerSignature + }: { + gateway: Gateway; + ownerSignature: MessageSignature; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + bondGatewayOnBehalf: ({ + gateway, + owner, + ownerSignature + }: { + gateway: Gateway; + owner: string; + ownerSignature: MessageSignature; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + unbondGateway: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + unbondGatewayOnBehalf: ({ + owner + }: { + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateGatewayConfig: ({ + newConfig + }: { + newConfig: GatewayConfigUpdate; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateGatewayConfigOnBehalf: ({ + newConfig, + owner + }: { + newConfig: GatewayConfigUpdate; + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + delegateToMixnode: ({ + mixId + }: { + mixId: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + delegateToMixnodeOnBehalf: ({ + delegate, + mixId + }: { + delegate: string; + mixId: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + undelegateFromMixnode: ({ + mixId + }: { + mixId: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + undelegateFromMixnodeOnBehalf: ({ + delegate, + mixId + }: { + delegate: string; + mixId: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + rewardMixnode: ({ + mixId, + performance + }: { + mixId: number; + performance: Percent; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + withdrawOperatorReward: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + withdrawOperatorRewardOnBehalf: ({ + owner + }: { + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + withdrawDelegatorReward: ({ + mixId + }: { + mixId: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + withdrawDelegatorRewardOnBehalf: ({ + mixId, + owner + }: { + mixId: number; + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; +} +export class MixnetClient extends MixnetQueryClient implements MixnetInterface { + client: SigningCosmWasmClient; + sender: string; + contractAddress: string; + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress); + this.client = client; + this.sender = sender; + this.contractAddress = contractAddress; + this.assignNodeLayer = this.assignNodeLayer.bind(this); + this.createFamily = this.createFamily.bind(this); + this.joinFamily = this.joinFamily.bind(this); + this.leaveFamily = this.leaveFamily.bind(this); + this.kickFamilyMember = this.kickFamilyMember.bind(this); + this.createFamilyOnBehalf = this.createFamilyOnBehalf.bind(this); + this.joinFamilyOnBehalf = this.joinFamilyOnBehalf.bind(this); + this.leaveFamilyOnBehalf = this.leaveFamilyOnBehalf.bind(this); + this.kickFamilyMemberOnBehalf = this.kickFamilyMemberOnBehalf.bind(this); + this.updateRewardingValidatorAddress = this.updateRewardingValidatorAddress.bind(this); + this.updateContractStateParams = this.updateContractStateParams.bind(this); + this.updateActiveSetSize = this.updateActiveSetSize.bind(this); + this.updateRewardingParams = this.updateRewardingParams.bind(this); + this.updateIntervalConfig = this.updateIntervalConfig.bind(this); + this.beginEpochTransition = this.beginEpochTransition.bind(this); + this.advanceCurrentEpoch = this.advanceCurrentEpoch.bind(this); + this.reconcileEpochEvents = this.reconcileEpochEvents.bind(this); + this.bondMixnode = this.bondMixnode.bind(this); + this.bondMixnodeOnBehalf = this.bondMixnodeOnBehalf.bind(this); + this.pledgeMore = this.pledgeMore.bind(this); + this.pledgeMoreOnBehalf = this.pledgeMoreOnBehalf.bind(this); + this.decreasePledge = this.decreasePledge.bind(this); + this.decreasePledgeOnBehalf = this.decreasePledgeOnBehalf.bind(this); + this.unbondMixnode = this.unbondMixnode.bind(this); + this.unbondMixnodeOnBehalf = this.unbondMixnodeOnBehalf.bind(this); + this.updateMixnodeCostParams = this.updateMixnodeCostParams.bind(this); + this.updateMixnodeCostParamsOnBehalf = this.updateMixnodeCostParamsOnBehalf.bind(this); + this.updateMixnodeConfig = this.updateMixnodeConfig.bind(this); + this.updateMixnodeConfigOnBehalf = this.updateMixnodeConfigOnBehalf.bind(this); + this.bondGateway = this.bondGateway.bind(this); + this.bondGatewayOnBehalf = this.bondGatewayOnBehalf.bind(this); + this.unbondGateway = this.unbondGateway.bind(this); + this.unbondGatewayOnBehalf = this.unbondGatewayOnBehalf.bind(this); + this.updateGatewayConfig = this.updateGatewayConfig.bind(this); + this.updateGatewayConfigOnBehalf = this.updateGatewayConfigOnBehalf.bind(this); + this.delegateToMixnode = this.delegateToMixnode.bind(this); + this.delegateToMixnodeOnBehalf = this.delegateToMixnodeOnBehalf.bind(this); + this.undelegateFromMixnode = this.undelegateFromMixnode.bind(this); + this.undelegateFromMixnodeOnBehalf = this.undelegateFromMixnodeOnBehalf.bind(this); + this.rewardMixnode = this.rewardMixnode.bind(this); + this.withdrawOperatorReward = this.withdrawOperatorReward.bind(this); + this.withdrawOperatorRewardOnBehalf = this.withdrawOperatorRewardOnBehalf.bind(this); + this.withdrawDelegatorReward = this.withdrawDelegatorReward.bind(this); + this.withdrawDelegatorRewardOnBehalf = this.withdrawDelegatorRewardOnBehalf.bind(this); + } + + assignNodeLayer = async ({ + layer, + mixId + }: { + layer: Layer; + mixId: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + assign_node_layer: { + layer, + mix_id: mixId + } + }, fee, memo, _funds); + }; + createFamily = async ({ + label + }: { + label: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + create_family: { + label + } + }, fee, memo, _funds); + }; + joinFamily = async ({ + familyHead, + joinPermit + }: { + familyHead: FamilyHead; + joinPermit: MessageSignature; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + join_family: { + family_head: familyHead, + join_permit: joinPermit + } + }, fee, memo, _funds); + }; + leaveFamily = async ({ + familyHead + }: { + familyHead: FamilyHead; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + leave_family: { + family_head: familyHead + } + }, fee, memo, _funds); + }; + kickFamilyMember = async ({ + member + }: { + member: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + kick_family_member: { + member + } + }, fee, memo, _funds); + }; + createFamilyOnBehalf = async ({ + label, + ownerAddress + }: { + label: string; + ownerAddress: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + create_family_on_behalf: { + label, + owner_address: ownerAddress + } + }, fee, memo, _funds); + }; + joinFamilyOnBehalf = async ({ + familyHead, + joinPermit, + memberAddress + }: { + familyHead: FamilyHead; + joinPermit: MessageSignature; + memberAddress: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + join_family_on_behalf: { + family_head: familyHead, + join_permit: joinPermit, + member_address: memberAddress + } + }, fee, memo, _funds); + }; + leaveFamilyOnBehalf = async ({ + familyHead, + memberAddress + }: { + familyHead: FamilyHead; + memberAddress: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + leave_family_on_behalf: { + family_head: familyHead, + member_address: memberAddress + } + }, fee, memo, _funds); + }; + kickFamilyMemberOnBehalf = async ({ + headAddress, + member + }: { + headAddress: string; + member: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + kick_family_member_on_behalf: { + head_address: headAddress, + member + } + }, fee, memo, _funds); + }; + updateRewardingValidatorAddress = async ({ + address + }: { + address: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_rewarding_validator_address: { + address + } + }, fee, memo, _funds); + }; + updateContractStateParams = async ({ + updatedParameters + }: { + updatedParameters: ContractStateParams; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_contract_state_params: { + updated_parameters: updatedParameters + } + }, fee, memo, _funds); + }; + updateActiveSetSize = async ({ + activeSetSize, + forceImmediately + }: { + activeSetSize: number; + forceImmediately: boolean; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_active_set_size: { + active_set_size: activeSetSize, + force_immediately: forceImmediately + } + }, fee, memo, _funds); + }; + updateRewardingParams = async ({ + forceImmediately, + updatedParams + }: { + forceImmediately: boolean; + updatedParams: IntervalRewardingParamsUpdate; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_rewarding_params: { + force_immediately: forceImmediately, + updated_params: updatedParams + } + }, fee, memo, _funds); + }; + updateIntervalConfig = async ({ + epochDurationSecs, + epochsInInterval, + forceImmediately + }: { + epochDurationSecs: number; + epochsInInterval: number; + forceImmediately: boolean; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_interval_config: { + epoch_duration_secs: epochDurationSecs, + epochs_in_interval: epochsInInterval, + force_immediately: forceImmediately + } + }, fee, memo, _funds); + }; + beginEpochTransition = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + begin_epoch_transition: {} + }, fee, memo, _funds); + }; + advanceCurrentEpoch = async ({ + expectedActiveSetSize, + newRewardedSet + }: { + expectedActiveSetSize: number; + newRewardedSet: LayerAssignment[]; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + advance_current_epoch: { + expected_active_set_size: expectedActiveSetSize, + new_rewarded_set: newRewardedSet + } + }, fee, memo, _funds); + }; + reconcileEpochEvents = async ({ + limit + }: { + limit?: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + reconcile_epoch_events: { + limit + } + }, fee, memo, _funds); + }; + bondMixnode = async ({ + costParams, + mixNode, + ownerSignature + }: { + costParams: MixNodeCostParams; + mixNode: MixNode; + ownerSignature: MessageSignature; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + bond_mixnode: { + cost_params: costParams, + mix_node: mixNode, + owner_signature: ownerSignature + } + }, fee, memo, _funds); + }; + bondMixnodeOnBehalf = async ({ + costParams, + mixNode, + owner, + ownerSignature + }: { + costParams: MixNodeCostParams; + mixNode: MixNode; + owner: string; + ownerSignature: MessageSignature; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + bond_mixnode_on_behalf: { + cost_params: costParams, + mix_node: mixNode, + owner, + owner_signature: ownerSignature + } + }, fee, memo, _funds); + }; + pledgeMore = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + pledge_more: {} + }, fee, memo, _funds); + }; + pledgeMoreOnBehalf = async ({ + owner + }: { + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + pledge_more_on_behalf: { + owner + } + }, fee, memo, _funds); + }; + decreasePledge = async ({ + decreaseBy + }: { + decreaseBy: Coin; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + decrease_pledge: { + decrease_by: decreaseBy + } + }, fee, memo, _funds); + }; + decreasePledgeOnBehalf = async ({ + decreaseBy, + owner + }: { + decreaseBy: Coin; + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + decrease_pledge_on_behalf: { + decrease_by: decreaseBy, + owner + } + }, fee, memo, _funds); + }; + unbondMixnode = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + unbond_mixnode: {} + }, fee, memo, _funds); + }; + unbondMixnodeOnBehalf = async ({ + owner + }: { + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + unbond_mixnode_on_behalf: { + owner + } + }, fee, memo, _funds); + }; + updateMixnodeCostParams = async ({ + newCosts + }: { + newCosts: MixNodeCostParams; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_mixnode_cost_params: { + new_costs: newCosts + } + }, fee, memo, _funds); + }; + updateMixnodeCostParamsOnBehalf = async ({ + newCosts, + owner + }: { + newCosts: MixNodeCostParams; + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_mixnode_cost_params_on_behalf: { + new_costs: newCosts, + owner + } + }, fee, memo, _funds); + }; + updateMixnodeConfig = async ({ + newConfig + }: { + newConfig: MixNodeConfigUpdate; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_mixnode_config: { + new_config: newConfig + } + }, fee, memo, _funds); + }; + updateMixnodeConfigOnBehalf = async ({ + newConfig, + owner + }: { + newConfig: MixNodeConfigUpdate; + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_mixnode_config_on_behalf: { + new_config: newConfig, + owner + } + }, fee, memo, _funds); + }; + bondGateway = async ({ + gateway, + ownerSignature + }: { + gateway: Gateway; + ownerSignature: MessageSignature; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + bond_gateway: { + gateway, + owner_signature: ownerSignature + } + }, fee, memo, _funds); + }; + bondGatewayOnBehalf = async ({ + gateway, + owner, + ownerSignature + }: { + gateway: Gateway; + owner: string; + ownerSignature: MessageSignature; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + bond_gateway_on_behalf: { + gateway, + owner, + owner_signature: ownerSignature + } + }, fee, memo, _funds); + }; + unbondGateway = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + unbond_gateway: {} + }, fee, memo, _funds); + }; + unbondGatewayOnBehalf = async ({ + owner + }: { + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + unbond_gateway_on_behalf: { + owner + } + }, fee, memo, _funds); + }; + updateGatewayConfig = async ({ + newConfig + }: { + newConfig: GatewayConfigUpdate; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_gateway_config: { + new_config: newConfig + } + }, fee, memo, _funds); + }; + updateGatewayConfigOnBehalf = async ({ + newConfig, + owner + }: { + newConfig: GatewayConfigUpdate; + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_gateway_config_on_behalf: { + new_config: newConfig, + owner + } + }, fee, memo, _funds); + }; + delegateToMixnode = async ({ + mixId + }: { + mixId: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + delegate_to_mixnode: { + mix_id: mixId + } + }, fee, memo, _funds); + }; + delegateToMixnodeOnBehalf = async ({ + delegate, + mixId + }: { + delegate: string; + mixId: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + delegate_to_mixnode_on_behalf: { + delegate, + mix_id: mixId + } + }, fee, memo, _funds); + }; + undelegateFromMixnode = async ({ + mixId + }: { + mixId: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + undelegate_from_mixnode: { + mix_id: mixId + } + }, fee, memo, _funds); + }; + undelegateFromMixnodeOnBehalf = async ({ + delegate, + mixId + }: { + delegate: string; + mixId: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + undelegate_from_mixnode_on_behalf: { + delegate, + mix_id: mixId + } + }, fee, memo, _funds); + }; + rewardMixnode = async ({ + mixId, + performance + }: { + mixId: number; + performance: Percent; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + reward_mixnode: { + mix_id: mixId, + performance + } + }, fee, memo, _funds); + }; + withdrawOperatorReward = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + withdraw_operator_reward: {} + }, fee, memo, _funds); + }; + withdrawOperatorRewardOnBehalf = async ({ + owner + }: { + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + withdraw_operator_reward_on_behalf: { + owner + } + }, fee, memo, _funds); + }; + withdrawDelegatorReward = async ({ + mixId + }: { + mixId: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + withdraw_delegator_reward: { + mix_id: mixId + } + }, fee, memo, _funds); + }; + withdrawDelegatorRewardOnBehalf = async ({ + mixId, + owner + }: { + mixId: number; + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + withdraw_delegator_reward_on_behalf: { + mix_id: mixId, + owner + } + }, fee, memo, _funds); + }; +} diff --git a/sdk/typescript/codegen/contract-clients/src/Mixnet.types.ts b/sdk/typescript/codegen/contract-clients/src/Mixnet.types.ts new file mode 100644 index 0000000000..f0630f673f --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/Mixnet.types.ts @@ -0,0 +1,799 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +export type Decimal = string; +export type Percent = Decimal; + +/** + * This instantiates the contract. + */ +export interface InstantiateMsg { + epoch_duration: Duration; + epochs_in_interval: number; + initial_rewarding_params: InitialRewardingParams; + rewarding_denom: string; + rewarding_validator_address: string; + vesting_contract_address: string; +} +export interface Duration { + nanos: number; + secs: number; + [k: string]: unknown; +} +export interface InitialRewardingParams { + active_set_size: number; + active_set_work_factor: Decimal; + initial_reward_pool: Decimal; + initial_staking_supply: Decimal; + interval_pool_emission: Percent; + rewarded_set_size: number; + staking_supply_scale_factor: Percent; + sybil_resistance: Percent; +} +export type ExecuteMsg = { + assign_node_layer: { + layer: Layer; + mix_id: number; + }; +} | { + create_family: { + label: string; + }; +} | { + join_family: { + family_head: FamilyHead; + join_permit: MessageSignature; + }; +} | { + leave_family: { + family_head: FamilyHead; + }; +} | { + kick_family_member: { + member: string; + }; +} | { + create_family_on_behalf: { + label: string; + owner_address: string; + }; +} | { + join_family_on_behalf: { + family_head: FamilyHead; + join_permit: MessageSignature; + member_address: string; + }; +} | { + leave_family_on_behalf: { + family_head: FamilyHead; + member_address: string; + }; +} | { + kick_family_member_on_behalf: { + head_address: string; + member: string; + }; +} | { + update_rewarding_validator_address: { + address: string; + }; +} | { + update_contract_state_params: { + updated_parameters: ContractStateParams; + }; +} | { + update_active_set_size: { + active_set_size: number; + force_immediately: boolean; + }; +} | { + update_rewarding_params: { + force_immediately: boolean; + updated_params: IntervalRewardingParamsUpdate; + }; +} | { + update_interval_config: { + epoch_duration_secs: number; + epochs_in_interval: number; + force_immediately: boolean; + }; +} | { + begin_epoch_transition: {}; +} | { + advance_current_epoch: { + expected_active_set_size: number; + new_rewarded_set: LayerAssignment[]; + }; +} | { + reconcile_epoch_events: { + limit?: number | null; + }; +} | { + bond_mixnode: { + cost_params: MixNodeCostParams; + mix_node: MixNode; + owner_signature: MessageSignature; + }; +} | { + bond_mixnode_on_behalf: { + cost_params: MixNodeCostParams; + mix_node: MixNode; + owner: string; + owner_signature: MessageSignature; + }; +} | { + pledge_more: {}; +} | { + pledge_more_on_behalf: { + owner: string; + }; +} | { + decrease_pledge: { + decrease_by: Coin; + }; +} | { + decrease_pledge_on_behalf: { + decrease_by: Coin; + owner: string; + }; +} | { + unbond_mixnode: {}; +} | { + unbond_mixnode_on_behalf: { + owner: string; + }; +} | { + update_mixnode_cost_params: { + new_costs: MixNodeCostParams; + }; +} | { + update_mixnode_cost_params_on_behalf: { + new_costs: MixNodeCostParams; + owner: string; + }; +} | { + update_mixnode_config: { + new_config: MixNodeConfigUpdate; + }; +} | { + update_mixnode_config_on_behalf: { + new_config: MixNodeConfigUpdate; + owner: string; + }; +} | { + bond_gateway: { + gateway: Gateway; + owner_signature: MessageSignature; + }; +} | { + bond_gateway_on_behalf: { + gateway: Gateway; + owner: string; + owner_signature: MessageSignature; + }; +} | { + unbond_gateway: {}; +} | { + unbond_gateway_on_behalf: { + owner: string; + }; +} | { + update_gateway_config: { + new_config: GatewayConfigUpdate; + }; +} | { + update_gateway_config_on_behalf: { + new_config: GatewayConfigUpdate; + owner: string; + }; +} | { + delegate_to_mixnode: { + mix_id: number; + }; +} | { + delegate_to_mixnode_on_behalf: { + delegate: string; + mix_id: number; + }; +} | { + undelegate_from_mixnode: { + mix_id: number; + }; +} | { + undelegate_from_mixnode_on_behalf: { + delegate: string; + mix_id: number; + }; +} | { + reward_mixnode: { + mix_id: number; + performance: Percent; + }; +} | { + withdraw_operator_reward: {}; +} | { + withdraw_operator_reward_on_behalf: { + owner: string; + }; +} | { + withdraw_delegator_reward: { + mix_id: number; + }; +} | { + withdraw_delegator_reward_on_behalf: { + mix_id: number; + owner: string; + }; +}; +export type Layer = "One" | "Two" | "Three"; +export type FamilyHead = string; +export type MessageSignature = number[]; +export type Uint128 = string; +export interface ContractStateParams { + minimum_gateway_pledge: Coin; + minimum_mixnode_delegation?: Coin | null; + minimum_mixnode_pledge: Coin; +} +export interface Coin { + amount: Uint128; + denom: string; + [k: string]: unknown; +} +export interface IntervalRewardingParamsUpdate { + active_set_work_factor?: Decimal | null; + interval_pool_emission?: Percent | null; + reward_pool?: Decimal | null; + rewarded_set_size?: number | null; + staking_supply?: Decimal | null; + staking_supply_scale_factor?: Percent | null; + sybil_resistance_percent?: Percent | null; +} +export interface LayerAssignment { + layer: Layer; + mix_id: number; +} +export interface MixNodeCostParams { + interval_operating_cost: Coin; + profit_margin_percent: Percent; +} +export interface MixNode { + host: string; + http_api_port: number; + identity_key: string; + mix_port: number; + sphinx_key: string; + verloc_port: number; + version: string; +} +export interface MixNodeConfigUpdate { + host: string; + http_api_port: number; + mix_port: number; + verloc_port: number; + version: string; +} +export interface Gateway { + clients_port: number; + host: string; + identity_key: string; + location: string; + mix_port: number; + sphinx_key: string; + version: string; +} +export interface GatewayConfigUpdate { + clients_port: number; + host: string; + location: string; + mix_port: number; + version: string; +} +export type QueryMsg = { + get_all_families_paged: { + limit?: number | null; + start_after?: string | null; + }; +} | { + get_all_members_paged: { + limit?: number | null; + start_after?: string | null; + }; +} | { + get_family_by_head: { + head: string; + }; +} | { + get_family_by_label: { + label: string; + }; +} | { + get_family_members_by_head: { + head: string; + }; +} | { + get_family_members_by_label: { + label: string; + }; +} | { + get_contract_version: {}; +} | { + get_cw2_contract_version: {}; +} | { + get_rewarding_validator_address: {}; +} | { + get_state_params: {}; +} | { + get_state: {}; +} | { + get_rewarding_params: {}; +} | { + get_epoch_status: {}; +} | { + get_current_interval_details: {}; +} | { + get_rewarded_set: { + limit?: number | null; + start_after?: number | null; + }; +} | { + get_mix_node_bonds: { + limit?: number | null; + start_after?: number | null; + }; +} | { + get_mix_nodes_detailed: { + limit?: number | null; + start_after?: number | null; + }; +} | { + get_unbonded_mix_nodes: { + limit?: number | null; + start_after?: number | null; + }; +} | { + get_unbonded_mix_nodes_by_owner: { + limit?: number | null; + owner: string; + start_after?: number | null; + }; +} | { + get_unbonded_mix_nodes_by_identity_key: { + identity_key: string; + limit?: number | null; + start_after?: number | null; + }; +} | { + get_owned_mixnode: { + address: string; + }; +} | { + get_mixnode_details: { + mix_id: number; + }; +} | { + get_mixnode_rewarding_details: { + mix_id: number; + }; +} | { + get_stake_saturation: { + mix_id: number; + }; +} | { + get_unbonded_mix_node_information: { + mix_id: number; + }; +} | { + get_bonded_mixnode_details_by_identity: { + mix_identity: string; + }; +} | { + get_layer_distribution: {}; +} | { + get_gateways: { + limit?: number | null; + start_after?: string | null; + }; +} | { + get_gateway_bond: { + identity: string; + }; +} | { + get_owned_gateway: { + address: string; + }; +} | { + get_mixnode_delegations: { + limit?: number | null; + mix_id: number; + start_after?: string | null; + }; +} | { + get_delegator_delegations: { + delegator: string; + limit?: number | null; + start_after?: [number, string] | null; + }; +} | { + get_delegation_details: { + delegator: string; + mix_id: number; + proxy?: string | null; + }; +} | { + get_all_delegations: { + limit?: number | null; + start_after?: [number, string] | null; + }; +} | { + get_pending_operator_reward: { + address: string; + }; +} | { + get_pending_mix_node_operator_reward: { + mix_id: number; + }; +} | { + get_pending_delegator_reward: { + address: string; + mix_id: number; + proxy?: string | null; + }; +} | { + get_estimated_current_epoch_operator_reward: { + estimated_performance: Percent; + mix_id: number; + }; +} | { + get_estimated_current_epoch_delegator_reward: { + address: string; + estimated_performance: Percent; + mix_id: number; + proxy?: string | null; + }; +} | { + get_pending_epoch_events: { + limit?: number | null; + start_after?: number | null; + }; +} | { + get_pending_interval_events: { + limit?: number | null; + start_after?: number | null; + }; +} | { + get_pending_epoch_event: { + event_id: number; + }; +} | { + get_pending_interval_event: { + event_id: number; + }; +} | { + get_number_of_pending_events: {}; +} | { + get_signing_nonce: { + address: string; + }; +}; +export interface MigrateMsg { + vesting_contract_address?: string | null; +} +export type Addr = string; +export interface PagedAllDelegationsResponse { + delegations: Delegation[]; + start_next_after?: [number, string] | null; +} +export interface Delegation { + amount: Coin; + cumulative_reward_ratio: Decimal; + height: number; + mix_id: number; + owner: Addr; + proxy?: Addr | null; +} +export interface PagedFamiliesResponse { + families: Family[]; + start_next_after?: string | null; +} +export interface Family { + head: FamilyHead; + label: string; + proxy?: string | null; +} +export interface PagedMembersResponse { + members: [string, FamilyHead][]; + start_next_after?: string | null; +} +export interface MixnodeDetailsByIdentityResponse { + identity_key: string; + mixnode_details?: MixNodeDetails | null; +} +export interface MixNodeDetails { + bond_information: MixNodeBond; + pending_changes?: PendingMixNodeChanges; + rewarding_details: MixNodeRewarding; +} +export interface MixNodeBond { + bonding_height: number; + is_unbonding: boolean; + layer: Layer; + mix_id: number; + mix_node: MixNode; + original_pledge: Coin; + owner: Addr; + proxy?: Addr | null; +} +export interface PendingMixNodeChanges { + pledge_change?: number | null; +} +export interface MixNodeRewarding { + cost_params: MixNodeCostParams; + delegates: Decimal; + last_rewarded_epoch: number; + operator: Decimal; + total_unit_reward: Decimal; + unique_delegations: number; + unit_delegation: Decimal; +} +export interface ContractVersion { + contract: string; + version: string; +} +export interface ContractBuildInformation { + build_timestamp: string; + build_version: string; + commit_branch: string; + commit_sha: string; + commit_timestamp: string; + rustc_version: string; +} +export interface CurrentIntervalResponse { + current_blocktime: number; + interval: Interval; + is_current_epoch_over: boolean; + is_current_interval_over: boolean; +} +export interface Interval { + current_epoch_id: number; + current_epoch_start: string; + epoch_length: Duration; + epochs_in_interval: number; + id: number; + total_elapsed_epochs: number; + [k: string]: unknown; +} +export interface MixNodeDelegationResponse { + delegation?: Delegation | null; + mixnode_still_bonded: boolean; +} +export interface PagedDelegatorDelegationsResponse { + delegations: Delegation[]; + start_next_after?: [number, string] | null; +} +export type EpochState = "in_progress" | { + rewarding: { + final_node_id: number; + last_rewarded: number; + }; +} | "reconciling_events" | "advancing_epoch"; +export interface EpochStatus { + being_advanced_by: Addr; + state: EpochState; +} +export interface EstimatedCurrentEpochRewardResponse { + current_stake_value?: Coin | null; + current_stake_value_detailed_amount?: Decimal | null; + detailed_estimation_amount?: Decimal | null; + estimation?: Coin | null; + original_stake?: Coin | null; +} +export interface FamilyByHeadResponse { + family?: Family | null; + head: FamilyHead; +} +export interface FamilyByLabelResponse { + family?: Family | null; + label: string; +} +export interface FamilyMembersByHeadResponse { + head: FamilyHead; + members: string[]; +} +export interface FamilyMembersByLabelResponse { + label: string; + members: string[]; +} +export interface GatewayBondResponse { + gateway?: GatewayBond | null; + identity: string; +} +export interface GatewayBond { + block_height: number; + gateway: Gateway; + owner: Addr; + pledge_amount: Coin; + proxy?: Addr | null; +} +export interface PagedGatewayResponse { + nodes: GatewayBond[]; + per_page: number; + start_next_after?: string | null; +} +export interface LayerDistribution { + layer1: number; + layer2: number; + layer3: number; +} +export interface PagedMixnodeBondsResponse { + nodes: MixNodeBond[]; + per_page: number; + start_next_after?: number | null; +} +export interface PagedMixnodesDetailsResponse { + nodes: MixNodeDetails[]; + per_page: number; + start_next_after?: number | null; +} +export interface PagedMixNodeDelegationsResponse { + delegations: Delegation[]; + start_next_after?: string | null; +} +export interface MixnodeDetailsResponse { + mix_id: number; + mixnode_details?: MixNodeDetails | null; +} +export interface MixnodeRewardingDetailsResponse { + mix_id: number; + rewarding_details?: MixNodeRewarding | null; +} +export interface NumberOfPendingEventsResponse { + epoch_events: number; + interval_events: number; +} +export interface GatewayOwnershipResponse { + address: Addr; + gateway?: GatewayBond | null; +} +export interface MixOwnershipResponse { + address: Addr; + mixnode_details?: MixNodeDetails | null; +} +export interface PendingRewardResponse { + amount_earned?: Coin | null; + amount_earned_detailed?: Decimal | null; + amount_staked?: Coin | null; + mixnode_still_fully_bonded: boolean; +} +export type PendingEpochEventKind = { + delegate: { + amount: Coin; + mix_id: number; + owner: Addr; + proxy?: Addr | null; + }; +} | { + undelegate: { + mix_id: number; + owner: Addr; + proxy?: Addr | null; + }; +} | { + pledge_more: { + amount: Coin; + mix_id: number; + }; +} | { + decrease_pledge: { + decrease_by: Coin; + mix_id: number; + }; +} | { + unbond_mixnode: { + mix_id: number; + }; +} | { + update_active_set_size: { + new_size: number; + }; +}; +export interface PendingEpochEventResponse { + event?: PendingEpochEventData | null; + event_id: number; +} +export interface PendingEpochEventData { + created_at: number; + kind: PendingEpochEventKind; +} +export interface PendingEpochEventsResponse { + events: PendingEpochEvent[]; + seconds_until_executable: number; + start_next_after?: number | null; +} +export interface PendingEpochEvent { + event: PendingEpochEventData; + id: number; +} +export type PendingIntervalEventKind = { + change_mix_cost_params: { + mix_id: number; + new_costs: MixNodeCostParams; + }; +} | { + update_rewarding_params: { + update: IntervalRewardingParamsUpdate; + }; +} | { + update_interval_config: { + epoch_duration_secs: number; + epochs_in_interval: number; + }; +}; +export interface PendingIntervalEventResponse { + event?: PendingIntervalEventData | null; + event_id: number; +} +export interface PendingIntervalEventData { + created_at: number; + kind: PendingIntervalEventKind; +} +export interface PendingIntervalEventsResponse { + events: PendingIntervalEvent[]; + seconds_until_executable: number; + start_next_after?: number | null; +} +export interface PendingIntervalEvent { + event: PendingIntervalEventData; + id: number; +} +export type RewardedSetNodeStatus = "active" | "standby"; +export interface PagedRewardedSetResponse { + nodes: [number, RewardedSetNodeStatus][]; + start_next_after?: number | null; +} +export interface RewardingParams { + active_set_size: number; + interval: IntervalRewardParams; + rewarded_set_size: number; +} +export interface IntervalRewardParams { + active_set_work_factor: Decimal; + epoch_reward_budget: Decimal; + interval_pool_emission: Percent; + reward_pool: Decimal; + stake_saturation_point: Decimal; + staking_supply: Decimal; + staking_supply_scale_factor: Percent; + sybil_resistance: Percent; +} +export type String = string; +export type Uint32 = number; +export interface StakeSaturationResponse { + current_saturation?: Decimal | null; + mix_id: number; + uncapped_saturation?: Decimal | null; +} +export interface ContractState { + owner: Addr; + params: ContractStateParams; + rewarding_denom: string; + rewarding_validator_address: Addr; + vesting_contract_address: Addr; +} +export interface UnbondedMixnodeResponse { + mix_id: number; + unbonded_info?: UnbondedMixnode | null; +} +export interface UnbondedMixnode { + identity_key: string; + owner: Addr; + proxy?: Addr | null; + unbonding_height: number; +} +export interface PagedUnbondedMixnodesResponse { + nodes: [number, UnbondedMixnode][]; + per_page: number; + start_next_after?: number | null; +} diff --git a/sdk/typescript/codegen/contract-clients/src/NameService.client.ts b/sdk/typescript/codegen/contract-clients/src/NameService.client.ts new file mode 100644 index 0000000000..5f5444f0fc --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/NameService.client.ts @@ -0,0 +1,241 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; +import { StdFee } from "@cosmjs/amino"; +import { Uint128, InstantiateMsg, Coin, ExecuteMsg, Address, NymName, MessageSignature, NameDetails, QueryMsg, MigrateMsg, Addr, PagedNamesListResponse, RegisteredName, NamesListResponse, ConfigResponse, ContractVersion, ContractBuildInformation, Uint32 } from "./NameService.types"; +import { GetCw2ContractVersionResponse } from './types'; +export interface NameServiceReadOnlyInterface { + contractAddress: string; + nameId: ({ + nameId + }: { + nameId: number; + }) => Promise; + byOwner: ({ + owner + }: { + owner: string; + }) => Promise; + byName: ({ + name + }: { + name: NymName; + }) => Promise; + byAddress: ({ + address + }: { + address: Address; + }) => Promise; + all: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }) => Promise; + signingNonce: ({ + address + }: { + address: string; + }) => Promise; + config: () => Promise; + getContractVersion: () => Promise; + getCw2ContractVersion: () => Promise; +} +export class NameServiceQueryClient implements NameServiceReadOnlyInterface { + client: CosmWasmClient; + contractAddress: string; + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client; + this.contractAddress = contractAddress; + this.nameId = this.nameId.bind(this); + this.byOwner = this.byOwner.bind(this); + this.byName = this.byName.bind(this); + this.byAddress = this.byAddress.bind(this); + this.all = this.all.bind(this); + this.signingNonce = this.signingNonce.bind(this); + this.config = this.config.bind(this); + this.getContractVersion = this.getContractVersion.bind(this); + this.getCw2ContractVersion = this.getCw2ContractVersion.bind(this); + } + + nameId = async ({ + nameId + }: { + nameId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + name_id: { + name_id: nameId + } + }); + }; + byOwner = async ({ + owner + }: { + owner: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + by_owner: { + owner + } + }); + }; + byName = async ({ + name + }: { + name: NymName; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + by_name: { + name + } + }); + }; + byAddress = async ({ + address + }: { + address: Address; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + by_address: { + address + } + }); + }; + all = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + all: { + limit, + start_after: startAfter + } + }); + }; + signingNonce = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + signing_nonce: { + address + } + }); + }; + config = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + config: {} + }); + }; + getContractVersion = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_contract_version: {} + }); + }; + getCw2ContractVersion = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_cw2_contract_version: {} + }); + }; +} +export interface NameServiceInterface extends NameServiceReadOnlyInterface { + contractAddress: string; + sender: string; + register: ({ + name, + ownerSignature + }: { + name: NameDetails; + ownerSignature: MessageSignature; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + deleteId: ({ + nameId + }: { + nameId: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + deleteName: ({ + name + }: { + name: NymName; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateDepositRequired: ({ + depositRequired + }: { + depositRequired: Coin; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; +} +export class NameServiceClient extends NameServiceQueryClient implements NameServiceInterface { + client: SigningCosmWasmClient; + sender: string; + contractAddress: string; + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress); + this.client = client; + this.sender = sender; + this.contractAddress = contractAddress; + this.register = this.register.bind(this); + this.deleteId = this.deleteId.bind(this); + this.deleteName = this.deleteName.bind(this); + this.updateDepositRequired = this.updateDepositRequired.bind(this); + } + + register = async ({ + name, + ownerSignature + }: { + name: NameDetails; + ownerSignature: MessageSignature; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + register: { + name, + owner_signature: ownerSignature + } + }, fee, memo, _funds); + }; + deleteId = async ({ + nameId + }: { + nameId: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + delete_id: { + name_id: nameId + } + }, fee, memo, _funds); + }; + deleteName = async ({ + name + }: { + name: NymName; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + delete_name: { + name + } + }, fee, memo, _funds); + }; + updateDepositRequired = async ({ + depositRequired + }: { + depositRequired: Coin; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_deposit_required: { + deposit_required: depositRequired + } + }, fee, memo, _funds); + }; +} diff --git a/sdk/typescript/codegen/contract-clients/src/NameService.types.ts b/sdk/typescript/codegen/contract-clients/src/NameService.types.ts new file mode 100644 index 0000000000..c9d80b5936 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/NameService.types.ts @@ -0,0 +1,108 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +export type Uint128 = string; +export interface InstantiateMsg { + deposit_required: Coin; +} +export interface Coin { + amount: Uint128; + denom: string; + [k: string]: unknown; +} +export type ExecuteMsg = { + register: { + name: NameDetails; + owner_signature: MessageSignature; + }; +} | { + delete_id: { + name_id: number; + }; +} | { + delete_name: { + name: NymName; + }; +} | { + update_deposit_required: { + deposit_required: Coin; + }; +}; +export type Address = { + nym_address: string; +}; +export type NymName = string; +export type MessageSignature = number[]; +export interface NameDetails { + address: Address; + identity_key: string; + name: NymName; +} +export type QueryMsg = { + name_id: { + name_id: number; + }; +} | { + by_owner: { + owner: string; + }; +} | { + by_name: { + name: NymName; + }; +} | { + by_address: { + address: Address; + }; +} | { + all: { + limit?: number | null; + start_after?: number | null; + }; +} | { + signing_nonce: { + address: string; + }; +} | { + config: {}; +} | { + get_contract_version: {}; +} | { + get_cw2_contract_version: {}; +}; +export interface MigrateMsg {} +export type Addr = string; +export interface PagedNamesListResponse { + names: RegisteredName[]; + per_page: number; + start_next_after?: number | null; +} +export interface RegisteredName { + block_height: number; + deposit: Coin; + id: number; + name: NameDetails; + owner: Addr; +} +export interface NamesListResponse { + names: RegisteredName[]; +} +export interface ConfigResponse { + deposit_required: Coin; +} +export interface ContractVersion { + contract: string; + version: string; +} +export interface ContractBuildInformation { + build_timestamp: string; + build_version: string; + commit_branch: string; + commit_sha: string; + commit_timestamp: string; + rustc_version: string; +} +export type Uint32 = number; \ No newline at end of file diff --git a/sdk/typescript/codegen/contract-clients/src/ServiceProviderDirectory.client.ts b/sdk/typescript/codegen/contract-clients/src/ServiceProviderDirectory.client.ts new file mode 100644 index 0000000000..07f631e545 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/ServiceProviderDirectory.client.ts @@ -0,0 +1,224 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; +import { StdFee } from "@cosmjs/amino"; +import { Uint128, InstantiateMsg, Coin, ExecuteMsg, MessageSignature, NymAddress, ServiceType, ServiceDetails, QueryMsg, MigrateMsg, Addr, PagedServicesListResponse, Service, ServicesListResponse, ConfigResponse, ContractVersion, ContractBuildInformation, Uint32 } from "./ServiceProviderDirectory.types"; +import { GetCw2ContractVersionResponse } from './types'; +export interface ServiceProviderDirectoryReadOnlyInterface { + contractAddress: string; + serviceId: ({ + serviceId + }: { + serviceId: number; + }) => Promise; + byAnnouncer: ({ + announcer + }: { + announcer: string; + }) => Promise; + byNymAddress: ({ + nymAddress + }: { + nymAddress: NymAddress; + }) => Promise; + all: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }) => Promise; + signingNonce: ({ + address + }: { + address: string; + }) => Promise; + config: () => Promise; + getContractVersion: () => Promise; + getCw2ContractVersion: () => Promise; +} +export class ServiceProviderDirectoryQueryClient implements ServiceProviderDirectoryReadOnlyInterface { + client: CosmWasmClient; + contractAddress: string; + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client; + this.contractAddress = contractAddress; + this.serviceId = this.serviceId.bind(this); + this.byAnnouncer = this.byAnnouncer.bind(this); + this.byNymAddress = this.byNymAddress.bind(this); + this.all = this.all.bind(this); + this.signingNonce = this.signingNonce.bind(this); + this.config = this.config.bind(this); + this.getContractVersion = this.getContractVersion.bind(this); + this.getCw2ContractVersion = this.getCw2ContractVersion.bind(this); + } + + serviceId = async ({ + serviceId + }: { + serviceId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + service_id: { + service_id: serviceId + } + }); + }; + byAnnouncer = async ({ + announcer + }: { + announcer: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + by_announcer: { + announcer + } + }); + }; + byNymAddress = async ({ + nymAddress + }: { + nymAddress: NymAddress; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + by_nym_address: { + nym_address: nymAddress + } + }); + }; + all = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + all: { + limit, + start_after: startAfter + } + }); + }; + signingNonce = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + signing_nonce: { + address + } + }); + }; + config = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + config: {} + }); + }; + getContractVersion = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_contract_version: {} + }); + }; + getCw2ContractVersion = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_cw2_contract_version: {} + }); + }; +} +export interface ServiceProviderDirectoryInterface extends ServiceProviderDirectoryReadOnlyInterface { + contractAddress: string; + sender: string; + announce: ({ + ownerSignature, + service + }: { + ownerSignature: MessageSignature; + service: ServiceDetails; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + deleteId: ({ + serviceId + }: { + serviceId: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + deleteNymAddress: ({ + nymAddress + }: { + nymAddress: NymAddress; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateDepositRequired: ({ + depositRequired + }: { + depositRequired: Coin; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; +} +export class ServiceProviderDirectoryClient extends ServiceProviderDirectoryQueryClient implements ServiceProviderDirectoryInterface { + client: SigningCosmWasmClient; + sender: string; + contractAddress: string; + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress); + this.client = client; + this.sender = sender; + this.contractAddress = contractAddress; + this.announce = this.announce.bind(this); + this.deleteId = this.deleteId.bind(this); + this.deleteNymAddress = this.deleteNymAddress.bind(this); + this.updateDepositRequired = this.updateDepositRequired.bind(this); + } + + announce = async ({ + ownerSignature, + service + }: { + ownerSignature: MessageSignature; + service: ServiceDetails; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + announce: { + owner_signature: ownerSignature, + service + } + }, fee, memo, _funds); + }; + deleteId = async ({ + serviceId + }: { + serviceId: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + delete_id: { + service_id: serviceId + } + }, fee, memo, _funds); + }; + deleteNymAddress = async ({ + nymAddress + }: { + nymAddress: NymAddress; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + delete_nym_address: { + nym_address: nymAddress + } + }, fee, memo, _funds); + }; + updateDepositRequired = async ({ + depositRequired + }: { + depositRequired: Coin; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_deposit_required: { + deposit_required: depositRequired + } + }, fee, memo, _funds); + }; +} diff --git a/sdk/typescript/codegen/contract-clients/src/ServiceProviderDirectory.types.ts b/sdk/typescript/codegen/contract-clients/src/ServiceProviderDirectory.types.ts new file mode 100644 index 0000000000..9cf727132b --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/ServiceProviderDirectory.types.ts @@ -0,0 +1,104 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +export type Uint128 = string; +export interface InstantiateMsg { + deposit_required: Coin; +} +export interface Coin { + amount: Uint128; + denom: string; + [k: string]: unknown; +} +export type ExecuteMsg = { + announce: { + owner_signature: MessageSignature; + service: ServiceDetails; + }; +} | { + delete_id: { + service_id: number; + }; +} | { + delete_nym_address: { + nym_address: NymAddress; + }; +} | { + update_deposit_required: { + deposit_required: Coin; + }; +}; +export type MessageSignature = number[]; +export type NymAddress = { + address: string; +}; +export type ServiceType = "network_requester"; +export interface ServiceDetails { + identity_key: string; + nym_address: NymAddress; + service_type: ServiceType; +} +export type QueryMsg = { + service_id: { + service_id: number; + }; +} | { + by_announcer: { + announcer: string; + }; +} | { + by_nym_address: { + nym_address: NymAddress; + }; +} | { + all: { + limit?: number | null; + start_after?: number | null; + }; +} | { + signing_nonce: { + address: string; + }; +} | { + config: {}; +} | { + get_contract_version: {}; +} | { + get_cw2_contract_version: {}; +}; +export interface MigrateMsg {} +export type Addr = string; +export interface PagedServicesListResponse { + per_page: number; + services: Service[]; + start_next_after?: number | null; +} +export interface Service { + announcer: Addr; + block_height: number; + deposit: Coin; + service: ServiceDetails; + service_id: number; +} +export interface ServicesListResponse { + services: Service[]; +} +export interface ConfigResponse { + deposit_required: Coin; +} +export interface ContractVersion { + contract: string; + version: string; +} +export interface ContractBuildInformation { + build_timestamp: string; + build_version: string; + commit_branch: string; + commit_sha: string; + commit_timestamp: string; + rustc_version: string; +} +export type Uint32 = number; \ No newline at end of file diff --git a/sdk/typescript/codegen/contract-clients/src/Vesting.client.ts b/sdk/typescript/codegen/contract-clients/src/Vesting.client.ts new file mode 100644 index 0000000000..57e08e327a --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/Vesting.client.ts @@ -0,0 +1,1058 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; +import { StdFee } from "@cosmjs/amino"; +import { InstantiateMsg, ExecuteMsg, FamilyHead, MessageSignature, Uint128, Percent, Decimal, PledgeCap, Coin, MixNodeCostParams, MixNodeConfigUpdate, VestingSpecification, MixNode, Gateway, GatewayConfigUpdate, QueryMsg, Timestamp, Uint64, MigrateMsg, Addr, Account, VestingPeriod, AccountsResponse, BaseVestingAccountInfo, VestingCoinsResponse, AccountVestingCoins, AllDelegationsResponse, VestingDelegation, ContractVersion, ContractBuildInformation, Period, DelegationTimesResponse, NullablePledgeData, PledgeData, OriginalVestingResponse } from "./Vesting.types"; +import { GetCw2ContractVersionResponse } from './types'; +export interface VestingReadOnlyInterface { + contractAddress: string; + getContractVersion: () => Promise; + getCw2ContractVersion: () => Promise; + getAccountsPaged: ({ + limit, + startNextAfter + }: { + limit?: number; + startNextAfter?: string; + }) => Promise; + getAccountsVestingCoinsPaged: ({ + limit, + startNextAfter + }: { + limit?: number; + startNextAfter?: string; + }) => Promise; + lockedCoins: ({ + blockTime, + vestingAccountAddress + }: { + blockTime?: Timestamp; + vestingAccountAddress: string; + }) => Promise; + spendableCoins: ({ + blockTime, + vestingAccountAddress + }: { + blockTime?: Timestamp; + vestingAccountAddress: string; + }) => Promise; + getVestedCoins: ({ + blockTime, + vestingAccountAddress + }: { + blockTime?: Timestamp; + vestingAccountAddress: string; + }) => Promise; + getVestingCoins: ({ + blockTime, + vestingAccountAddress + }: { + blockTime?: Timestamp; + vestingAccountAddress: string; + }) => Promise; + getStartTime: ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }) => Promise; + getEndTime: ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }) => Promise; + getOriginalVesting: ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }) => Promise; + getHistoricalVestingStakingReward: ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }) => Promise; + getSpendableVestedCoins: ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }) => Promise; + getSpendableRewardCoins: ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }) => Promise; + getDelegatedCoins: ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }) => Promise; + getPledgedCoins: ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }) => Promise; + getStakedCoins: ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }) => Promise; + getWithdrawnCoins: ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }) => Promise; + getAccount: ({ + address + }: { + address: string; + }) => Promise; + getMixnode: ({ + address + }: { + address: string; + }) => Promise; + getGateway: ({ + address + }: { + address: string; + }) => Promise; + getCurrentVestingPeriod: ({ + address + }: { + address: string; + }) => Promise; + getDelegation: ({ + address, + blockTimestampSecs, + mixId + }: { + address: string; + blockTimestampSecs: number; + mixId: number; + }) => Promise; + getTotalDelegationAmount: ({ + address, + mixId + }: { + address: string; + mixId: number; + }) => Promise; + getDelegationTimes: ({ + address, + mixId + }: { + address: string; + mixId: number; + }) => Promise; + getAllDelegations: ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number[][]; + }) => Promise; +} +export class VestingQueryClient implements VestingReadOnlyInterface { + client: CosmWasmClient; + contractAddress: string; + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client; + this.contractAddress = contractAddress; + this.getContractVersion = this.getContractVersion.bind(this); + this.getCw2ContractVersion = this.getCw2ContractVersion.bind(this); + this.getAccountsPaged = this.getAccountsPaged.bind(this); + this.getAccountsVestingCoinsPaged = this.getAccountsVestingCoinsPaged.bind(this); + this.lockedCoins = this.lockedCoins.bind(this); + this.spendableCoins = this.spendableCoins.bind(this); + this.getVestedCoins = this.getVestedCoins.bind(this); + this.getVestingCoins = this.getVestingCoins.bind(this); + this.getStartTime = this.getStartTime.bind(this); + this.getEndTime = this.getEndTime.bind(this); + this.getOriginalVesting = this.getOriginalVesting.bind(this); + this.getHistoricalVestingStakingReward = this.getHistoricalVestingStakingReward.bind(this); + this.getSpendableVestedCoins = this.getSpendableVestedCoins.bind(this); + this.getSpendableRewardCoins = this.getSpendableRewardCoins.bind(this); + this.getDelegatedCoins = this.getDelegatedCoins.bind(this); + this.getPledgedCoins = this.getPledgedCoins.bind(this); + this.getStakedCoins = this.getStakedCoins.bind(this); + this.getWithdrawnCoins = this.getWithdrawnCoins.bind(this); + this.getAccount = this.getAccount.bind(this); + this.getMixnode = this.getMixnode.bind(this); + this.getGateway = this.getGateway.bind(this); + this.getCurrentVestingPeriod = this.getCurrentVestingPeriod.bind(this); + this.getDelegation = this.getDelegation.bind(this); + this.getTotalDelegationAmount = this.getTotalDelegationAmount.bind(this); + this.getDelegationTimes = this.getDelegationTimes.bind(this); + this.getAllDelegations = this.getAllDelegations.bind(this); + } + + getContractVersion = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_contract_version: {} + }); + }; + getCw2ContractVersion = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_cw2_contract_version: {} + }); + }; + getAccountsPaged = async ({ + limit, + startNextAfter + }: { + limit?: number; + startNextAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_accounts_paged: { + limit, + start_next_after: startNextAfter + } + }); + }; + getAccountsVestingCoinsPaged = async ({ + limit, + startNextAfter + }: { + limit?: number; + startNextAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_accounts_vesting_coins_paged: { + limit, + start_next_after: startNextAfter + } + }); + }; + lockedCoins = async ({ + blockTime, + vestingAccountAddress + }: { + blockTime?: Timestamp; + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + locked_coins: { + block_time: blockTime, + vesting_account_address: vestingAccountAddress + } + }); + }; + spendableCoins = async ({ + blockTime, + vestingAccountAddress + }: { + blockTime?: Timestamp; + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + spendable_coins: { + block_time: blockTime, + vesting_account_address: vestingAccountAddress + } + }); + }; + getVestedCoins = async ({ + blockTime, + vestingAccountAddress + }: { + blockTime?: Timestamp; + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_vested_coins: { + block_time: blockTime, + vesting_account_address: vestingAccountAddress + } + }); + }; + getVestingCoins = async ({ + blockTime, + vestingAccountAddress + }: { + blockTime?: Timestamp; + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_vesting_coins: { + block_time: blockTime, + vesting_account_address: vestingAccountAddress + } + }); + }; + getStartTime = async ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_start_time: { + vesting_account_address: vestingAccountAddress + } + }); + }; + getEndTime = async ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_end_time: { + vesting_account_address: vestingAccountAddress + } + }); + }; + getOriginalVesting = async ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_original_vesting: { + vesting_account_address: vestingAccountAddress + } + }); + }; + getHistoricalVestingStakingReward = async ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_historical_vesting_staking_reward: { + vesting_account_address: vestingAccountAddress + } + }); + }; + getSpendableVestedCoins = async ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_spendable_vested_coins: { + vesting_account_address: vestingAccountAddress + } + }); + }; + getSpendableRewardCoins = async ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_spendable_reward_coins: { + vesting_account_address: vestingAccountAddress + } + }); + }; + getDelegatedCoins = async ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_delegated_coins: { + vesting_account_address: vestingAccountAddress + } + }); + }; + getPledgedCoins = async ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_pledged_coins: { + vesting_account_address: vestingAccountAddress + } + }); + }; + getStakedCoins = async ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_staked_coins: { + vesting_account_address: vestingAccountAddress + } + }); + }; + getWithdrawnCoins = async ({ + vestingAccountAddress + }: { + vestingAccountAddress: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_withdrawn_coins: { + vesting_account_address: vestingAccountAddress + } + }); + }; + getAccount = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_account: { + address + } + }); + }; + getMixnode = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_mixnode: { + address + } + }); + }; + getGateway = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_gateway: { + address + } + }); + }; + getCurrentVestingPeriod = async ({ + address + }: { + address: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_current_vesting_period: { + address + } + }); + }; + getDelegation = async ({ + address, + blockTimestampSecs, + mixId + }: { + address: string; + blockTimestampSecs: number; + mixId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_delegation: { + address, + block_timestamp_secs: blockTimestampSecs, + mix_id: mixId + } + }); + }; + getTotalDelegationAmount = async ({ + address, + mixId + }: { + address: string; + mixId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_total_delegation_amount: { + address, + mix_id: mixId + } + }); + }; + getDelegationTimes = async ({ + address, + mixId + }: { + address: string; + mixId: number; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_delegation_times: { + address, + mix_id: mixId + } + }); + }; + getAllDelegations = async ({ + limit, + startAfter + }: { + limit?: number; + startAfter?: number[][]; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_all_delegations: { + limit, + start_after: startAfter + } + }); + }; +} +export interface VestingInterface extends VestingReadOnlyInterface { + contractAddress: string; + sender: string; + createFamily: ({ + label + }: { + label: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + joinFamily: ({ + familyHead, + joinPermit + }: { + familyHead: FamilyHead; + joinPermit: MessageSignature; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + leaveFamily: ({ + familyHead + }: { + familyHead: FamilyHead; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + kickFamilyMember: ({ + member + }: { + member: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + trackReward: ({ + address, + amount + }: { + address: string; + amount: Coin; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + claimOperatorReward: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + claimDelegatorReward: ({ + mixId + }: { + mixId: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateMixnodeCostParams: ({ + newCosts + }: { + newCosts: MixNodeCostParams; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateMixnodeConfig: ({ + newConfig + }: { + newConfig: MixNodeConfigUpdate; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateMixnetAddress: ({ + address + }: { + address: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + delegateToMixnode: ({ + amount, + mixId, + onBehalfOf + }: { + amount: Coin; + mixId: number; + onBehalfOf?: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + undelegateFromMixnode: ({ + mixId, + onBehalfOf + }: { + mixId: number; + onBehalfOf?: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + createAccount: ({ + cap, + ownerAddress, + stakingAddress, + vestingSpec + }: { + cap?: PledgeCap; + ownerAddress: string; + stakingAddress?: string; + vestingSpec?: VestingSpecification; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + withdrawVestedCoins: ({ + amount + }: { + amount: Coin; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + trackUndelegation: ({ + amount, + mixId, + owner + }: { + amount: Coin; + mixId: number; + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + bondMixnode: ({ + amount, + costParams, + mixNode, + ownerSignature + }: { + amount: Coin; + costParams: MixNodeCostParams; + mixNode: MixNode; + ownerSignature: MessageSignature; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + pledgeMore: ({ + amount + }: { + amount: Coin; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + decreasePledge: ({ + amount + }: { + amount: Coin; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + unbondMixnode: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + trackUnbondMixnode: ({ + amount, + owner + }: { + amount: Coin; + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + trackDecreasePledge: ({ + amount, + owner + }: { + amount: Coin; + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + bondGateway: ({ + amount, + gateway, + ownerSignature + }: { + amount: Coin; + gateway: Gateway; + ownerSignature: MessageSignature; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + unbondGateway: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + trackUnbondGateway: ({ + amount, + owner + }: { + amount: Coin; + owner: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateGatewayConfig: ({ + newConfig + }: { + newConfig: GatewayConfigUpdate; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + transferOwnership: ({ + toAddress + }: { + toAddress: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateStakingAddress: ({ + toAddress + }: { + toAddress?: string; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateLockedPledgeCap: ({ + address, + cap + }: { + address: string; + cap: PledgeCap; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; +} +export class VestingClient extends VestingQueryClient implements VestingInterface { + client: SigningCosmWasmClient; + sender: string; + contractAddress: string; + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress); + this.client = client; + this.sender = sender; + this.contractAddress = contractAddress; + this.createFamily = this.createFamily.bind(this); + this.joinFamily = this.joinFamily.bind(this); + this.leaveFamily = this.leaveFamily.bind(this); + this.kickFamilyMember = this.kickFamilyMember.bind(this); + this.trackReward = this.trackReward.bind(this); + this.claimOperatorReward = this.claimOperatorReward.bind(this); + this.claimDelegatorReward = this.claimDelegatorReward.bind(this); + this.updateMixnodeCostParams = this.updateMixnodeCostParams.bind(this); + this.updateMixnodeConfig = this.updateMixnodeConfig.bind(this); + this.updateMixnetAddress = this.updateMixnetAddress.bind(this); + this.delegateToMixnode = this.delegateToMixnode.bind(this); + this.undelegateFromMixnode = this.undelegateFromMixnode.bind(this); + this.createAccount = this.createAccount.bind(this); + this.withdrawVestedCoins = this.withdrawVestedCoins.bind(this); + this.trackUndelegation = this.trackUndelegation.bind(this); + this.bondMixnode = this.bondMixnode.bind(this); + this.pledgeMore = this.pledgeMore.bind(this); + this.decreasePledge = this.decreasePledge.bind(this); + this.unbondMixnode = this.unbondMixnode.bind(this); + this.trackUnbondMixnode = this.trackUnbondMixnode.bind(this); + this.trackDecreasePledge = this.trackDecreasePledge.bind(this); + this.bondGateway = this.bondGateway.bind(this); + this.unbondGateway = this.unbondGateway.bind(this); + this.trackUnbondGateway = this.trackUnbondGateway.bind(this); + this.updateGatewayConfig = this.updateGatewayConfig.bind(this); + this.transferOwnership = this.transferOwnership.bind(this); + this.updateStakingAddress = this.updateStakingAddress.bind(this); + this.updateLockedPledgeCap = this.updateLockedPledgeCap.bind(this); + } + + createFamily = async ({ + label + }: { + label: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + create_family: { + label + } + }, fee, memo, _funds); + }; + joinFamily = async ({ + familyHead, + joinPermit + }: { + familyHead: FamilyHead; + joinPermit: MessageSignature; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + join_family: { + family_head: familyHead, + join_permit: joinPermit + } + }, fee, memo, _funds); + }; + leaveFamily = async ({ + familyHead + }: { + familyHead: FamilyHead; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + leave_family: { + family_head: familyHead + } + }, fee, memo, _funds); + }; + kickFamilyMember = async ({ + member + }: { + member: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + kick_family_member: { + member + } + }, fee, memo, _funds); + }; + trackReward = async ({ + address, + amount + }: { + address: string; + amount: Coin; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + track_reward: { + address, + amount + } + }, fee, memo, _funds); + }; + claimOperatorReward = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + claim_operator_reward: {} + }, fee, memo, _funds); + }; + claimDelegatorReward = async ({ + mixId + }: { + mixId: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + claim_delegator_reward: { + mix_id: mixId + } + }, fee, memo, _funds); + }; + updateMixnodeCostParams = async ({ + newCosts + }: { + newCosts: MixNodeCostParams; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_mixnode_cost_params: { + new_costs: newCosts + } + }, fee, memo, _funds); + }; + updateMixnodeConfig = async ({ + newConfig + }: { + newConfig: MixNodeConfigUpdate; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_mixnode_config: { + new_config: newConfig + } + }, fee, memo, _funds); + }; + updateMixnetAddress = async ({ + address + }: { + address: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_mixnet_address: { + address + } + }, fee, memo, _funds); + }; + delegateToMixnode = async ({ + amount, + mixId, + onBehalfOf + }: { + amount: Coin; + mixId: number; + onBehalfOf?: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + delegate_to_mixnode: { + amount, + mix_id: mixId, + on_behalf_of: onBehalfOf + } + }, fee, memo, _funds); + }; + undelegateFromMixnode = async ({ + mixId, + onBehalfOf + }: { + mixId: number; + onBehalfOf?: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + undelegate_from_mixnode: { + mix_id: mixId, + on_behalf_of: onBehalfOf + } + }, fee, memo, _funds); + }; + createAccount = async ({ + cap, + ownerAddress, + stakingAddress, + vestingSpec + }: { + cap?: PledgeCap; + ownerAddress: string; + stakingAddress?: string; + vestingSpec?: VestingSpecification; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + create_account: { + cap, + owner_address: ownerAddress, + staking_address: stakingAddress, + vesting_spec: vestingSpec + } + }, fee, memo, _funds); + }; + withdrawVestedCoins = async ({ + amount + }: { + amount: Coin; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + withdraw_vested_coins: { + amount + } + }, fee, memo, _funds); + }; + trackUndelegation = async ({ + amount, + mixId, + owner + }: { + amount: Coin; + mixId: number; + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + track_undelegation: { + amount, + mix_id: mixId, + owner + } + }, fee, memo, _funds); + }; + bondMixnode = async ({ + amount, + costParams, + mixNode, + ownerSignature + }: { + amount: Coin; + costParams: MixNodeCostParams; + mixNode: MixNode; + ownerSignature: MessageSignature; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + bond_mixnode: { + amount, + cost_params: costParams, + mix_node: mixNode, + owner_signature: ownerSignature + } + }, fee, memo, _funds); + }; + pledgeMore = async ({ + amount + }: { + amount: Coin; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + pledge_more: { + amount + } + }, fee, memo, _funds); + }; + decreasePledge = async ({ + amount + }: { + amount: Coin; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + decrease_pledge: { + amount + } + }, fee, memo, _funds); + }; + unbondMixnode = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + unbond_mixnode: {} + }, fee, memo, _funds); + }; + trackUnbondMixnode = async ({ + amount, + owner + }: { + amount: Coin; + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + track_unbond_mixnode: { + amount, + owner + } + }, fee, memo, _funds); + }; + trackDecreasePledge = async ({ + amount, + owner + }: { + amount: Coin; + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + track_decrease_pledge: { + amount, + owner + } + }, fee, memo, _funds); + }; + bondGateway = async ({ + amount, + gateway, + ownerSignature + }: { + amount: Coin; + gateway: Gateway; + ownerSignature: MessageSignature; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + bond_gateway: { + amount, + gateway, + owner_signature: ownerSignature + } + }, fee, memo, _funds); + }; + unbondGateway = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + unbond_gateway: {} + }, fee, memo, _funds); + }; + trackUnbondGateway = async ({ + amount, + owner + }: { + amount: Coin; + owner: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + track_unbond_gateway: { + amount, + owner + } + }, fee, memo, _funds); + }; + updateGatewayConfig = async ({ + newConfig + }: { + newConfig: GatewayConfigUpdate; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_gateway_config: { + new_config: newConfig + } + }, fee, memo, _funds); + }; + transferOwnership = async ({ + toAddress + }: { + toAddress: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + transfer_ownership: { + to_address: toAddress + } + }, fee, memo, _funds); + }; + updateStakingAddress = async ({ + toAddress + }: { + toAddress?: string; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_staking_address: { + to_address: toAddress + } + }, fee, memo, _funds); + }; + updateLockedPledgeCap = async ({ + address, + cap + }: { + address: string; + cap: PledgeCap; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_locked_pledge_cap: { + address, + cap + } + }, fee, memo, _funds); + }; +} diff --git a/sdk/typescript/codegen/contract-clients/src/Vesting.types.ts b/sdk/typescript/codegen/contract-clients/src/Vesting.types.ts new file mode 100644 index 0000000000..a07a32a242 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/Vesting.types.ts @@ -0,0 +1,379 @@ +/** +* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @cosmwasm/ts-codegen generate command to regenerate this file. +*/ + +export interface InstantiateMsg { + mix_denom: string; + mixnet_contract_address: string; +} +export type ExecuteMsg = { + create_family: { + label: string; + }; +} | { + join_family: { + family_head: FamilyHead; + join_permit: MessageSignature; + }; +} | { + leave_family: { + family_head: FamilyHead; + }; +} | { + kick_family_member: { + member: string; + }; +} | { + track_reward: { + address: string; + amount: Coin; + }; +} | { + claim_operator_reward: {}; +} | { + claim_delegator_reward: { + mix_id: number; + }; +} | { + update_mixnode_cost_params: { + new_costs: MixNodeCostParams; + }; +} | { + update_mixnode_config: { + new_config: MixNodeConfigUpdate; + }; +} | { + update_mixnet_address: { + address: string; + }; +} | { + delegate_to_mixnode: { + amount: Coin; + mix_id: number; + on_behalf_of?: string | null; + }; +} | { + undelegate_from_mixnode: { + mix_id: number; + on_behalf_of?: string | null; + }; +} | { + create_account: { + cap?: PledgeCap | null; + owner_address: string; + staking_address?: string | null; + vesting_spec?: VestingSpecification | null; + }; +} | { + withdraw_vested_coins: { + amount: Coin; + }; +} | { + track_undelegation: { + amount: Coin; + mix_id: number; + owner: string; + }; +} | { + bond_mixnode: { + amount: Coin; + cost_params: MixNodeCostParams; + mix_node: MixNode; + owner_signature: MessageSignature; + }; +} | { + pledge_more: { + amount: Coin; + }; +} | { + decrease_pledge: { + amount: Coin; + }; +} | { + unbond_mixnode: {}; +} | { + track_unbond_mixnode: { + amount: Coin; + owner: string; + }; +} | { + track_decrease_pledge: { + amount: Coin; + owner: string; + }; +} | { + bond_gateway: { + amount: Coin; + gateway: Gateway; + owner_signature: MessageSignature; + }; +} | { + unbond_gateway: {}; +} | { + track_unbond_gateway: { + amount: Coin; + owner: string; + }; +} | { + update_gateway_config: { + new_config: GatewayConfigUpdate; + }; +} | { + transfer_ownership: { + to_address: string; + }; +} | { + update_staking_address: { + to_address?: string | null; + }; +} | { + update_locked_pledge_cap: { + address: string; + cap: PledgeCap; + }; +}; +export type FamilyHead = string; +export type MessageSignature = number[]; +export type Uint128 = string; +export type Percent = Decimal; +export type Decimal = string; +export type PledgeCap = { + percent: Percent; +} | { + absolute: Uint128; +}; +export interface Coin { + amount: Uint128; + denom: string; + [k: string]: unknown; +} +export interface MixNodeCostParams { + interval_operating_cost: Coin; + profit_margin_percent: Percent; +} +export interface MixNodeConfigUpdate { + host: string; + http_api_port: number; + mix_port: number; + verloc_port: number; + version: string; +} +export interface VestingSpecification { + num_periods?: number | null; + period_seconds?: number | null; + start_time?: number | null; +} +export interface MixNode { + host: string; + http_api_port: number; + identity_key: string; + mix_port: number; + sphinx_key: string; + verloc_port: number; + version: string; +} +export interface Gateway { + clients_port: number; + host: string; + identity_key: string; + location: string; + mix_port: number; + sphinx_key: string; + version: string; +} +export interface GatewayConfigUpdate { + clients_port: number; + host: string; + location: string; + mix_port: number; + version: string; +} +export type QueryMsg = { + get_contract_version: {}; +} | { + get_cw2_contract_version: {}; +} | { + get_accounts_paged: { + limit?: number | null; + start_next_after?: string | null; + }; +} | { + get_accounts_vesting_coins_paged: { + limit?: number | null; + start_next_after?: string | null; + }; +} | { + locked_coins: { + block_time?: Timestamp | null; + vesting_account_address: string; + }; +} | { + spendable_coins: { + block_time?: Timestamp | null; + vesting_account_address: string; + }; +} | { + get_vested_coins: { + block_time?: Timestamp | null; + vesting_account_address: string; + }; +} | { + get_vesting_coins: { + block_time?: Timestamp | null; + vesting_account_address: string; + }; +} | { + get_start_time: { + vesting_account_address: string; + }; +} | { + get_end_time: { + vesting_account_address: string; + }; +} | { + get_original_vesting: { + vesting_account_address: string; + }; +} | { + get_historical_vesting_staking_reward: { + vesting_account_address: string; + }; +} | { + get_spendable_vested_coins: { + vesting_account_address: string; + }; +} | { + get_spendable_reward_coins: { + vesting_account_address: string; + }; +} | { + get_delegated_coins: { + vesting_account_address: string; + }; +} | { + get_pledged_coins: { + vesting_account_address: string; + }; +} | { + get_staked_coins: { + vesting_account_address: string; + }; +} | { + get_withdrawn_coins: { + vesting_account_address: string; + }; +} | { + get_account: { + address: string; + }; +} | { + get_mixnode: { + address: string; + }; +} | { + get_gateway: { + address: string; + }; +} | { + get_current_vesting_period: { + address: string; + }; +} | { + get_delegation: { + address: string; + block_timestamp_secs: number; + mix_id: number; + }; +} | { + get_total_delegation_amount: { + address: string; + mix_id: number; + }; +} | { + get_delegation_times: { + address: string; + mix_id: number; + }; +} | { + get_all_delegations: { + limit?: number | null; + start_after?: [number, number, number] | null; + }; +}; +export type Timestamp = Uint64; +export type Uint64 = string; +export interface MigrateMsg {} +export type Addr = string; +export interface Account { + coin: Coin; + owner_address: Addr; + periods: VestingPeriod[]; + pledge_cap?: PledgeCap | null; + staking_address?: Addr | null; + start_time: Timestamp; + storage_key: number; +} +export interface VestingPeriod { + period_seconds: number; + start_time: number; +} +export interface AccountsResponse { + accounts: BaseVestingAccountInfo[]; + start_next_after?: Addr | null; +} +export interface BaseVestingAccountInfo { + account_id: number; + owner: Addr; +} +export interface VestingCoinsResponse { + accounts: AccountVestingCoins[]; + start_next_after?: Addr | null; +} +export interface AccountVestingCoins { + account_id: number; + owner: Addr; + still_vesting: Coin; +} +export interface AllDelegationsResponse { + delegations: VestingDelegation[]; + start_next_after?: [number, number, number] | null; +} +export interface VestingDelegation { + account_id: number; + amount: Uint128; + block_timestamp: number; + mix_id: number; +} +export interface ContractVersion { + contract: string; + version: string; +} +export interface ContractBuildInformation { + build_timestamp: string; + build_version: string; + commit_branch: string; + commit_sha: string; + commit_timestamp: string; + rustc_version: string; +} +export type Period = "before" | { + in: number; +} | "after"; +export interface DelegationTimesResponse { + account_id: number; + delegation_timestamps: number[]; + mix_id: number; + owner: Addr; +} +export type NullablePledgeData = PledgeData | null; +export interface PledgeData { + amount: Coin; + block_time: Timestamp; +} +export interface OriginalVestingResponse { + amount: Coin; + number_of_periods: number; + period_duration: number; +} \ No newline at end of file diff --git a/sdk/typescript/codegen/contract-clients/src/index.ts b/sdk/typescript/codegen/contract-clients/src/index.ts new file mode 100644 index 0000000000..530b718908 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/index.ts @@ -0,0 +1,35 @@ +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.35.3. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +import * as _0 from './CoconutBandwidth.types'; +import * as _1 from './CoconutBandwidth.client'; +import * as _2 from './CoconutDkg.types'; +import * as _3 from './CoconutDkg.client'; +import * as _4 from './Mixnet.types'; +import * as _5 from './Mixnet.client'; +import * as _6 from './Cw3FlexMultisig.types'; +import * as _7 from './Cw3FlexMultisig.client'; +import * as _8 from './Cw4Group.types'; +import * as _9 from './Cw4Group.client'; +import * as _10 from './NameService.types'; +import * as _11 from './NameService.client'; +import * as _12 from './ServiceProviderDirectory.types'; +import * as _13 from './ServiceProviderDirectory.client'; +import * as _14 from './Vesting.types'; +import * as _15 from './Vesting.client'; +export * from './types'; + +/** @namespace */ +export namespace contracts { + export const CoconutBandwidth = { ..._0, ..._1 }; + export const CoconutDkg = { ..._2, ..._3 }; + export const Mixnet = { ..._4, ..._5 }; + export const Cw3FlexMultisig = { ..._6, ..._7 }; + export const Cw4Group = { ..._8, ..._9 }; + export const NameService = { ..._10, ..._11 }; + export const ServiceProviderDirectory = { ..._12, ..._13 }; + export const Vesting = { ..._14, ..._15 }; +} diff --git a/sdk/typescript/codegen/contract-clients/src/types.ts b/sdk/typescript/codegen/contract-clients/src/types.ts new file mode 100644 index 0000000000..aa28f581b1 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/src/types.ts @@ -0,0 +1,4 @@ +export interface GetCw2ContractVersionResponse { + contract: String, + version: String, +} diff --git a/sdk/typescript/codegen/contract-clients/tsconfig.json b/sdk/typescript/codegen/contract-clients/tsconfig.json new file mode 100644 index 0000000000..c130f483b6 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/tsconfig.json @@ -0,0 +1,41 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "lib": [ + "es2021", + "dom", + "dom.iterable", + "esnext", + ], + "outDir": "./dist/", + "module": "esnext", + "target": "esnext", + "allowJs": false, + "strict": true, + "moduleResolution": "node", + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "declaration": true, + "baseUrl": "." + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "jest.config.js", + "webpack.config.js", + "webpack.prod.js", + "webpack.common.js", + "node_modules", + "**/node_modules", + "dist", + "**/dist", + "scripts", + "jest", + "__tests__", + "**/__tests__", + "__jest__", + "**/__jest__", + "config/*", + ] +} diff --git a/sdk/typescript/codegen/contract-clients/typedoc.json b/sdk/typescript/codegen/contract-clients/typedoc.json new file mode 100644 index 0000000000..fee2209163 --- /dev/null +++ b/sdk/typescript/codegen/contract-clients/typedoc.json @@ -0,0 +1,31 @@ +{ + "sort": ["kind"], + "entryPoints": ["./src/*.ts"], + "out": "./docs", + "kindSortOrder": [ + "Function", + "Interface", + "TypeAlias", + "Reference", + "Project", + "Module", + "Namespace", + "Enum", + "EnumMember", + "Class", + "Constructor", + "Property", + "Variable", + "Accessor", + "Method", + "ObjectLiteral", + "Parameter", + "TypeParameter", + "TypeLiteral", + "CallSignature", + "ConstructorSignature", + "IndexSignature", + "GetSignature", + "SetSignature" + ] +} From f7974c5db80dcaec59c8cc0bcf241f6080f947b0 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:13:46 +0200 Subject: [PATCH 30/47] rpc-node: link correction --- documentation/docs/src/nyx/rpc-node.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/docs/src/nyx/rpc-node.md b/documentation/docs/src/nyx/rpc-node.md index dc48d68409..352b689bed 100644 --- a/documentation/docs/src/nyx/rpc-node.md +++ b/documentation/docs/src/nyx/rpc-node.md @@ -4,6 +4,6 @@ RPC Nodes (which might otherwise be referred to as 'Lite Nodes' or just 'Full No You may want to set up an RPC Node for querying the blockchain, or in order to have an endpoint that your app can use to send transactions. -In order to set up an RPC Node, simply follow the instructions to set up a [Validator](https://nymtech.net/operators/nodes/validator-setup.md), but **exclude the `nyxd tx staking create-validator` command**. +In order to set up an RPC Node, simply follow the instructions to set up a [Validator](https://nymtech.net/operators/nodes/validator-setup.html), but **exclude the `nyxd tx staking create-validator` command**. -If you want to fast-sync your node, check out the Polkachu snapshot and their other [resources](https://polkachu.com/seeds/nym). \ No newline at end of file +If you want to fast-sync your node, check out the Polkachu snapshot and their other [resources](https://polkachu.com/seeds/nym). From b4ccd16d8b76bac192b1c01aac7baf35cd658f02 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:14:32 +0200 Subject: [PATCH 31/47] ledger-live: link correction --- documentation/docs/src/nyx/ledger-live.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/src/nyx/ledger-live.md b/documentation/docs/src/nyx/ledger-live.md index 031834fa24..968dd2e25b 100644 --- a/documentation/docs/src/nyx/ledger-live.md +++ b/documentation/docs/src/nyx/ledger-live.md @@ -4,7 +4,7 @@ Use the following instructions to interact with the Nyx blockchain - either with ## Prerequisites * Download and install [Ledger Live](https://www.ledger.com/ledger-live). -* Compile the `nyxd` binary as per the instructions [here](https://nymtech.net/operators/nodes/validator-setup.md#building-the-nym-validator). Stop after you can successfully run `nyxd` and get the helptext in your console output. +* Compile the `nyxd` binary as per the instructions [here](https://nymtech.net/operators/nodes/validator-setup.html#building-the-nym-validator). Stop after you can successfully run `nyxd` and get the helptext in your console output. ## Prepare your Ledger App * Plug in your Ledger device From e8f99cfdbe7d6fe33f6214b23703ab8e38aa590c Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:26:04 +0200 Subject: [PATCH 32/47] websocket-client: link correction --- documentation/docs/src/clients/websocket-client.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/src/clients/websocket-client.md b/documentation/docs/src/clients/websocket-client.md index f0980ad9ae..103112d63e 100644 --- a/documentation/docs/src/clients/websocket-client.md +++ b/documentation/docs/src/clients/websocket-client.md @@ -122,7 +122,7 @@ All of these code examples will do the following: By varying the message content, you can easily build sophisticated service provider apps. For example, instead of printing the response received from the mixnet, your service provider might take some action on behalf of the user - perhaps initiating a network request, a blockchain transaction, or writing to a local data store. -> You can find an example of building both frontend and service provider code with the websocket client in the [Simple Service Provider Tutorial](https://nymtech.net/developers/tutorials/simple-service-provider.html) in the Developer Portal. +> You can find an example of building both frontend and service provider code with the websocket client in the [Simple Service Provider Tutorial](https://nymtech.net/developers/tutorials/simple-service-provider/simple-service-provider.html) in the Developer Portal. ### Message Types There are a small number of messages that your application sends up the websocket to interact with the native client, as follows. From e7929d6f6b664747bf1219cd7b96e5eddcfd2c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Thu, 7 Sep 2023 13:30:04 +0100 Subject: [PATCH 33/47] Feature/wasm client nodejs (#3769) * wip * post-cherry pick fixes * wip * wip * using sqlite-based indexeddb shim * running nymClient in worker thread * improved received handling * building node mix-fetch * fixed mix fetch request constructor if args[1] == undefined * fixed build target * nodejs origin bypass * mix fetch in node but I dont think anyone should use it over normal client... * target locking * fixed post-rebasing issues --- Cargo.lock | 5 +- Cargo.toml | 2 +- common/client-core/src/init/mod.rs | 3 + .../client-libs/gateway-client/src/client.rs | 4 +- common/wasm/client-core/src/lib.rs | 7 +- common/wasm/utils/Cargo.toml | 3 +- nym-connect/desktop/Cargo.lock | 5 +- wasm/client/Makefile | 4 + wasm/client/internal-dev-node/.gitignore | 1 + wasm/client/internal-dev-node/package.json | 16 + wasm/client/internal-dev-node/src/index.mjs | 105 ++ wasm/client/internal-dev-node/src/worker.mjs | 88 + wasm/client/internal-dev-node/yarn.lock | 899 ++++++++++ wasm/client/src/lib.rs | 9 +- wasm/mix-fetch/Makefile | 15 + wasm/mix-fetch/build-node.mjs | 12 + wasm/mix-fetch/go-mix-conn/Makefile | 8 +- .../internal/bridge/go_bridge/go_bridge.go | 13 +- .../internal/jstypes/conv/request.go | 3 +- .../go-mix-conn/internal/jstypes/globals.go | 13 +- .../go-mix-conn/internal/mixfetch/mixfetch.go | 2 +- wasm/mix-fetch/internal-dev-node/.gitignore | 1 + .../internal-dev-node/package-lock.json | 1567 +++++++++++++++++ wasm/mix-fetch/internal-dev-node/package.json | 17 + .../mix-fetch/internal-dev-node/src/index.mjs | 98 ++ .../internal-dev-node/src/polyfill.mjs | 59 + .../internal-dev-node/src/worker.mjs | 117 ++ wasm/mix-fetch/internal-dev-node/yarn.lock | 938 ++++++++++ wasm/mix-fetch/src/lib.rs | 20 +- wasm/node-tester/src/lib.rs | 4 - 30 files changed, 3988 insertions(+), 50 deletions(-) create mode 100644 wasm/client/internal-dev-node/.gitignore create mode 100644 wasm/client/internal-dev-node/package.json create mode 100644 wasm/client/internal-dev-node/src/index.mjs create mode 100644 wasm/client/internal-dev-node/src/worker.mjs create mode 100644 wasm/client/internal-dev-node/yarn.lock create mode 100644 wasm/mix-fetch/build-node.mjs create mode 100644 wasm/mix-fetch/internal-dev-node/.gitignore create mode 100644 wasm/mix-fetch/internal-dev-node/package-lock.json create mode 100644 wasm/mix-fetch/internal-dev-node/package.json create mode 100644 wasm/mix-fetch/internal-dev-node/src/index.mjs create mode 100644 wasm/mix-fetch/internal-dev-node/src/polyfill.mjs create mode 100644 wasm/mix-fetch/internal-dev-node/src/worker.mjs create mode 100644 wasm/mix-fetch/internal-dev-node/yarn.lock diff --git a/Cargo.lock b/Cargo.lock index 916cbf68bf..d99d5fbbd7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3482,14 +3482,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "gloo-net" -version = "0.2.6" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9902a044653b26b99f7e3693a42f171312d9be8b26b5697bd1e43ad1f8a35e10" +checksum = "a66b4e3c7d9ed8d315fd6b97c8b1f74a7c6ecbbc2320e65ae7ed38b7068cc620" dependencies = [ "futures-channel", "futures-core", "futures-sink", "gloo-utils", + "http", "js-sys", "pin-project", "serde", diff --git a/Cargo.toml b/Cargo.toml index 40800e47d7..5099ec2098 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -166,7 +166,7 @@ url = "2.4" zeroize = "1.6.0" # wasm-related dependencies -gloo-utils = "0.1.6" +gloo-utils = "0.1.7" js-sys = "0.3.63" serde-wasm-bindgen = "0.5.0" tsify = "0.4.5" diff --git a/common/client-core/src/init/mod.rs b/common/client-core/src/init/mod.rs index 8e848837ef..1f8e10bcc9 100644 --- a/common/client-core/src/init/mod.rs +++ b/common/client-core/src/init/mod.rs @@ -106,14 +106,17 @@ pub enum GatewaySetup { /// Should the new gateway be selected based on latency. by_latency: bool, }, + Specified { /// Identity key of the gateway we want to try to use. gateway_identity: IdentityKey, }, + Predefined { /// Full gateway configuration details: PersistedGatewayDetails, }, + ReuseConnection { /// The authenticated ephemeral client that was created during `init` authenticated_ephemeral_client: GatewayClient, diff --git a/common/client-libs/gateway-client/src/client.rs b/common/client-libs/gateway-client/src/client.rs index 31cafe37de..3cd75b1b5f 100644 --- a/common/client-libs/gateway-client/src/client.rs +++ b/common/client-libs/gateway-client/src/client.rs @@ -175,7 +175,9 @@ impl GatewayClient { pub async fn establish_connection(&mut self) -> Result<(), GatewayClientError> { let ws_stream = match JSWebsocket::new(&self.gateway_address) { Ok(ws_stream) => ws_stream, - Err(e) => return Err(GatewayClientError::NetworkErrorWasm(e)), + Err(e) => { + return Err(GatewayClientError::NetworkErrorWasm(e)); + } }; self.connection = SocketState::Available(Box::new(ws_stream)); diff --git a/common/wasm/client-core/src/lib.rs b/common/wasm/client-core/src/lib.rs index 3ca34fd2a1..95ce12ad3c 100644 --- a/common/wasm/client-core/src/lib.rs +++ b/common/wasm/client-core/src/lib.rs @@ -1,19 +1,14 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -// that's so stupid... #[cfg(target_arch = "wasm32")] pub mod config; - #[cfg(target_arch = "wasm32")] pub mod error; - #[cfg(target_arch = "wasm32")] pub mod helpers; - #[cfg(target_arch = "wasm32")] pub mod storage; - #[cfg(target_arch = "wasm32")] pub mod topology; @@ -41,8 +36,8 @@ pub use nym_validator_client::client::IdentityKey; #[cfg(target_arch = "wasm32")] use wasm_bindgen::prelude::*; -#[cfg(target_arch = "wasm32")] #[wasm_bindgen] +#[cfg(target_arch = "wasm32")] pub fn set_panic_hook() { // When the `console_error_panic_hook` feature is enabled, we can call the // `set_panic_hook` function at least once during initialization, and then diff --git a/common/wasm/utils/Cargo.toml b/common/wasm/utils/Cargo.toml index 6bffdd7687..ac4d1da56a 100644 --- a/common/wasm/utils/Cargo.toml +++ b/common/wasm/utils/Cargo.toml @@ -13,7 +13,8 @@ wasm-bindgen = { workspace = true } wasm-bindgen-futures = { workspace = true } getrandom = { workspace = true, features=["js"], optional = true } gloo-utils = { workspace = true } -gloo-net = { version = "0.2.6", features = ["websocket"], optional = true } +gloo-net = { version = "0.3.1", features = ["websocket"], optional = true } +#gloo-net = { path = "../../../../gloo/crates/net", features = ["websocket"], optional = true } # we don't want entire tokio-tungstenite, tungstenite itself is just fine - we just want message and error enums [dependencies.tungstenite] diff --git a/nym-connect/desktop/Cargo.lock b/nym-connect/desktop/Cargo.lock index be8401d5c6..9e3096872a 100644 --- a/nym-connect/desktop/Cargo.lock +++ b/nym-connect/desktop/Cargo.lock @@ -2579,14 +2579,15 @@ dependencies = [ [[package]] name = "gloo-net" -version = "0.2.6" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9902a044653b26b99f7e3693a42f171312d9be8b26b5697bd1e43ad1f8a35e10" +checksum = "a66b4e3c7d9ed8d315fd6b97c8b1f74a7c6ecbbc2320e65ae7ed38b7068cc620" dependencies = [ "futures-channel", "futures-core", "futures-sink", "gloo-utils", + "http", "js-sys", "pin-project", "serde", diff --git a/wasm/client/Makefile b/wasm/client/Makefile index 82ae780f15..43a0cf5940 100644 --- a/wasm/client/Makefile +++ b/wasm/client/Makefile @@ -1,3 +1,7 @@ build: wasm-pack build --scope nymproject --target web --out-dir ../../dist/wasm/client wasm-opt -Oz -o ../../dist/wasm/client/nym_client_wasm_bg.wasm ../../dist/wasm/client/nym_client_wasm_bg.wasm + +build-node: + wasm-pack build --scope nymproject --target nodejs --out-dir ../../dist/node/wasm/client + wasm-opt -Oz -o ../../dist/node/wasm/client/nym_client_wasm_bg.wasm ../../dist/node/wasm/client/nym_client_wasm_bg.wasm \ No newline at end of file diff --git a/wasm/client/internal-dev-node/.gitignore b/wasm/client/internal-dev-node/.gitignore new file mode 100644 index 0000000000..6a91a439ea --- /dev/null +++ b/wasm/client/internal-dev-node/.gitignore @@ -0,0 +1 @@ +*.sqlite \ No newline at end of file diff --git a/wasm/client/internal-dev-node/package.json b/wasm/client/internal-dev-node/package.json new file mode 100644 index 0000000000..e845361914 --- /dev/null +++ b/wasm/client/internal-dev-node/package.json @@ -0,0 +1,16 @@ +{ + "name": "internal-dev-node", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node src/index.mjs" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@nymproject/nym-client-wasm": "file:../../../dist/node/wasm/client", + "indexeddbshim": "^13.0.0-pre.1", + "ws": "^8.13.0" + } +} diff --git a/wasm/client/internal-dev-node/src/index.mjs b/wasm/client/internal-dev-node/src/index.mjs new file mode 100644 index 0000000000..b9c5bfbe47 --- /dev/null +++ b/wasm/client/internal-dev-node/src/index.mjs @@ -0,0 +1,105 @@ +import {Worker} from 'worker_threads'; + +function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} + +class NodeWorkerClient { + worker = null; + clientInitialised = false; + selfAddress = null + + constructor() { + this.worker = new Worker('./src/worker.mjs'); + + this.worker.on("message", message => { + this.handleMessage(message) + }); + + this.worker.on("error", error => { + console.log(error); + }); + + this.worker.on("exit", exitCode => { + console.log(`It exited with code ${exitCode}`); + }) + + } + + initWasmClient = () => { + this.worker.postMessage({kind: 'initRequest', data: {}}) + } + + sendMessage = (message, recipient) => { + this.worker.postMessage({kind: 'sendRequest', data: {message, recipient}}) + } + + handleReceived = (message, senderTag) => { + console.log(`received raw message: ${message}`) + console.log(`with senderTag: ${senderTag}`) + + let decoded = new TextDecoder().decode(message); + console.log(`decoded message: "${decoded}"`) + } + + handleMessage = (message) => { + console.log(`handling "${message.kind}"`) + switch (message.kind) { + case 'initResponse': + this.clientInitialised = message.data.done; + this.selfAddress = message.data.clientAddress + break; + case 'receivedMessage': + this.handleReceived(message.data.message, message.data.senderTag) + break; + default: + console.log("UNKOWN MESSAGE") + break; + } + } + + // hehe, that's so disgusting, but I don't want to spend ages in the JS callback hell + // because that's not the point of this example + waitForWasmClient = async () => { + let start = new Date(); + let pollingRate = 100; + let maxWaitSecs = 5; + while (!this.clientInitialised) { + let now = new Date(); + let diff = (now.getTime() - start.getTime()) / 1000; + if (diff > maxWaitSecs) { + return Promise.reject(new Error('failed to initialise wasm client')) + } + await sleep(pollingRate) + } + } +} + + +async function main() { + let client = new NodeWorkerClient() + client.initWasmClient() + await client.waitForWasmClient() + + let ourAddress = client.selfAddress + console.log("main thread address: ", ourAddress) + + let message = "hello world" + let uint8Array = new TextEncoder().encode(message); + console.log(`sending "${message}" to ourselves...`) + client.sendMessage(uint8Array, ourAddress) +} + +await main() + +process.on('SIGTERM', signal => { + console.log(`Process ${process.pid} received a SIGTERM signal`) + process.exit(0) +}) + +process.on('SIGINT', signal => { + console.log(`Process ${process.pid} has been interrupted`) + process.exit(0) +}) \ No newline at end of file diff --git a/wasm/client/internal-dev-node/src/worker.mjs b/wasm/client/internal-dev-node/src/worker.mjs new file mode 100644 index 0000000000..d4afd1396a --- /dev/null +++ b/wasm/client/internal-dev-node/src/worker.mjs @@ -0,0 +1,88 @@ +import {parentPort} from 'worker_threads'; +import setGlobalVars from 'indexeddbshim'; +import WebSocket from 'ws'; +import {NymClient, set_panic_hook} from '@nymproject/nym-client-wasm'; + +// polyfill setup +const globalVar = + typeof window !== "undefined" + ? window + : typeof WorkerGlobalScope !== "undefined" + ? self + : typeof global !== "undefined" + ? global + : Function("return this;")(); + +// checkOrigin:false is required to avoid SecurityError Cannot open +// an IndexedDB database from an opaque origin. +setGlobalVars(globalVar, {checkOrigin: false}) +globalVar.WebSocket = WebSocket + +let initDone = false +let nymClient = null +let clientAddress = null + +parentPort.on('message', async message => { + await handleMessage(message) +}); + +function onReceived(message, senderTag) { + parentPort.postMessage({kind: 'receivedMessage', data: {message, senderTag}}); +} + +async function handleMessage(message) { + console.log(`handling "${message.kind}"`) + switch (message.kind) { + case 'initRequest': + await initialiseWasmClient() + break; + case 'sendRequest': + await handleSendRequest(message.data.message, message.data.recipient); + break; + default: + console.log("UNKOWN MESSAGE") + break; + } +} + +async function handleSendRequest(message, recipient) { + await nymClient.send_regular_message(message, recipient) +} + +async function nativeSetup(onMessageHandler) { + const validator = 'https://validator.nymtech.net/api/'; + + const noCoverTrafficOverride = { + traffic: {disableMainPoissonPacketDistribution: true}, + coverTraffic: {disableLoopCoverTrafficStream: true}, + } + + return new NymClient(onMessageHandler, { + storagePassphrase: "foomp", + nymApiUrl: validator, + clientId: "my-client", + clientOverride: noCoverTrafficOverride + }) +} + + +function finishInit() { + initDone = true + parentPort.postMessage({kind: 'initResponse', data: {done: initDone, clientAddress}}) +} + +async function initialiseWasmClient() { + if (initDone) { + return finishInit() + } + + // sets up better stack traces in case of in-rust panics + set_panic_hook(); + + console.log('Instantiating WASM client...'); + nymClient = await nativeSetup(onReceived) + clientAddress = nymClient.self_address() + console.log('WASM client running!'); + + finishInit() +} diff --git a/wasm/client/internal-dev-node/yarn.lock b/wasm/client/internal-dev-node/yarn.lock new file mode 100644 index 0000000000..3932b9c4b2 --- /dev/null +++ b/wasm/client/internal-dev-node/yarn.lock @@ -0,0 +1,899 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@mapbox/node-pre-gyp@^1.0.0": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@nymproject/nym-client-wasm@file:../../../dist/node/wasm/client": + version "1.2.0-rc.2" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +argsarray@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/argsarray/-/argsarray-0.0.1.tgz#6e7207b4ecdb39b0af88303fa5ae22bda8df61cb" + integrity sha512-u96dg2GcAKtpTrBdDoFIM7PjcBA+6rSP0OR94MOReNRyUECL6MtQt5XXmRr4qrftYaef9+l5hcpO5te7sML1Cg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-arraybuffer-es6@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/base64-arraybuffer-es6/-/base64-arraybuffer-es6-3.0.1.tgz#2ad032cc4e378de6bbd7aa1b29f695b277dc4474" + integrity sha512-bOxevePlYA8Kba1xVnrQSoktrt12UkP6Jhl2wO+GCGbKAkF4fpDxyg7xRFffZYC0kP2RgMPOSRbzmdHReWnMyg== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +canvas@^2.11.2: + version "2.11.2" + resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.11.2.tgz#553d87b1e0228c7ac0fc72887c3adbac4abbd860" + integrity sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + nan "^2.17.0" + simple-get "^3.0.3" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +color-support@^1.1.2, color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +debug@4, debug@^4.3.3: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +detect-libc@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +eventtargeter@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/eventtargeter/-/eventtargeter-0.9.0.tgz#2c8b873dce173a831779e5f9f5a07facda61e7cd" + integrity sha512-40f2UpTpS7v2GnXWsMpEUkKoMOlgTDrijhCx4Hq7zvsBhLihA7dn0Ayicb4FO/MOIzD5mLHsLK7/NYqx39LqaA== + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +http-cache-semantics@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +immediate@^3.2.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexeddbshim@^13.0.0-pre.1: + version "13.0.0-pre.1" + resolved "https://registry.yarnpkg.com/indexeddbshim/-/indexeddbshim-13.0.0-pre.1.tgz#445a1ee71f57f6d8b20ada214e197b3e2a55582b" + integrity sha512-Tl0FAiQvp0zdTiWZf267d6MN0cFk64z8oa39zpexIkX3Nk/AY5iYhPqvpQcGOxXJWdY/IWOyZFZb4K2qhRtxng== + dependencies: + canvas "^2.11.2" + eventtargeter "0.9.0" + sync-promise-expanded "^1.0.0" + typeson "9.0.2" + typeson-registry "7.2.1" + websql-configurable "^3.0.3" + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nan@^2.17.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +negotiator@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +node-addon-api@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + +node-fetch@^2.6.7: + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + dependencies: + whatwg-url "^5.0.0" + +node-gyp@8.x: + version "8.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +noop-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/noop-fn/-/noop-fn-1.0.0.tgz#5f33d47f13d2150df93e0cb036699e982f78ffbf" + integrity sha512-pQ8vODlgXt2e7A3mIbFDlizkr46r75V+BJxVAyat8Jl7YmI513gG5cfyRL0FedKraoZ+VAouI1h4/IWpus5pcQ== + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +once@^1.3.0, once@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +punycode@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^6.0.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +signal-exit@^3.0.0, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" + integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +sqlite3@^5.0.2: + version "5.1.6" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.6.tgz#1d4fbc90fe4fbd51e952e0a90fd8f6c2b9098e97" + integrity sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + node-addon-api "^4.2.0" + tar "^6.1.11" + optionalDependencies: + node-gyp "8.x" + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +sync-promise-expanded@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sync-promise-expanded/-/sync-promise-expanded-1.0.0.tgz#cbf23f2929124a6cf174979601ef8bf97ed87587" + integrity sha512-pdxxEOaeKO6LghTz0Fe7yw82fx95gtS0SxVgRvIwvN4h9qTie8oOF/pWuH8PGp+PVduS84RXXxO/xrW93Nno9w== + +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +tiny-queue@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz#25a67f2c6e253b2ca941977b5ef7442ef97a6046" + integrity sha512-EijGsv7kzd9I9g0ByCl6h42BWNGUZrlCSejfrb3AKeHC33SGbASu1VDf5O3rRiiUOhAC9CHdZxFPbZu0HmR70A== + +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== + dependencies: + punycode "^2.3.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +typeson-registry@7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/typeson-registry/-/typeson-registry-7.2.1.tgz#2132c7186afceb40bb34250ef7f9337a58bfe96e" + integrity sha512-6KBjzf4kK045pPPA6UqC1O3JKhFM4+O9YZf4AtcBX7v/8m8AG1bB3UIJN05PRY9U3E7P7/4Gc4MjPrqwvGq2wQ== + dependencies: + base64-arraybuffer-es6 "^3.0.0" + typeson "^9.0.2" + whatwg-url "^12.0.1" + +typeson@9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/typeson/-/typeson-9.0.2.tgz#57a9fb6d23976da7048d7d6d665041d72e434e51" + integrity sha512-83w1JVRVt22Kj2bIBo4DyhWYh4RKzbuBW5g89ETlPJOv0+LLX4/hANstDr76srTzULePKSl7DqDAtqHADJOwvQ== + +typeson@^9.0.2: + version "9.0.3" + resolved "https://registry.yarnpkg.com/typeson/-/typeson-9.0.3.tgz#50b2edac0a95c473b7712d5140f622012aa6e163" + integrity sha512-vsOn+VPbIYI3jgj96vwIhAO0BNmlBxEgBKVmuzl1dwXzQe+3XjRi/gK2zYgAansWYlrtvluy4lvWcL8LF01P3Q== + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +websql-configurable@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/websql-configurable/-/websql-configurable-3.0.3.tgz#425bf4a690ef7160d47711caf7531c2183f7d050" + integrity sha512-Fs+3A2BjI3ukkGtvsZcPS4nGoFE0aqors8YKWgICoOt7dcfdeaTdgoMOoFqlEPHc9u/TS9BEFhKP/A9GttB0CQ== + dependencies: + argsarray "^0.0.1" + immediate "^3.2.2" + noop-fn "^1.0.0" + tiny-queue "^0.2.1" + optionalDependencies: + sqlite3 "^5.0.2" + +whatwg-url@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-12.0.1.tgz#fd7bcc71192e7c3a2a97b9a8d6b094853ed8773c" + integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.2, wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/wasm/client/src/lib.rs b/wasm/client/src/lib.rs index a04440410d..aed1179aaa 100644 --- a/wasm/client/src/lib.rs +++ b/wasm/client/src/lib.rs @@ -3,21 +3,16 @@ #[cfg(target_arch = "wasm32")] pub mod client; - #[cfg(target_arch = "wasm32")] pub mod config; - +#[cfg(target_arch = "wasm32")] +pub mod encoded_payload_helper; #[cfg(target_arch = "wasm32")] pub mod error; - #[cfg(target_arch = "wasm32")] mod helpers; - #[cfg(target_arch = "wasm32")] mod response_pusher; #[cfg(target_arch = "wasm32")] pub use wasm_client_core::set_panic_hook; - -#[cfg(target_arch = "wasm32")] -pub mod encoded_payload_helper; diff --git a/wasm/mix-fetch/Makefile b/wasm/mix-fetch/Makefile index 3b4568cdb3..776d6d35bb 100644 --- a/wasm/mix-fetch/Makefile +++ b/wasm/mix-fetch/Makefile @@ -22,3 +22,18 @@ check-fmt-rust: cargo fmt --check cargo clippy --target wasm32-unknown-unknown -- -Dwarnings +###### NODEJS + +build-rust-node: + wasm-pack build --scope nymproject --target nodejs --out-dir ../../dist/node/wasm/mix-fetch + wasm-opt -Oz -o ../../dist/node/wasm/mix-fetch/mix_fetch_wasm_bg.wasm ../../dist/node/wasm/mix-fetch/mix_fetch_wasm_bg.wasm + +build-package-json-node: + node build-node.mjs + +copy-go-conn: + mkdir -p ../../dist/node/wasm/mix-fetch + cp ../../dist/wasm/mix-fetch/go_conn.wasm ../../dist/node/wasm/mix-fetch/go_conn.wasm + cp ../../dist/wasm/mix-fetch/wasm_exec.js ../../dist/node/wasm/mix-fetch/wasm_exec.js + +build-node: build-go-opt copy-go-conn build-rust-node build-package-json-node \ No newline at end of file diff --git a/wasm/mix-fetch/build-node.mjs b/wasm/mix-fetch/build-node.mjs new file mode 100644 index 0000000000..3782ce7941 --- /dev/null +++ b/wasm/mix-fetch/build-node.mjs @@ -0,0 +1,12 @@ +import fs from 'fs'; + +const packageJson = JSON.parse(fs.readFileSync('../../dist/node/wasm/mix-fetch/package.json').toString()); + +if (!packageJson.files.includes('go_conn.wasm')) { + packageJson.files.push('go_conn.wasm'); +} +if (!packageJson.files.includes('wasm_exec.js')) { + packageJson.files.push('wasm_exec.js'); +} + +fs.writeFileSync('../../dist/node/wasm/mix-fetch/package.json', JSON.stringify(packageJson, null, 2)); \ No newline at end of file diff --git a/wasm/mix-fetch/go-mix-conn/Makefile b/wasm/mix-fetch/go-mix-conn/Makefile index f03be299e4..462cb68126 100644 --- a/wasm/mix-fetch/go-mix-conn/Makefile +++ b/wasm/mix-fetch/go-mix-conn/Makefile @@ -10,11 +10,15 @@ ifndef $(TINYGOROOT) endif build-go: - GOOS=js GOARCH=wasm go build -o ../../../dist/wasm/mix-fetch/go_conn.wasm ./cmd/wasm && cp "$(GOROOT)/misc/wasm/wasm_exec.js" ../../../dist/wasm/mix-fetch + GOOS=js GOARCH=wasm go build -o ../../../dist/wasm/mix-fetch/go_conn.wasm ./cmd/wasm + cp "$(GOROOT)/misc/wasm/wasm_exec.js" ../../../dist/wasm/mix-fetch + build-go-opt: # use the -s and -w linker flags to strip the debugging information - GOOS=js GOARCH=wasm go build -ldflags="-s -w" -o ../../../dist/wasm/mix-fetch/go_conn.wasm ./cmd/wasm && cp "$(GOROOT)/misc/wasm/wasm_exec.js" ../../../dist/wasm/mix-fetch + GOOS=js GOARCH=wasm go build -ldflags="-s -w" -o ../../../dist/wasm/mix-fetch/go_conn.wasm ./cmd/wasm + cp "$(GOROOT)/misc/wasm/wasm_exec.js" ../../../dist/wasm/mix-fetch + # run wasm-opt to gain few more kb wasm-opt --enable-bulk-memory -Oz ../../../dist/wasm/mix-fetch/go_conn.wasm -o ../../../dist/wasm/mix-fetch/go_conn.wasm # finally compress it (... or not?) diff --git a/wasm/mix-fetch/go-mix-conn/internal/bridge/go_bridge/go_bridge.go b/wasm/mix-fetch/go-mix-conn/internal/bridge/go_bridge/go_bridge.go index 234c4cf0e1..e44c8cb9d7 100644 --- a/wasm/mix-fetch/go-mix-conn/internal/bridge/go_bridge/go_bridge.go +++ b/wasm/mix-fetch/go-mix-conn/internal/bridge/go_bridge/go_bridge.go @@ -71,12 +71,15 @@ func mixFetch(_ js.Value, args []js.Value) (any, error) { jsRequest = requestConstructor.New(args[0]) } if len(args) == 2 { - // check for 'MODE_UNSAFE_IGNORE_CORS' - if args[1].Get("mode").String() == jstypes.ModeUnsafeIgnoreCors { - unsafeCors = true - // we need to delete that prop as technically it holds an invalid value to construct `Request` - args[1].Delete("mode") + if !args[1].IsUndefined() && !args[1].IsNull() { + // check for 'MODE_UNSAFE_IGNORE_CORS' + if args[1].Get("mode").String() == jstypes.ModeUnsafeIgnoreCors { + unsafeCors = true + // we need to delete that prop as technically it holds an invalid value to construct `Request` + args[1].Delete("mode") + } } + jsRequest = requestConstructor.New(args[0], args[1]) } diff --git a/wasm/mix-fetch/go-mix-conn/internal/jstypes/conv/request.go b/wasm/mix-fetch/go-mix-conn/internal/jstypes/conv/request.go index b729805b01..27621e83ae 100644 --- a/wasm/mix-fetch/go-mix-conn/internal/jstypes/conv/request.go +++ b/wasm/mix-fetch/go-mix-conn/internal/jstypes/conv/request.go @@ -194,7 +194,8 @@ func parseHeaders(headers js.Value, reqOpts types.RequestOptions, method string) // add additional headers // 3.1.1 - serializedOrigin := &jstypes.Origin + origin := jstypes.Origin() + serializedOrigin := &origin // Reference: https://fetch.spec.whatwg.org/#origin-header // TODO: 3.1.2: check response tainting // 3.1.3 diff --git a/wasm/mix-fetch/go-mix-conn/internal/jstypes/globals.go b/wasm/mix-fetch/go-mix-conn/internal/jstypes/globals.go index 55a18a0792..51dda48c8e 100644 --- a/wasm/mix-fetch/go-mix-conn/internal/jstypes/globals.go +++ b/wasm/mix-fetch/go-mix-conn/internal/jstypes/globals.go @@ -14,15 +14,24 @@ var ( Promise = js.Global().Get("Promise") Reflect = js.Global().Get("Reflect") Object = js.Global().Get("Object") - Origin = js.Global().Get("location").Get("origin").String() Response = js.Global().Get("Response") Request = js.Global().Get("Request") Proxy = js.Global().Get("Proxy") Headers = js.Global().Get("Headers") ) +func Origin() string { + // nodejs doesn't have origin + location := js.Global().Get("location") + if !location.IsUndefined() && !location.IsNull() { + return location.Get("origin").String() + } else { + return "" + } +} + func OriginUrl() *url.URL { - originUrl, originErr := url.Parse(Origin) + originUrl, originErr := url.Parse(Origin()) if originErr != nil { panic(fmt.Sprintf("could not obtain origin: %s", originErr)) } diff --git a/wasm/mix-fetch/go-mix-conn/internal/mixfetch/mixfetch.go b/wasm/mix-fetch/go-mix-conn/internal/mixfetch/mixfetch.go index 8e2e7e0586..3dbc4c077f 100644 --- a/wasm/mix-fetch/go-mix-conn/internal/mixfetch/mixfetch.go +++ b/wasm/mix-fetch/go-mix-conn/internal/mixfetch/mixfetch.go @@ -241,7 +241,7 @@ func doCorsCheck(reqOpts *types.RequestOptions, resp *http.Response) error { // 4.9.4 // TODO: presumably this needs to better account for the wildcard? - if jstypes.Origin != originHeader { + if jstypes.Origin() != originHeader { return errors.New(fmt.Sprintf("\"%s\" does not match the origin \"%s\" on \"%s\" remote header", jstypes.Origin, originHeader, jstypes.HeaderAllowOrigin)) } diff --git a/wasm/mix-fetch/internal-dev-node/.gitignore b/wasm/mix-fetch/internal-dev-node/.gitignore new file mode 100644 index 0000000000..6a91a439ea --- /dev/null +++ b/wasm/mix-fetch/internal-dev-node/.gitignore @@ -0,0 +1 @@ +*.sqlite \ No newline at end of file diff --git a/wasm/mix-fetch/internal-dev-node/package-lock.json b/wasm/mix-fetch/internal-dev-node/package-lock.json new file mode 100644 index 0000000000..51943d47e5 --- /dev/null +++ b/wasm/mix-fetch/internal-dev-node/package-lock.json @@ -0,0 +1,1567 @@ +{ + "name": "internal-dev-node", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "internal-dev-node", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@nymproject/mix-fetch-wasm": "file:../../../dist/node/wasm/mix-fetch", + "indexeddbshim": "^13.0.0-pre.1", + "node-fetch": "^3.3.2", + "ws": "^8.13.0" + } + }, + "../../../dist/node/wasm/mix-fetch": { + "name": "@nymproject/mix-fetch-wasm", + "version": "1.2.0-rc.2", + "license": "Apache-2.0" + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "license": "MIT", + "optional": true + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "license": "MIT", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nymproject/mix-fetch-wasm": { + "resolved": "../../../dist/node/wasm/mix-fetch", + "link": true + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "license": "MIT", + "optional": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "optional": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argsarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/argsarray/-/argsarray-0.0.1.tgz", + "integrity": "sha512-u96dg2GcAKtpTrBdDoFIM7PjcBA+6rSP0OR94MOReNRyUECL6MtQt5XXmRr4qrftYaef9+l5hcpO5te7sML1Cg==", + "license": "WTFPL" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-arraybuffer-es6": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64-arraybuffer-es6/-/base64-arraybuffer-es6-3.0.1.tgz", + "integrity": "sha512-bOxevePlYA8Kba1xVnrQSoktrt12UkP6Jhl2wO+GCGbKAkF4fpDxyg7xRFffZYC0kP2RgMPOSRbzmdHReWnMyg==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "license": "MIT", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "license": "MIT", + "optional": true + }, + "node_modules/eventtargeter": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/eventtargeter/-/eventtargeter-0.9.0.tgz", + "integrity": "sha512-40f2UpTpS7v2GnXWsMpEUkKoMOlgTDrijhCx4Hq7zvsBhLihA7dn0Ayicb4FO/MOIzD5mLHsLK7/NYqx39LqaA==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC", + "optional": true + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/humanize-ms/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT", + "optional": true + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "license": "MIT" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/indexeddbshim": { + "version": "13.0.0-pre.1", + "resolved": "https://registry.npmjs.org/indexeddbshim/-/indexeddbshim-13.0.0-pre.1.tgz", + "integrity": "sha512-Tl0FAiQvp0zdTiWZf267d6MN0cFk64z8oa39zpexIkX3Nk/AY5iYhPqvpQcGOxXJWdY/IWOyZFZb4K2qhRtxng==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "canvas": "^2.11.2", + "eventtargeter": "0.9.0", + "sync-promise-expanded": "^1.0.0", + "typeson": "9.0.2", + "typeson-registry": "7.2.1", + "websql-configurable": "^3.0.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "license": "ISC", + "optional": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "license": "MIT", + "optional": true + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "license": "MIT", + "optional": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC", + "optional": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "license": "ISC", + "optional": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "license": "MIT", + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "license": "MIT", + "optional": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "license": "MIT", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "license": "ISC", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "license": "ISC", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "license": "ISC", + "optional": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/noop-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/noop-fn/-/noop-fn-1.0.0.tgz", + "integrity": "sha512-pQ8vODlgXt2e7A3mIbFDlizkr46r75V+BJxVAyat8Jl7YmI513gG5cfyRL0FedKraoZ+VAouI1h4/IWpus5pcQ==", + "license": "MIT" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "license": "ISC", + "optional": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "license": "MIT", + "optional": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT", + "optional": true + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "license": "MIT", + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sqlite3": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", + "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^4.2.0", + "tar": "^6.1.11" + }, + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sync-promise-expanded": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sync-promise-expanded/-/sync-promise-expanded-1.0.0.tgz", + "integrity": "sha512-pdxxEOaeKO6LghTz0Fe7yw82fx95gtS0SxVgRvIwvN4h9qTie8oOF/pWuH8PGp+PVduS84RXXxO/xrW93Nno9w==", + "license": "ISC", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tiny-queue": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-queue/-/tiny-queue-0.2.1.tgz", + "integrity": "sha512-EijGsv7kzd9I9g0ByCl6h42BWNGUZrlCSejfrb3AKeHC33SGbASu1VDf5O3rRiiUOhAC9CHdZxFPbZu0HmR70A==", + "license": "Apache 2" + }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/typeson": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/typeson/-/typeson-9.0.2.tgz", + "integrity": "sha512-83w1JVRVt22Kj2bIBo4DyhWYh4RKzbuBW5g89ETlPJOv0+LLX4/hANstDr76srTzULePKSl7DqDAtqHADJOwvQ==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/typeson-registry": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/typeson-registry/-/typeson-registry-7.2.1.tgz", + "integrity": "sha512-6KBjzf4kK045pPPA6UqC1O3JKhFM4+O9YZf4AtcBX7v/8m8AG1bB3UIJN05PRY9U3E7P7/4Gc4MjPrqwvGq2wQ==", + "license": "MIT", + "dependencies": { + "base64-arraybuffer-es6": "^3.0.0", + "typeson": "^9.0.2", + "whatwg-url": "^12.0.1" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + } + }, + "node_modules/typeson-registry/node_modules/typeson": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/typeson/-/typeson-9.0.3.tgz", + "integrity": "sha512-vsOn+VPbIYI3jgj96vwIhAO0BNmlBxEgBKVmuzl1dwXzQe+3XjRi/gK2zYgAansWYlrtvluy4lvWcL8LF01P3Q==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "license": "ISC", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/websql-configurable": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/websql-configurable/-/websql-configurable-3.0.3.tgz", + "integrity": "sha512-Fs+3A2BjI3ukkGtvsZcPS4nGoFE0aqors8YKWgICoOt7dcfdeaTdgoMOoFqlEPHc9u/TS9BEFhKP/A9GttB0CQ==", + "license": "Apache-2.0", + "dependencies": { + "argsarray": "^0.0.1", + "immediate": "^3.2.2", + "noop-fn": "^1.0.0", + "tiny-queue": "^0.2.1" + }, + "optionalDependencies": { + "sqlite3": "^5.0.2" + } + }, + "node_modules/whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "license": "MIT", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + } + } +} diff --git a/wasm/mix-fetch/internal-dev-node/package.json b/wasm/mix-fetch/internal-dev-node/package.json new file mode 100644 index 0000000000..8b2e67d11a --- /dev/null +++ b/wasm/mix-fetch/internal-dev-node/package.json @@ -0,0 +1,17 @@ +{ + "name": "internal-dev-node", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node src/index.mjs" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@nymproject/mix-fetch-wasm": "file:../../../dist/node/wasm/mix-fetch", + "indexeddbshim": "^13.0.0-pre.1", + "node-fetch": "^3.3.2", + "ws": "^8.13.0" + } +} diff --git a/wasm/mix-fetch/internal-dev-node/src/index.mjs b/wasm/mix-fetch/internal-dev-node/src/index.mjs new file mode 100644 index 0000000000..978645136d --- /dev/null +++ b/wasm/mix-fetch/internal-dev-node/src/index.mjs @@ -0,0 +1,98 @@ +import {Worker} from 'worker_threads'; + +function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} + +class NodeWorkerClient { + worker = null; + clientInitialised = false; + selfAddress = null + + constructor() { + this.worker = new Worker('./src/worker.mjs'); + + this.worker.on("message", message => { + this.handleMessage(message) + }); + + this.worker.on("error", error => { + console.log(error); + }); + + this.worker.on("exit", exitCode => { + console.log(`It exited with code ${exitCode}`); + }) + + } + + initMixFetch = () => { + this.worker.postMessage({kind: 'initRequest', data: {}}) + } + + fetch = (resource, options) => { + this.worker.postMessage({kind: 'fetchRequest', data: {resource, options}}) + } + + handleResponse = (message, senderTag) => { + // console.log(`received raw message: ${message}`) + // console.log(`with senderTag: ${senderTag}`) + // + // let decoded = new TextDecoder().decode(message); + // console.log(`decoded message: "${decoded}"`) + } + + handleMessage = (message) => { + console.log(`handling "${message.kind}"`) + switch (message.kind) { + case 'initResponse': + this.clientInitialised = message.data.done; + break; + case 'receivedResponse': + this.handleResponse(message.data.response) + break; + default: + console.log("UNKOWN MESSAGE") + break; + } + } + + // hehe, that's so disgusting, but I don't want to spend ages in the JS callback hell + // because that's not the point of this example + waitForMixFetch = async () => { + let start = new Date(); + let pollingRate = 100; + let maxWaitSecs = 5; + while (!this.clientInitialised) { + let now = new Date(); + let diff = (now.getTime() - start.getTime()) / 1000; + if (diff > maxWaitSecs) { + return Promise.reject(new Error('failed to initialise mix fetch')) + } + await sleep(pollingRate) + } + } +} + + +async function main() { + let client = new NodeWorkerClient() + client.initMixFetch() + await client.waitForMixFetch() + + await client.fetch("https://nymtech.net", { mode: "unsafe-ignore-cors" }) +} + +await main() + +process.on('SIGTERM', signal => { + console.log(`Process ${process.pid} received a SIGTERM signal`) + process.exit(0) +}) + +process.on('SIGINT', signal => { + console.log(`Process ${process.pid} has been interrupted`) + process.exit(0) +}) \ No newline at end of file diff --git a/wasm/mix-fetch/internal-dev-node/src/polyfill.mjs b/wasm/mix-fetch/internal-dev-node/src/polyfill.mjs new file mode 100644 index 0000000000..4c62b8e7e6 --- /dev/null +++ b/wasm/mix-fetch/internal-dev-node/src/polyfill.mjs @@ -0,0 +1,59 @@ +import crypto from 'node:crypto'; +import fs from 'node:fs'; +import { TextDecoder, TextEncoder } from 'node:util'; +import setGlobalVars from 'indexeddbshim'; +import WebSocket from 'ws'; +import fetch, { + Headers, + Request, + Response, +} from 'node-fetch' + + +if (!globalThis.fs) { + globalThis.fs = fs +} + +if (!globalThis.process) { + globalThis.process = process +} + +if (!globalThis.crypto) { + globalThis.crypto = { + getRandomValues(b) { + crypto.randomFillSync(b); + }, + } +} + +if (!globalThis.performance) { + globalThis.performance = { + now() { + const [sec, nsec] = process.hrtime(); + return sec * 1000 + nsec / 1000000; + }, + }; +} + +if (!globalThis.TextEncoder) { + globalThis.TextEncoder = TextEncoder +} + +if (!globalThis.TextDecoder) { + globalThis.TextDecoder = TextDecoder +} + +if (!globalThis.fetch) { + globalThis.fetch = fetch + globalThis.Headers = Headers + globalThis.Request = Request + globalThis.Response = Response +} + +// checkOrigin:false is required to avoid SecurityError Cannot open +// an IndexedDB database from an opaque origin. +setGlobalVars(globalThis, {checkOrigin: false}) +globalThis.WebSocket = WebSocket + +// has to be loaded after all the polyfill action +import('@nymproject/mix-fetch-wasm/wasm_exec.js') diff --git a/wasm/mix-fetch/internal-dev-node/src/worker.mjs b/wasm/mix-fetch/internal-dev-node/src/worker.mjs new file mode 100644 index 0000000000..95751fec17 --- /dev/null +++ b/wasm/mix-fetch/internal-dev-node/src/worker.mjs @@ -0,0 +1,117 @@ +import {parentPort} from 'worker_threads'; +import {setupMixFetch, set_panic_hook, send_client_data, start_new_mixnet_connection, mix_fetch_initialised, finish_mixnet_connection} from '@nymproject/mix-fetch-wasm'; +import fs from 'node:fs'; +import("./polyfill.mjs") + +// Sorry Mark, but I don't want to deal with bundling hell to get this one work via proper import : ( +let goWasmPath = "../../../dist/node/wasm/mix-fetch/go_conn.wasm" +// import goWasm from '@nymproject/mix-fetch-wasm/go_conn.wasm' + + +function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} + +function setupRsGoBridge() { + // (note: reason for intermediate `__rs_go_bridge__` object is to decrease global scope bloat + // and to discourage users from trying to call those methods directly) + globalThis.__rs_go_bridge__ = {} + globalThis.__rs_go_bridge__.send_client_data = send_client_data + globalThis.__rs_go_bridge__.start_new_mixnet_connection = start_new_mixnet_connection + globalThis.__rs_go_bridge__.mix_fetch_initialised = mix_fetch_initialised + globalThis.__rs_go_bridge__.finish_mixnet_connection = finish_mixnet_connection +} + +async function loadGoWasm() { + // I... don't even want to know. Javascript (and node) works in mysterious ways... + if (!globalThis.Go) { + await sleep(500) + } + + console.log(globalThis.Origin) + + const go = new Go() + const blob = fs.readFileSync(goWasmPath); + const wasmObj = await WebAssembly.instantiate(blob, go.importObject) + const goWasm = wasmObj.instance + go.run(goWasm) +} + +async function logFetchResult(res) { + let text = await res.text() + console.log("HEADERS: ", ...res.headers) + console.log("STATUS: ", res.status) + console.log("STATUS TEXT: ", res.statusText) + console.log("OK: ", res.ok) + console.log("TYPE: ", res.type) + console.log("URL: ", res.url) + console.log("BODYUSED: ", res.bodyUsed) + console.log("REDIRECTED: ", res.redirected) + console.log("TEXT: ", text) +} + + +let initDone = false + +parentPort.on('message', async message => { + await handleMessage(message) +}); + +async function handleMessage(message) { + console.log(`handling "${message.kind}"`) + switch (message.kind) { + case 'initRequest': + await initialiseMixFetch() + break; + case 'fetchRequest': + await handleFetchRequest(message.data.resource, message.data.options); + break; + default: + console.log("UNKOWN MESSAGE") + break; + } +} + +async function handleFetchRequest(resource, options) { + console.log("will fetch", resource, options) + let res = await mixFetch(resource, options) + await logFetchResult(res) +} + +async function nativeSetup(onMessageHandler) { + const noCoverTrafficOverride = { + traffic: { disableMainPoissonPacketDistribution: true }, + coverTraffic: { disableLoopCoverTrafficStream: true }, + } + const mixFetchOverride = { + requestTimeoutMs: 10000 + } + + await setupMixFetch({ storagePassphrase: "foomp", clientId: "my-client", clientOverride: noCoverTrafficOverride, mixFetchOverride }) + +} + +function finishInit() { + initDone = true + parentPort.postMessage({kind: 'initResponse', data: {done: initDone}}) +} + +async function initialiseMixFetch() { + if (initDone) { + return finishInit() + } + + setupRsGoBridge() + await loadGoWasm() + + // sets up better stack traces in case of in-rust panics + set_panic_hook(); + + console.log('Instantiating mix fetch...'); + await nativeSetup() + console.log('mix fetch client running!'); + + finishInit() +} diff --git a/wasm/mix-fetch/internal-dev-node/yarn.lock b/wasm/mix-fetch/internal-dev-node/yarn.lock new file mode 100644 index 0000000000..a89db430e7 --- /dev/null +++ b/wasm/mix-fetch/internal-dev-node/yarn.lock @@ -0,0 +1,938 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@mapbox/node-pre-gyp@^1.0.0": + version "1.0.11" + resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@nymproject/mix-fetch-wasm@file:../../../dist/node/wasm/mix-fetch": + version "1.2.0-rc.2" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +abbrev@1: + version "1.1.1" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3: + version "4.5.0" + resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +argsarray@^0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/argsarray/-/argsarray-0.0.1.tgz" + integrity sha512-u96dg2GcAKtpTrBdDoFIM7PjcBA+6rSP0OR94MOReNRyUECL6MtQt5XXmRr4qrftYaef9+l5hcpO5te7sML1Cg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-arraybuffer-es6@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/base64-arraybuffer-es6/-/base64-arraybuffer-es6-3.0.1.tgz" + integrity sha512-bOxevePlYA8Kba1xVnrQSoktrt12UkP6Jhl2wO+GCGbKAkF4fpDxyg7xRFffZYC0kP2RgMPOSRbzmdHReWnMyg== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +canvas@^2.11.2: + version "2.11.2" + resolved "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz" + integrity sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + nan "^2.17.0" + simple-get "^3.0.3" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +color-support@^1.1.2, color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + +debug@4, debug@^4.3.3: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +detect-libc@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +eventtargeter@0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/eventtargeter/-/eventtargeter-0.9.0.tgz" + integrity sha512-40f2UpTpS7v2GnXWsMpEUkKoMOlgTDrijhCx4Hq7zvsBhLihA7dn0Ayicb4FO/MOIzD5mLHsLK7/NYqx39LqaA== + +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +http-cache-semantics@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +immediate@^3.2.2: + version "3.3.0" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexeddbshim@^13.0.0-pre.1: + version "13.0.0-pre.1" + resolved "https://registry.npmjs.org/indexeddbshim/-/indexeddbshim-13.0.0-pre.1.tgz" + integrity sha512-Tl0FAiQvp0zdTiWZf267d6MN0cFk64z8oa39zpexIkX3Nk/AY5iYhPqvpQcGOxXJWdY/IWOyZFZb4K2qhRtxng== + dependencies: + canvas "^2.11.2" + eventtargeter "0.9.0" + sync-promise-expanded "^1.0.0" + typeson "9.0.2" + typeson-registry "7.2.1" + websql-configurable "^3.0.3" + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.0.0: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nan@^2.17.0: + version "2.17.0" + resolved "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +negotiator@^0.6.2: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +node-addon-api@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@^2.6.7: + version "2.6.12" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + +node-gyp@8.x: + version "8.4.1" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +noop-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/noop-fn/-/noop-fn-1.0.0.tgz" + integrity sha512-pQ8vODlgXt2e7A3mIbFDlizkr46r75V+BJxVAyat8Jl7YmI513gG5cfyRL0FedKraoZ+VAouI1h4/IWpus5pcQ== + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +once@^1.3.0, once@^1.3.1: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +punycode@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^6.0.0: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +signal-exit@^3.0.0, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^3.0.3: + version "3.1.1" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz" + integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +sqlite3@^5.0.2: + version "5.1.6" + resolved "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz" + integrity sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + node-addon-api "^4.2.0" + tar "^6.1.11" + optionalDependencies: + node-gyp "8.x" + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +sync-promise-expanded@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/sync-promise-expanded/-/sync-promise-expanded-1.0.0.tgz" + integrity sha512-pdxxEOaeKO6LghTz0Fe7yw82fx95gtS0SxVgRvIwvN4h9qTie8oOF/pWuH8PGp+PVduS84RXXxO/xrW93Nno9w== + +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: + version "6.1.15" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +tiny-queue@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tiny-queue/-/tiny-queue-0.2.1.tgz" + integrity sha512-EijGsv7kzd9I9g0ByCl6h42BWNGUZrlCSejfrb3AKeHC33SGbASu1VDf5O3rRiiUOhAC9CHdZxFPbZu0HmR70A== + +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== + dependencies: + punycode "^2.3.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +typeson-registry@7.2.1: + version "7.2.1" + resolved "https://registry.npmjs.org/typeson-registry/-/typeson-registry-7.2.1.tgz" + integrity sha512-6KBjzf4kK045pPPA6UqC1O3JKhFM4+O9YZf4AtcBX7v/8m8AG1bB3UIJN05PRY9U3E7P7/4Gc4MjPrqwvGq2wQ== + dependencies: + base64-arraybuffer-es6 "^3.0.0" + typeson "^9.0.2" + whatwg-url "^12.0.1" + +typeson@9.0.2: + version "9.0.2" + resolved "https://registry.npmjs.org/typeson/-/typeson-9.0.2.tgz" + integrity sha512-83w1JVRVt22Kj2bIBo4DyhWYh4RKzbuBW5g89ETlPJOv0+LLX4/hANstDr76srTzULePKSl7DqDAtqHADJOwvQ== + +typeson@^9.0.2: + version "9.0.3" + resolved "https://registry.npmjs.org/typeson/-/typeson-9.0.3.tgz" + integrity sha512-vsOn+VPbIYI3jgj96vwIhAO0BNmlBxEgBKVmuzl1dwXzQe+3XjRi/gK2zYgAansWYlrtvluy4lvWcL8LF01P3Q== + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +web-streams-polyfill@^3.0.3: + version "3.2.1" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +websql-configurable@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/websql-configurable/-/websql-configurable-3.0.3.tgz" + integrity sha512-Fs+3A2BjI3ukkGtvsZcPS4nGoFE0aqors8YKWgICoOt7dcfdeaTdgoMOoFqlEPHc9u/TS9BEFhKP/A9GttB0CQ== + dependencies: + argsarray "^0.0.1" + immediate "^3.2.2" + noop-fn "^1.0.0" + tiny-queue "^0.2.1" + optionalDependencies: + sqlite3 "^5.0.2" + +whatwg-url@^12.0.1: + version "12.0.1" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz" + integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.2, wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/wasm/mix-fetch/src/lib.rs b/wasm/mix-fetch/src/lib.rs index fcc828469a..f2e9b695c5 100644 --- a/wasm/mix-fetch/src/lib.rs +++ b/wasm/mix-fetch/src/lib.rs @@ -3,42 +3,32 @@ #[cfg(target_arch = "wasm32")] mod active_requests; - #[cfg(target_arch = "wasm32")] mod client; - #[cfg(target_arch = "wasm32")] mod config; - #[cfg(target_arch = "wasm32")] pub mod error; - #[cfg(target_arch = "wasm32")] mod fetch; - #[cfg(target_arch = "wasm32")] mod go_bridge; - +#[cfg(target_arch = "wasm32")] +mod harbourmaster; +#[cfg(target_arch = "wasm32")] +mod helpers; #[cfg(target_arch = "wasm32")] mod request_writer; - #[cfg(target_arch = "wasm32")] mod socks_helpers; -#[cfg(target_arch = "wasm32")] -mod harbourmaster; - -#[cfg(target_arch = "wasm32")] -mod helpers; - #[cfg(target_arch = "wasm32")] pub(crate) use fetch::{mix_fetch_client, RequestId, MIX_FETCH}; - #[cfg(target_arch = "wasm32")] use wasm_bindgen::prelude::*; -#[cfg(target_arch = "wasm32")] #[wasm_bindgen(start)] +#[cfg(target_arch = "wasm32")] pub fn main() { wasm_utils::console_log!("[rust main]: rust module loaded") } diff --git a/wasm/node-tester/src/lib.rs b/wasm/node-tester/src/lib.rs index c1774c7966..f2cdee034d 100644 --- a/wasm/node-tester/src/lib.rs +++ b/wasm/node-tester/src/lib.rs @@ -3,16 +3,12 @@ #[cfg(target_arch = "wasm32")] mod ephemeral_receiver; - #[cfg(target_arch = "wasm32")] pub mod error; - #[cfg(target_arch = "wasm32")] mod helpers; - #[cfg(target_arch = "wasm32")] pub mod tester; - #[cfg(target_arch = "wasm32")] pub mod types; From f2fc837811230a909bf2bad81fd757e538a0d52e Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:33:28 +0200 Subject: [PATCH 34/47] nym-vs-others: link correction --- documentation/dev-portal/src/infrastructure/nym-vs-others.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/dev-portal/src/infrastructure/nym-vs-others.md b/documentation/dev-portal/src/infrastructure/nym-vs-others.md index a9c8f22290..27ec3a4f86 100644 --- a/documentation/dev-portal/src/infrastructure/nym-vs-others.md +++ b/documentation/dev-portal/src/infrastructure/nym-vs-others.md @@ -6,7 +6,7 @@ Nym is the first system we're aware of which provides integrated protection on b The diagram and brief explainer texts below give a high level overview of the difference between Nym and other comparable systems. -> If you want to dig more deeply into the way traffic is packetised and moved through the mixnet, check out the [Mixnet Traffic Flow](https://nymtech.net/docs/stable/architecture/traffic-flow) page of the docs. +> If you want to dig more deeply into the way traffic is packetised and moved through the mixnet, check out the [Mixnet Traffic Flow](https://nymtech.net/docs/architecture/traffic-flow.html) page of the docs. From da46955817b545c00726538811d1e6a42b6ea377 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:35:43 +0200 Subject: [PATCH 35/47] glossary: links correction --- documentation/dev-portal/src/glossary.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/documentation/dev-portal/src/glossary.md b/documentation/dev-portal/src/glossary.md index 8c12e1afdc..2e969c84b0 100644 --- a/documentation/dev-portal/src/glossary.md +++ b/documentation/dev-portal/src/glossary.md @@ -5,7 +5,7 @@ __Familiarise yourself with Nym's specific terms and jargon through our glossary ## A **[Address](https://nymtech.net/docs/stable/integrations/addresses-in-nym/)** - A unique string of characters generated from a client keypair. Used to identify clients in the mixnet. -**[Ack](https://nymtech.net/docs/stable/architecture/traffic-flow/#acks)** - Short for "acknowledgement". Whenever a hop is completed, the recieving node will send back an 'ack', so that the sending node knows that the packet was recieved. +**[Ack](https://nymtech.net/docs/architecture/traffic-flow.html#acks--package-retransmission)** - Short for "acknowledgement". Whenever a hop is completed, the recieving node will send back an 'ack', so that the sending node knows that the packet was recieved. **Attacker** - A person or entity who attempts to gain unauthorised access to a computer system, network, or other information resource. @@ -46,7 +46,7 @@ __Familiarise yourself with Nym's specific terms and jargon through our glossary ## M **[Metadata](https://www.opendatasoft.com/en/blog/what-is-metadata-and-why-is-it-important-data)** - A set of data that describes and gives information about other data such as IP addresses, device types, geolocations etc. -**[Mixnet](https://nymtech.net/docs/stable/architecture/traffic-flow/)** - A routing protocol which encrypts and mixes Sphinx packet traffic so that it cannot be determined who is communicating with whom. +**[Mixnet](https://nymtech.net/docs/architecture/traffic-flow.html#mixnet-traffic-flow-1)** - A routing protocol which encrypts and mixes Sphinx packet traffic so that it cannot be determined who is communicating with whom. **[Mix Nodes](https://blog.nymtech.net/nym-mixnodes-deep-dive-d2b91917f097)** - The backbone of the Nym infrastructure, that are organised in a three-layer network referred to as the mixnet that network traffic passes through. It mixes, hides and reorders traffic and are rewarded in NYM tokens for their quality of service. @@ -87,7 +87,7 @@ __Familiarise yourself with Nym's specific terms and jargon through our glossary **[Service Provider](https://nymtech.net/docs/stable/tutorials/nym-simple-websocket-tutorial/)** - Any type of app that can communicate with the mixnet via a Nym Client. -**[SURBs](https://nymtech.net/docs/stable/architecture/traffic-flow)** - Stands for 'Single Use Reply Blocks'. They are a type of crytographic construct used to facilitate secure communication between parties and are designed to allow a sender to send a message to a recipient in sucha a way that the message can only be read by the intended recipient, and cannot be read by anyone else. +**[SURBs](https://nymtech.net/docs/architecture/traffic-flow.html#private-replies-using-surbs)** - Stands for 'Single Use Reply Blocks'. They are a type of crytographic construct used to facilitate secure communication between parties and are designed to allow a sender to send a message to a recipient in sucha a way that the message can only be read by the intended recipient, and cannot be read by anyone else. **Sybil** - In the context of computer networks, a Sybil attach is a type of security attack in which an attacker creates multiple fake identities or "sybils" and uses them to manipulate a network thus gaining control of a network by overwhelming it. @@ -103,4 +103,4 @@ __Familiarise yourself with Nym's specific terms and jargon through our glossary **Websocket** - A computer communications protocol that provides a full-duplex channel over a single TCP connection. It is designed to be used as a base for real-time, two-way communication between a client and a server over the web. ## Z -**Zero Knowledge Proofs** - Cryptographic techniques that make it possible to prove something to be true without having to reveal the evidence. \ No newline at end of file +**Zero Knowledge Proofs** - Cryptographic techniques that make it possible to prove something to be true without having to reveal the evidence. From 4fae075dae114d3d2ac4a1614b60d7fcf4d377d2 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:39:27 +0200 Subject: [PATCH 36/47] wallet-bonding: url correction --- nym-wallet/src/components/Bonding/Bond.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-wallet/src/components/Bonding/Bond.tsx b/nym-wallet/src/components/Bonding/Bond.tsx index 8cf745c6e5..304543cd51 100644 --- a/nym-wallet/src/components/Bonding/Bond.tsx +++ b/nym-wallet/src/components/Bonding/Bond.tsx @@ -21,7 +21,7 @@ export const Bond = ({ > Bond a mix node or a gateway. Learn how to set up and run a node{' '} - + here From f3116993d84c0048debecee4874970d1965e6a01 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:41:03 +0200 Subject: [PATCH 37/47] note-types: link correction --- documentation/dev-portal/src/infrastructure/node-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/dev-portal/src/infrastructure/node-types.md b/documentation/dev-portal/src/infrastructure/node-types.md index 589b9ca576..e864208cd3 100644 --- a/documentation/dev-portal/src/infrastructure/node-types.md +++ b/documentation/dev-portal/src/infrastructure/node-types.md @@ -43,4 +43,4 @@ Maybe you would like to concentrate on building a application that uses the mixn Or perhaps you a developer that would like to run a infrastructure node such as a Gateway, Mix node or Network Requestor: * Check out the [Network Overview](https://nymtech.net/docs/architecture/network-overview.html) docs page. -* Take a look at our [Node Setup Guide](https://nymtech.net/docs/nodes/setup-guides.html) with our Nym Docs, containing setup guides for setting up you own infrastructure node. +* Take a look at our [Node Setup Guide](https://nymtech.net/operators/nodes/setup-guides.html) with our Nym Docs, containing setup guides for setting up you own infrastructure node. From a205fecece7b6e0b1ee875537c87af09800c98c1 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:54:53 +0200 Subject: [PATCH 38/47] mixnet-integration: link correction --- documentation/dev-portal/src/integrations/mixnet-integration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/dev-portal/src/integrations/mixnet-integration.md b/documentation/dev-portal/src/integrations/mixnet-integration.md index f1fa576265..91e6c2d559 100644 --- a/documentation/dev-portal/src/integrations/mixnet-integration.md +++ b/documentation/dev-portal/src/integrations/mixnet-integration.md @@ -35,7 +35,7 @@ You can find examples of how to utilise this client in the [Quickstart](../quick In order to ensure uptime and reliability, it is recommended that you run some pieces of mixnet infrastructure. What infrastructure is necessary to run depends on the architecture of your application, and the endpoints that it needs to hit! * If you're running a purely P2P application, then just integrating clients and having some method of sharing addresses should be enough to route your traffic through the mixnet. -* If you're wanting to place the mixnet between your users' application instances and a server-based backend, you can use the [network requester](https://nymtech.net/docs/nodes/network-requester-setup.html) service provider binary to proxy these requests to your application backend, with the mixnet 'between' the user and your service, in order to prevent metadata leakage being broadcast to the internet. +* If you're wanting to place the mixnet between your users' application instances and a server-based backend, you can use the [network requester](https://nymtech.net/operators/nodes/network-requester-setup.html) service provider binary to proxy these requests to your application backend, with the mixnet 'between' the user and your service, in order to prevent metadata leakage being broadcast to the internet. * If you're wanting to route RPC requests through the mixnet to a blockchain, you will need to look into setting up some sort of service that does the transaction broadcasting for you. You can find examples of such projects on the [community applications](../community-resources/community-applications-and-guides.md) page. ## Example application traffic flow From faab815c7955883d75b2802754bf959d4fbc8f49 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:57:11 +0200 Subject: [PATCH 39/47] overview: link correction --- .../src/tutorials/simple-service-provider/overview.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/dev-portal/src/tutorials/simple-service-provider/overview.md b/documentation/dev-portal/src/tutorials/simple-service-provider/overview.md index ee3d148e7d..be73bdfe90 100644 --- a/documentation/dev-portal/src/tutorials/simple-service-provider/overview.md +++ b/documentation/dev-portal/src/tutorials/simple-service-provider/overview.md @@ -6,7 +6,7 @@ This tutorial involves writing two pieces of code in Typescript: - A **User Client** (UC) with which you can access the mixnet through a browser on your local machine. You will use this to communicate with the second component outlined below. - A **Service Provider** (SP) which can communicate with the UC via the mixnet. -Additionally you will learn how to configure a pair of **Nym Websocket Clients** which both components use to connect to and communicate with the mixnet. +Additionally you will learn how to configure a pair of **Nym Websocket Clients** which both components use to connect to and communicate with the Mixnet. > SPs usually run on remote servers to assure reliable uptime and to unlink sender and receiver metadata. For demonstration purposes however, you will run both components on your local machine, looping messages through the mixnet to yourself. @@ -58,7 +58,7 @@ Notice that this tutorial attempts to use very few external libraries (the User ```admonish note title="Sidenote: What is a Service Provider?" 'Service Provider' is a catchall name used to refer to any type of app that can communicate with the mixnet via a Nym client. -The first SP to have been released is the [Network Requester](https://nymtech.net/docs/nodes/network-requester-setup.html) - a binary that receives a network request from the mixnet, performs that request (e.g. authenticating with a message server and receiving new messages for a user) and then passes the response back to the user who requested it anonymously, shielding their metadata from the message server. +The first SP to have been released is the [Network Requester](https://nymtech.net/docs/nodes/network-requester.html) - a binary that receives a network request from the mixnet, performs that request (e.g. authenticating with a message server and receiving new messages for a user) and then passes the response back to the user who requested it anonymously, shielding their metadata from the message server. The SP you will build in this tutorial is far more simple than this. It is just to show you how to approach building something that can: * connect to the mixnet, @@ -67,4 +67,4 @@ The SP you will build in this tutorial is far more simple than this. It is just However, once you see how easy it is to integrate with the mixnet for traffic transport, you will be able to build apps with real-world uses easily. ``` - \ No newline at end of file + From 2789951d9a6ac63fe0f919a6bf0ac56155206ad6 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:58:33 +0200 Subject: [PATCH 40/47] integration-faq: link correction --- documentation/dev-portal/src/faq/integrations-faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/dev-portal/src/faq/integrations-faq.md b/documentation/dev-portal/src/faq/integrations-faq.md index a58f0e166e..eae4bfdc75 100644 --- a/documentation/dev-portal/src/faq/integrations-faq.md +++ b/documentation/dev-portal/src/faq/integrations-faq.md @@ -198,4 +198,4 @@ For the moment then yes, the mixnet is free to use. There are no limits on the a No, although we do recommend that apps that wish to integrate look into running some of their own infrastructure such as gateways in order to assure uptime. ### How can I find out if an application is already supported by network requester services? -You can check the [default allowed list](https://nymtech.net/.wellknown/network-requester/standard-allowed-list.txt) file to see which application traffic is whitelisted by default. If the domain is present on that list, it means that existing [network requesters](https://nymtech.net/docs/nodes/network-requester-setup.html) can be used to privacy-protect your application traffic. Simply use [NymConnect](../quickstart/nymconnect-gui.md) to connect to this service through the mixnet. +You can check the [default allowed list](https://nymtech.net/.wellknown/network-requester/standard-allowed-list.txt) file to see which application traffic is whitelisted by default. If the domain is present on that list, it means that existing [network requesters](https://nymtech.net/docs/nodes/network-requester.html) can be used to privacy-protect your application traffic. Simply use [NymConnect](../quickstart/nymconnect-gui.md) to connect to this service through the mixnet. From d1f7066eb5c4db71e1c485b7e1dbdd98d659376b Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 15:01:46 +0200 Subject: [PATCH 41/47] socks-proxy: link correction --- documentation/dev-portal/src/quickstart/socks-proxy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/dev-portal/src/quickstart/socks-proxy.md b/documentation/dev-portal/src/quickstart/socks-proxy.md index 75ac27816a..88c4533d95 100644 --- a/documentation/dev-portal/src/quickstart/socks-proxy.md +++ b/documentation/dev-portal/src/quickstart/socks-proxy.md @@ -12,7 +12,7 @@ If you are using a different operating system, head over to the [Building from S ### Initialise your socks5 client -Use the following command to initialise your socks5 client with the address of a Nym-operated [Network Requester](https://nymtech.net/docs/nodes/network-requester-setup.html) as a provider (the endpoint that will be proxying your traffic out of the mixnet) for ease: +Use the following command to initialise your socks5 client with the address of a Nym-operated [Network Requester](https://nymtech.net/docs/nodes/network-requester.html) as a provider (the endpoint that will be proxying your traffic out of the mixnet) for ease: ``` ./nym-socks5-client init --id quickstart --provider Entztfv6Uaz2hpYHQJ6JKoaCTpDL5dja18SuQWVJAmmx.Cvhn9rBJw5Ay9wgHcbgCnVg89MPSV5s2muPV2YF1BXYu@Fo4f4SQLdoyoGkFae5TpVhRVoXCF8UiypLVGtGjujVPf From 7d1cb6ca19d40813afb3b12e50da528222e7ebeb Mon Sep 17 00:00:00 2001 From: Mark Sinclair Date: Thu, 7 Sep 2023 14:51:55 +0100 Subject: [PATCH 42/47] Remove unused import --- sdk/typescript/packages/sdk-react/src/context/mixnet.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/typescript/packages/sdk-react/src/context/mixnet.tsx b/sdk/typescript/packages/sdk-react/src/context/mixnet.tsx index 8698f4c1bf..509e5893f7 100644 --- a/sdk/typescript/packages/sdk-react/src/context/mixnet.tsx +++ b/sdk/typescript/packages/sdk-react/src/context/mixnet.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createNymMixnetClient, Events, MimeTypes, NymClientConfig, NymMixnetClient } from '@nymproject/sdk'; +import { createNymMixnetClient, Events, MimeTypes, NymMixnetClient } from '@nymproject/sdk'; export interface BinaryMessageHeaders { filename: string; From 48140647b76fa352b8d111e6909221ec9074bba3 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 15:58:53 +0200 Subject: [PATCH 43/47] wallet & port link correction --- documentation/dev-portal/src/faq/integrations-faq.md | 2 +- documentation/operators/src/nodes/maintenance.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/dev-portal/src/faq/integrations-faq.md b/documentation/dev-portal/src/faq/integrations-faq.md index eae4bfdc75..7aca935ded 100644 --- a/documentation/dev-portal/src/faq/integrations-faq.md +++ b/documentation/dev-portal/src/faq/integrations-faq.md @@ -19,7 +19,7 @@ On this page, you'll find links and frequently asked questions on how to get sta ## Wallet Installation The Nym wallet can be downloaded [here](https://nymtech.net/download/). -You can find all the instructions related to setting up your wallet in the [docs](https://nymtech.net/docs/wallet.html), as well as instructions on how to build the wallet if there is not a downloadable version built for your operating system. +You can find all the instructions related to setting up your wallet in the [docs](https://nymtech.net/docs/wallet/desktop-wallet.html), as well as instructions on how to build the wallet if there is not a downloadable version built for your operating system. ### What are the machine hardware requirements for Nym Wallet? About 16GB of RAM is recommended for the wallet. However you can expect an average memory usage of ~100MB. diff --git a/documentation/operators/src/nodes/maintenance.md b/documentation/operators/src/nodes/maintenance.md index 3c517a9671..fce5ec7bc3 100644 --- a/documentation/operators/src/nodes/maintenance.md +++ b/documentation/operators/src/nodes/maintenance.md @@ -170,7 +170,7 @@ Check the status of the firewall: sudo ufw status ``` -For more information about your node's port configuration, check the [port reference table](https://nymtech.net/docs/nodes/gateway-setup.html#ports) below. +For more information about your node's port configuration, check the [port reference table](./maintenance.md#gateway-port-reference) below. ### Automating your node with nohup, tmux and systemd From 6a39e19f2e564b640638dfa9147565dc8f1067c7 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Thu, 7 Sep 2023 16:00:34 +0200 Subject: [PATCH 44/47] CLI upgrade link correction --- documentation/operators/src/nodes/maintenance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/operators/src/nodes/maintenance.md b/documentation/operators/src/nodes/maintenance.md index fce5ec7bc3..e29b80eb25 100644 --- a/documentation/operators/src/nodes/maintenance.md +++ b/documentation/operators/src/nodes/maintenance.md @@ -46,7 +46,7 @@ You can either do this graphically via the Desktop Wallet, or the CLI. ![Node Settings Page](../images/wallet-screenshots/node_settings.png) ### Updating node information via the CLI -If you want to bond your `` via the CLI, then check out the [relevant section in the Nym CLI](https://nymtech.net/docs/tools/nym-cli.md#upgrade-a-mix-node) docs. +If you want to bond your `` via the CLI, then check out the [relevant section in the Nym CLI](https://nymtech.net/docs/tools/nym-cli.html#upgrade-a-mix-node) docs. ### Upgrading Network Requester to >= v1.1.10 from Date: Thu, 7 Sep 2023 16:34:37 +0200 Subject: [PATCH 45/47] fix build, add icon launcher --- .../android/app/src/main/AndroidManifest.xml | 2 +- .../drawable-v24/ic_launcher_foreground.xml | 30 ++++++++++++++++++ .../main/res/mipmap-anydpi-v26/ic_banner.xml | 5 --- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3357 bytes .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 2004 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 5427 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 2936 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5381 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 3568 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1757 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 1268 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2753 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 1926 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2775 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 2242 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_banner.png | Bin 3578 -> 0 bytes .../res/mipmap-xhdpi/ic_banner_foreground.png | Bin 3770 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4226 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 2728 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 8196 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 3956 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7277 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 5030 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7664 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 4246 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 15273 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 6154 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 12925 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 7718 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 11075 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 5854 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 24100 bytes .../ic_launcher_foreground.webp | Bin 8314 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 18743 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 10402 -> 0 bytes .../res/values/ic_launcher_background.xml | 2 +- nym-vpn/android/build.gradle.kts | 2 +- 37 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 nym-vpn/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml create mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp diff --git a/nym-vpn/android/app/src/main/AndroidManifest.xml b/nym-vpn/android/app/src/main/AndroidManifest.xml index 2ff4f063bb..391dff34b2 100644 --- a/nym-vpn/android/app/src/main/AndroidManifest.xml +++ b/nym-vpn/android/app/src/main/AndroidManifest.xml @@ -42,7 +42,7 @@ android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" - android:banner="@mipmap/ic_banner" + android:banner="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" diff --git a/nym-vpn/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/nym-vpn/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000000..2b068d1146 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml deleted file mode 100644 index cf3108b364..0000000000 --- a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4974445c9ab3aea5d84fadbc81b783135062e19e GIT binary patch literal 3357 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 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index 52206777aa3245f61ae885e0825057c0550c2f0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2004 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 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp deleted file mode 100644 index bc0c1b6637c254c08d155d433516afbc3fed7fa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2936 zcmV-;3y1VlNk&F+3jhFDMM6+kP&iCu3jhEwp+G1QRfpoXZ5(O;wbQP?BVq#hL&2VD z0~x^)L)r@%;cw~G|MzTbMA8i~cgEg(FJte$m#196i{4iBwCB37=ef_hu4{xpO$KZ~ zx_}NUKta~*F_0-1VxdXM#uf)C;AF=M8W^879;$+zXH2F(WzWu*zAMMS zIKW3lL`O9ACZIa#y-m>)0nt;1V{-qf~j+qR8w+h$Jy-D=y`Pf8)U zyF=uXt-HIsySx8w+e{|Zg--Ng$!2=k6Cg|czj)lR zLg1yc{Q2z=299#v0gzht4I7=p3wuoxc#%@*LuOk3WCK0runKCu20faBaJ!Ol(T*hK zhHQEpl=~mlc@9YBEuTNW5CuvC8UTDIIV3~1eKFhxNnm99`px98Ooac^7$)bV23uop zpaw-;u?PSF@t8wXx5QIG3V|=6js;4xL?3hv_)nvsDpg!@7y=;JO%<_7yaX(fz#mwK zI)|bFszd;m0Gu=0M}j6HpaU1mqSZMZ1%gKxQjm>kI}F$&N#F^PnI+QoTOqPJfKpo^ z7dS4`)>D*uN(|&~u&c_Ff0;MBlI5cm7A;n<(|57?dQJ2wEj*FH!6g>Cu}LPfkO~BL4=zKF%_gEK!u+SZ%OX5npUh< zCCiDG0}WeR)&&`J&}U$o(bWH|<5jTkX)FiloR<$DxuqOaFV(y~nJ<4)rC<1MTKV2@VWw3Lv-&(q+T~8sRXgL$rPUbpU|W zUU9@iFnLv~(Ega~|C+7%!ufuWG8-eX6r>Txya<;*NpRs{$bx0B!(cT92-L)xEZele z&xORrJ`S6vLb%g955kl76bQ~NK4K|zm-zr^eDYZ3bFS-zyy+3rc-j&TI6s~>BRzHMS zCJ^iy*%ZV8T#3Uku)0)S%khSYzX1Sr94d%dzHdw%s~1qFW;Ll?gpVc>zIc)Ww9jSQ z5wv?!5U9%{j$pax12NC>2Z&`iK8TBc9@#*jb~3?+l07X3SgOm^I3&RLIBXk*h)#7P z1xI)Xu}5!VFzrid6s}rj%Ug!8B7YUBb|h{a6F_cvnE=OeG?;0KE8cy8T4H-37TFyP z+B7lL7nHQX!5~CK@L)qCAdTXDEnyZ9SUJ^6 znm-7iwWSecL4+=~a-VW|j_1)AC{eL2Ndzc3DNx1HhVmj!j@j{RmNpI3qy6Rj!5Ztx z$eF`?=Xn5liSUsy&|g(*u#WLZZ{{kb?h{}mkJseJYA9pcD4jPzjW)C8SZO;_mVG&B zg;&P@4`sOWxVe`V#i~|&6w^<9blS=nI}R3SPyhVXsn*?8hzHM)nl6A47vJ=oHEX1< zxzMbe3c&BQ(whT>VJ3K_1)$z};>t{hv5LA6rsYqzQXXWhX3=~q1YqA#Xyw-jA;bWW zazG<_DDiXQ7f{(`033!oNEif z+q7B>jWF;5VB9R;1S;Z~`~O<}{n&n8TEm$^7^6;#1sX$tOi6!2r5M<2kB`mLQg7R) zZ4fodiYB0e-4u^1Z?jDY1~xYOeKTIFVqJp^OP4O$#|xT@SolOmL`qQy3)ikee4|Wt zT&=YtO@pbHoIG+?zi@(&fx1t;s=U=vY^jFQiQ5kFQ{XGZ0ZN+2Qw_wbh=E_G9=^GN zFHu>ZA^-rcT>klxq}5mxqt$Wo>|aqIx&sN|(CqBM68M$NyFwl8qV)8ozO`7imz0!_ zL#_RAX*JS{caAz^t?fu_Io?7di6}kjo4LAC9f_FXCV)WJXW+^M$jN*thz3f;yDH)k zp%7qcLYim@9&AVy@M=m5qkrUbQ>E%>KWX~#okT(P5D%{bJ{UA5p(qV$!XTQ8;R_-7 zkpbG-#7Cltw?U-oF3K3WsvoyZ&1$8GJcjb{YVkAJ!8p7zD*8)>!%M>H9zY5hMXQ%> z0E$MCcshLv^X)N&S>h2E0N^m*mrw*9OME5!ON9$H#UpJ1K!h#67vbcz{K+Q%zQXjA zrw@uQ3)(o|2LSwVR3XdW4Z-dU#p4OkVdzk{q! zkbLyzM)yGuEJ3_JeH}_*OK@F_^5p<<_N3<~Otb{}QAk_0*vzsZ?+ z!UoKyyC`Y=S4MtuQha}TJm!)nm1hMJz@0PV|3v#A<1xP^+weO0YCZk$089&G~JYgklo@g?P+P zf)F=iFo5i(qZ0*^1Rj@3I357IYqGqzeRo0fo2mNYlaNd)^!xHT_7Dl1xKzUO=yiEq z)3FBxN(X&IETQ?{-*)G9?Cugfs7)d(^7> z+q?Dtd++~WMM%iCmFr|&KLz~v|KA8H`>BxJ+)wj=gO|WM|8Rs|FDpkDp%9bFbfem0 ziBKDjI-SX6B+zfVM)xL`m*ui;ep1B$)W<}lu`bsbjCoqYe4AdhJggNgujoYcVTQ9h z(KNvRz2pP?EzmXdVJgGRisoCXF0~QZ<_xUy8jEkhW79ws#VD<4YG=wm!IV71{>8_E z+{WY7Cbb>V^K}y+$b1ueieo0PF__Yr75q#mTF#GCQZRY72BU{VFnQ?z9HM!29OUa% z#$R5(7eE+moAp6`1&o8nFwZP1;K?zCa@pX2JMO8=O3Fm=YX-@J6pJ0@b{AUXQ?NTB z9ba^1;Z9dJ?nubSZO$xoInuGtmW)D60&K=u=mQBRa>rZOZ>jIe#&j*kAC5x|h8U5V z|K4%L1Uz+Y2R0@o-hjbX%@`02hO_Nu-{RQ zYEv?dV$8TPuxR--jWKY{b1wdlbVj2?D_Z_OMvUxVtfm;WCne!PXQHp`vWJjqb5%)Us@dsu>@4H*k@7|1l*A^Ue zw&EAI3KSY$FbHO^pC}C*qgImQ0>?ggB0D}tMltJrc#Irbi4?01`&Z}VLQ@TfH`HNx zeI4Gbslxr4S;(`+F+!Az&lDC$*gDHf>~U10+r_LYVG9PFTXDqEid)RNu!z>cu?=el zV@aS6vo3!2HKM7`KS;lWl#CX1r6%Kl8p|-Wu@*zkYw&Je1@6koKw^xIoT);=*@7fm zP+&^HukBSh6W@;hxK3QOZ^cvAI^;?&=mMO$S}-;S>N0CGHmyWck-sxPIWcTX-Itqz z_nRv*+**qZ8>+FdBp*eN_*u1>E5RyR(P_!V>-Hw}**no|>%{9Z&8U=;p*P4WfnZ|e zmP!M4`uO6XR?O$<Gw;R>I6e`a}h;7Tl5pd#yD% zZ`+D~>o&Y+X~R}y)<>2kn1(fikPxWb#}S@Gutnn%mfCZN97xW;mFJ+pqYA@}px5e( zQRi}9RjZi_RxuWLnG12!${cu17mk@Xqf5$xLAE4~U_7eV>z4)UI8))3{h{3N^k`cB zpd<@@n=3K2xf%!Si%=97uNdgH1cm%vrW~BMY(c+yJN|CmjI~l4C6ZhRwZZso$VYoo zGZ5MQST3=P8uXJx4*9-=(Ea`K`Tyz^d z(I@S|A)y5cf}QKa+{K_)t2GDe9IWudENbnchWyr(Vzc3$O~ts>Rf*H><*0KfCG~*5HI+^%4%Gch!kreY`~o%Xk6P{NiMZHR zhT-iMc&sJ|W>fIXg!zI}F$r%9ESWUy!~uN^lJs%DsAiB}3JKC-b2DRWtdxL;N8@9x zIM7spOFJv@URw!@o%7r8Oa%kWy1y(IqK^@DUbh4H=u7zQV9O9@MPha!2a}6Ga*3v& z@QSka+?JDqp009E&_Cs`{6tNyiHK!6(m_KD`gFT+RJ#pMgPrTB(uxlUaxj^2^NNl( zt&lg&dE}z7{vR!?I63dOm%ug6kX}>QhzGv;ouE+HxL#2|5FJ~#DeByL*WGZhOjneh z3bZSEvyg`mblcIVxe2%HS9!^@G2nNmDq>ectDdFbhhz+woRwF(>GWx?Bj; zv>w7_1Pu=l<4kwA;`)aleu!^;>pL(^vDlqWg7Sq#9M-brQGFABq^aezg+;S75fKrp zKu-L^8KZ+axdHCoThm;8Y7Md6XIq9_(Md3vjG(^0K0Ne`e^p#3{N;_m!jX`qXooPH z1jVqt=rLU*C+H1T2ONTJl%iR*#!x165-`o=ImZ@ow^C()^m?!?b8LF$&R}{GrXpzD z4i-g@9ar4Dbm_aG zv<;k~H=^6UX6Crr>b^TXJbYZjC}+^owD;4)D>8y^&Q3!AcHilha7X*DzSIG%F7S-jA5n^dOwwHza7zIHQ5gH52fqa`|EX;qAO)CoT zL{M_<^p+QaxDr8DM*^OH<~c=~OP4;x7ru1IIA=W<1l_MIH3-&P|WD6vSd+LQO#nuEk=`XM;Mp-lwlxDXn8V(l05JcGb z=wpg^iypOC+OX%PUfVov~hNXaS=X|Ai^S+C?23n zlqjxeq5XqSUmnzvKC^WgAy|TvQZqOi6U&~zZ~@J&?Yzuf5cG^@JtycDRjY@>JWCW` zV_Yl=;DrmN)t_bN^$1lWf>t@>aD4M>PS8Dtsfvb!MX&@>w0iJ|KUS3Wcs%&&LqF$b z=7OL%H65Iw{i?MdIwFeH==Tv9GAFY57G|GO=?r&JB_hbi)?RPX5f3A1Z*2}}Z)jrU z!5~86&ax#(nQLZe@6#cOrrAAT`}(9g(cb-! z;<@KvP+XrWL9`G3U41zx=&-8On{P;D>oDo`jW>o`hzpsMaYBqO)##-ssR5d1v|v3a zugC5yOjC3c45mX6At!Iuq)U(E$4}tRx871*pD95u!GV{xEu5eiRm~oe`JX7Y{sqQC zn9Ril@y)q~Q7SEeS%EAlktK-!J)u`O6v8rt!@}tjMBA;DK~JnRGBPr$f0`*lwL&V+ zXm_BO5p=h1wU>4im#>Jroj3@Y;^itbsT&qAUL4C3#%?}X(d4C*3?hg^e$z^qqN6Ke zx&#q+?f(3v(`+)#l%R+7HT+cLsA`*+HqO*~;q0PCi|EBFB1bX3d}6oLMp3v*FOKaj z(#HJ-I&x+t?PJl5&dDZrb~(_w6)6#jci%gVrj}MkSwAv!^6~1yLyCHnfpVu+CFP1X zE{8lJ5%1`>aDslNZSYuFg1ADZ-AlU5984(`%@!_;h$yH1S!#@4(tf-ymlH%pQGPVB z!^?pV_2>x)qNJ=6cIVW|C!LMu?hE7w}vd%#Z`J&LzhK6Qp1c~nvQAE2nCm925g+JU? ziASq*KT%VyNOI$_)Pa6sC*IVzd$WWD7P-XU1&bHwk**;@_@4112*hY~L}c_`e5wg1 zkHr*&XX|q@#0cu!T8X=J(`foB1~cD~EXLtQX&rw@v0LcE4nwX-Z!l5b^L5fOM60F6 z>9mD%0b*8)((0cll4z>s#X0cT=3@R5=b5&0?9TA*)y!8oL>nG4)u7+B9X--^{7kGK zF|b8xq+0tT)6FRBI7QxbWg)X$cEb%fI8{1B}z`XfvyH|Z8K4aYpWsMVAkL@ivhq)crPxj)jg z>DHN^gj1WCKiXW4lP%@=e8x)tRpG=zUMnO^armXB8a*-0DKmmz64!guMJH4`L*K&C z&??eN*6rgJc3EI-~*-x-cf}UmdVV?QHI(#jeX9@@yqo~d{4o^kQ}Mjy+B))G+5@ON46v< zjUK9AjlT73_$Qec8rI;?<>mNFS_TT)qB4g0sE=b+w05FT!q-@m@$j2EycyUdj47XQ0>~W@8-M98u6!sDm@H86>eZWh5%QQ9`<5edoP(B^vo7;K@dsz62O_3_?zf+_mi=q#D6D>AxbAsFR z;>Lp zvkMk62GkezximbyoyNe&;v3U6*H?2Veruw?#v(DqFIl#HLqxRZ*UXWh<~~ZcDu*c+ zwQ(-bElC-kpJWz#p35uu{%2vW_e4>n_d;=#x4)>_+gI4^?apuV9?o3nJ(Rx2^H_3) z=UdJ~&o)~+3d{)*1-?&3N#AMeV~KCOf?ipnzG)2C+-jy0+6ABlj7*ybYhSQnL0))7 z1ym&CB}o7_t;<;~$2U%Lza34)H}A+HxRkpiMdg j{ibVlZ_;Dnt0n&jDkWX8)y?@900000NkvXXu0mjfrhHoq literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index 9adc4b2092b1a5859c41e628674c4dc086ea3680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3568 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 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 3d0be44a979f4be1591d5a3b292e11c728694407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1268 zcmVj?Zg>an7&^#H7odksD^s;#igNw!_LgO+Bm(U0q2Sb(#VA!^8 z*f4?E$#%~knA-pV$R@UJ8&{-j-}48?Ro3WEfZY85*Ev}PcXxNEba!`mcXxL=iTuyq zWx3ezpGl~$TG)Vx{surdVGKGJ zaCgd7{}#Da5N+EoB-Q_~m6U?Y%S)+yY}>YN+eTFx3|K^^|1UQEp8#x10wzDA9`g~9 zBS7~Y4hS-PJodWEpI?AyI2cNFz;-WtQNR2DfoF-1WdA|3P6;qAf>A_|Ci|56s@KMH znqh)~6VI5tRQ6^S@m?A4ePSy-r_Ed@a}8u->m2(sO1?Vh|1%idMy14?r8VulFj|=Evn!{(U1B2h;Ur-y28J91 zV9Jmfm3px?Di_AcFfo?07&%IeLjxz`0-k2L6dRp@#K9stBNFI+<|+V;m>fpM-)%@y znCSiLJr=R3{VtQ30l(;q_5mJ2>Gavd2_uv1?^EaY=yL5VpSuICi-i;6D6u-LsA>d- zi#33&ZlSLy3J}qxemNB!#~2_8f+Zr6*_QF66G0S3;<6-Efe%x*{D)7?N1~CPlG~lf zS?k8*@r-SnY?+x+-OB?O3sfGVfCZ6NH-Umn+qIr(X1}0vuuA|mIx?}#k-em$&>$9p zlwnkCDDq(niW^(-%S2zHv~dIgvKr<7GY=_kw-lYm;>-@21zNog+HYL;*W zFRS00_@b73XN~Gr7+#nJA`d|AV3Wv!aKI7LZEa02v*m&F<3Kn>>#}#LAc76C8YYe? zYw-b4w%kK!#*2&vG8(VA`nOdP7q6(@%}BqzlE#_(vcP$)C<|NxvuYn=YCfGK7Y*3u0b0!;1?on e(REB;y+!YEab!Dz5j4T6Z;y`LSMs6iS8Pg*JY-e? diff --git a/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..e634763b4228461b0c4c5c494d37e6022ffec34e GIT binary patch literal 2753 zcmaJ@c{mhm7snLFP!eV`$di2;+)TFYSxXqpFt%&5HJYr^GBl*2Fk=}aTf(@)Fp?#V zVPq#U$)L@Z5F!d=>r?lBe}3N|=RN0npR+x`-+9h+?mO672?D6ZE@T7jCbZz@ful0_`q0dbKX zn~#W$m>#2q0UfeWzx-zII{78&!yI&BH@rG^*l_c#g#}NXiHtD+q5q+LcDOApYLuy7 ziOz`w)JdFr<=orruWR0tgPc~L-D+@kY+JgZOawdjgTZpMDS?)p`oQy;c}5A`vsDfM zW(8@7t9X2QDe{(AhXRlEupOnY#Rg-H_quxB5aH31?QEq}r0I}X8#BvGc>>O?W4A2< zM0u429Uuqa*uA3s?v2XiqWm>=WktGurafP^>LWpT+)y2PA9qKnxT(O!-E~~7zVeD? zWFcQYz#|Xj0IA}SP(-i|NVLSYiT6AGA=_V-iG{c?;KC3DTUJy%m6?G;uPJNvD$-)~ zxz-ffq(5_ANITU^CvR5HGc?>3gHr2|iwn)v$mtZx8IfbEU-WB<@HCXZWL>G=+bm~V59R& z>SJ1uC#3hJ;GJkWP1!Ntd^mmzU^?e9+0_t6Wf&5ev7o#QO$C3fo>?j8Saw)Sk*ac{ zuZ5C;WYQrMBT4JN`g1d(x?AEyA0G4qhO#D2cH{(p@qx8jyu#q7Q@h~TE8PrE)4+sx z8H+s13!z-4oAEMq9k?<>$I~XFQOvy^@u=ywK2@lwDut#u#zN4$> z+6Gd19Z&o9hQmPoA`lCjq#&(9>kWnut#+)7m06QMSU}7?8GzoG`Y`n^_i>9S#M-43G!;#XG zWqCeT;90Nyd(H`;b2JxxbmgV)U3(>Y0f3k*G-n&dGr0(q4DJ?8*;nY{kVLyDr&~ph zA-oIiy-P=DN0_MY^9jqY2#6+nGIRhY(Ws)^9Bh38Evx~3ZaMS7Tq?NQ6yGp)6+1^86+Q}YgD$%fG62MeF`3|oLNp6 zkbhz;o`e&W_IRIa!Br$aL~UpjgZtE{KQ}_ADEnN8CY~lZRKpAs^W=YOg~9|BmQCcIB3y)vQqM} zN78=!I_{Q~A+3)I(Y+u!%-@L=xl$a)ig)5H4m5Ti!^skBz;Et9bJhFV9rftI`Op;f zyF03#3*8@=-tCX3j4Z-~gM6?{kuX1e#<2t^j*zYPQ<_~Vy&qj5U50-hmf)=lg2<%2 zth1cQbDmy4cPVA9o-A6Asw2b`r0qi^qLqO_`rEE(1=YWyDgw%feW97>uu>Xd8a*tXKag?i1KiZn!D& zX*bI|m75pnQMJ{4$jU7Pn7l%K_xK>7xU7kG6H>Qa^ex(_z#5lD7VnPOH;0Hblu*h4_AsDJP)?Q&Q<7yep}VM*pf@rQ5;!K%pEn6)vsjioU#Z&gu6(ZnRicgxR^4<-3*ui{sjgP^D-PxTjS$sLV-!$jB z6^4fH)RN&SD^Wq=ZfT$M{^^0LM>S!{CVx-^f2%cQ=i-L_Hup34;I16VoYDzOxCC0NdXzA?xb*PNaUrEMUWzlT(S8uoiM&W(_a#PDUbbBJzF_tIShFc@AsQbQ5|=_O-#2 zWaHJqB>1?05`1PeTWK^O6m|B6c8NxOb>wv;?Pfv!s!UUSbA{k7uTW%#kT{akFr*Ok zs+~ZpRI>GDI^TX38^ksRwEZ-`{BgcW<%mS@@v$-Qk{{RJMo%E5pLSmL@Uyzfeseo4 zjea@XsDGwzKVb`jM2 zqtf!bF;%{{A2h&+vT*6Gjpu<9go^=3qSrl<_FhYfQNA`*`Re`ucjcMLunqS4TE0W} Vq;%h-4o*`p8w)%0YBQfZ{{dDXCT9Qu literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp deleted file mode 100644 index 106e0e13cc5996f9e412a6277c365a55550b330d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1926 zcmV;12YL8XNk&F~2LJ$9MM6+kP&iC+2LJ#sYrq;1HPN;9|Mca|eZ;nt+O}=mw(T6- z=FBnvzwa-;fn1OFckexG?S0zhH|S3HX`|8=FJii^wPUu^#kmICcDk%oPAYY?(wViZ zL6vIyu(QqDMrYeem7H$6X_MBr*`_pZVpgssg>2il)3!=}vVUWCm?K-Z&OTC@p}ow^ z%*;$r%pkdqBuSFII;#X9Ay+8~ZQHi7c`|3)wr$(C-A#a+ ze1MX4A@*7zUGomf$xZN?0Ku1WqTgBa3c<-na3h`RWi}EF1bZfQe}&}@0;x&x3?FuH zRuK&dcIEVwY&&Bm|4R^WyO>3SO$nWR1j`8i11^-iQve8_3r@$0yq_SOA#w(icH{Ym zrj=^z6Racn0{}S+Pp_aQxF%R%(My6EnWVHZDQ77nw*Z0tKx@r~mq$|f+El2_>TBr8_=TmTU5DT$@t!9*@I9f239cRr0P|Uj*lP~HL1jq52lUn;!{)msrILQ54~sK6Y9(CT?Gyu9*oaITovtP1i&IVYxTxX8sDO6H%$?3W4z&emFRS$Ce^^WzM7^MlVuWk|8TCCQ{Oi z8F6jm>%`U=Az3|-UmU>&OA$OmOotw)BfMM@<%%p5S*>2WV+5?2Do2c9)|mZa4wdqO zOo^`#fcQp5l#3(SVW~Bcrt$2oG8>%`S7RW#JSEY!imKM&Sfl8rm(s7{4#$wkB4$>M zhg-P{AYGPU0D!nUk(J^ImRL$+4}yO+BL;}6Rdf}d!H-{R`tztN`*5nxK03Sok*fjl zj*9?F`sWJ3u6uF><18h(D~rl7N22P?!>Rt?qqd(n$7%b~k)zl!2MpZAg$1MvUIMV^ zuAEfc+)@NHb^L<*-#}`gT7TV~)}9_|y%NlzCoa`w9!~emi@RIHRA_tkN;UvRLB_}vw4`vmRb9-hK@!R#)>Eh#gUu7L=5A zbQaZnxw`)kCwx&FwEFCD`n+&q5}SmT3cxQ(nw*rZgu;rT?!ukcQUnjpC5+2?B}c>b zcJbo0|KNiuvmFeQ+C~;5SjG9}%0Se-oNE6+zz%%!;;`g_j58x2*syTZ$7f zQrTiff_vr+2Coa)ZR92?5{BUY1mYWK4@#=-%@vUhC)QeXR|rz z?=6O4va-o(|6^i#bvAi-eyzc?LtY~_RIl(0RSGa^T(sM zUyp^W7>HaH^ob2uw)qpm2~B2#k6++tiKuYPW=W%pomSMm21z4i8IkjXKEa(dk#PG^ z!lWF*UjSJt!!(x833owzi6CH5a2hH*6)+1xil&3*>kgewm@yp$FmQ~r)y!d{4+HQG z_*s|?rrpJBq~_Yor$i64SCTS|rMzSO1{uC{JL%UJA%n|1^f{4yFJo@6jJwyg=|#PzotK9*6$q*a`eBn=o!R z&~7VfYAbu*o7ih^Yvvm_yEFvuKI*1{jatJELsbvSmkW(c$cMFt83me`ViC z|D%aDD-tV3u=2_)CrAcvuW#@rVS6b%U+G!s=Mo-nf#9pqX{zk~{HyeG6rOJVe5SH{ z(MyD+-KevSo0a{7lTF!wMS_{@XilTll$ebK7s@0cPn4t$!583d7pIQOD_uxYNqbh( MZk0*0tH~@60R0}G`2YX_ diff --git a/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..37a8d502c816c311a411b1fea2d11c5fcf7403b2 GIT binary patch literal 2775 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 Q3Dna|FWs`0M)6J<0KA+ky8r+H diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner.png b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner.png deleted file mode 100644 index fbd39f501dd7a23fb706d9c597bdec9b3c511e5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3578 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 BaRvYY diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png deleted file mode 100644 index 634417a64034f28adeff6c7c3c5b29d0a2fb2908..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3770 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 Ye`O;&88BhdfB*mh07*qoM6N<$g6^2_>;M1& literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 2dddd0313fbe47649a26f3bd19e022d9b439ad86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2728 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 HCI7Z-pl{|&eziJ8a?ga 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 O>pytM>i)0$zdmieM{+&@ diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..51a588fdee975c7d501522c1b820d9eede4e4c5f GIT binary patch literal 7277 zcmV-z9FpUSP)`uARI z?cwaLQhgpi52FY-Aa3Ni=@O9Mqd1?3%M3TF7A?A&K@{rchMQ#R5GkLBVFI<*o19MP z6#DD=PzqYDc81kz4Kka}Cau}wFxqSp1o}7qM$hOS&v>#R&*SqRqLNyuhcF@{BBq*5 z_AtH0UTHAfw;-O<3$|DA?_Uvz4d#$D__r6)&(X_&J4EmBcb}rTlm?|mY0C3ZQJ&-P zVb^HzQgMU9p*090D-0Ic~cpNE8q1L+$v@? zhFFZ2kh=|L+g?xMxCz*7zlgm7!mOc?>WGB=@K{(H;e^#u3D6Xk1g%lY42_XVusR|U zmWIVcfg=u5?NJbB2?dHvX~+rk%#X@IWuY<+SKezmNP3n9gUx2e3jYUIyjv!Oi->=c zkWgS3ZB_@w+QXqFG7j!cOotr{^Wb;cCGc)e1$>ZK1;_GMKzIHs=*?RV{kgT!pHmAx zi)-ObRxKRMtbqd=E8*SLmDAqAdYlmq*UDxs%*1q_r`!$2vb zWEBh)*T6s_Vo4437ohO-YefQb>!5!zBD)^?vk;kt2Iyai$Y_NA^hP+J+6aG7Tm{d> z7Q@D{3`n*`xq62eRYhgoMrHO^mun&1z+F8S(CDqi3LS6>o>!Oz5FHW*^$X(Rx$MPo zu)G4!RW67Ar7K~e5>dX=jex$QRd9AmHJr#_2_NPxhke;quxAk>vkLZQu7D3StKm5I zfbPsX=tBbfI01b~KwnxD^rbXGZ*ntqCpN-A;%i}hbP3dlq(HPaoRJ}G5E2mw&}dgn z_26}y^u0kEsjAQ~55_LNLslV4%|L`b6xJpt!mEV^aJp(K3@l#`167D+*y@ph{)&}w zu51MyEv|w$a!TN-^c>h4p8>5g$xs#Pgre{`$O(;sEC(SP{~Zg3p>a?Z9uF;%DX=9b z6P|J|fj5$t!O_%O=uT~bUL>Fo3Fu2gB(^|bLJOR9Ho+^=%b?Yf2H}=4u~!VKC&@
    x%>f;W39zfY2>Pm*!C-Y246LXU30S@Y&Qzkn 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 Hu0mjfVx7ws literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index c89a4abd0e7daace668cc1a0b61de43fff99bf6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5030 zcmV;X6Itw1Nk&GV6952LMM6+kP&iDI6951&U%(d-RfmGMZJ3xp?HvjcF#(lhC{$YI z;?eQL;%9L2wqou7dP&YghMAd}nVFfPxT=|%;TGLuX1v9`x&QC?`~L>@OrjVRGjp9- zzH&}>K(btxP%bXIvx2zqD#FZB@k1)v0}aTy>*CP13hKD*fN=}iK)Jw2hdGfrxQC37 zWs+IMoN!h^a$p5P$<*1zs5y~yRY0-ps7Pi|42xife>jqv>tqGY(aect28o`0FJLy% z=hPy?Or>sU1+CJqM}?V5^_c@v005)a_UFp3tJUfZQC3bwr$&F_5XvLNCw$P zQn;MI&)-vZ0_?W`@7j@bb|sE?Pg-E-FOW(v3e>Yh8ioC5yg=1RSC-+}inc*{&s zx?myG!Vh4oXd-3mz#e(3hwVTOc%L$ySisBH#foN27{zQrh5#d(Ha5S&3*~*J7SOb=0yZE=;AAo_ObZ+8$+a+{e5B2$0J#giRH=6?;tz~_14SFj7O*AUA~sV4 zdI`Y}-E7jucNB!KcB7lT_K#H7Oc)+~CSoGG9B}>13LIf9)iznJc2z4X zPgTB9^;y+VRlnbL^$S%!|IqWl`Osf&c@YtDWCmAci0DW#%46-+s#kTW@`oy*@$RY) zE_v#siO58Q#~7l#uOvqpt0UN}^cJPEV3|<2yJwF|#5uQTPq*9MgVJ~Z{jFCaGG=fX zLv$24k6^m0YXI1@$EiY5bLjT$0f4(MJd4Pf;BiEBB)E<+RjR%Kp{oBbg!aXmwe z`9GqF0~Qe-1qx-eRec5abVCeq*xdu%@(=SwQIL3oNFHmi>K^FsK_K^Zf$Pd+9f&44 zFxF7v`AVnM51i)^Sa%-q#M_gx0Wm~J7{jLlT?D!dT>K{@6NrdNZBu~rLIgZK50Kkb zrYHar8I_%YUl0ai0;uc~z@}(AE1;{$?E;*G_73Y~koz{sUF)FnNP}~b?P9ObWK=L6 zMbu#|(oX!1S}s8HM?P(aK!yOLo)mesKuc;T{=VH{Od-xiz-60b~=dW7fNi|VvB6M6E(*eDn z{Iw{6Lq?k=QmX?k7m(Lp?CI~R=z0UvARKbbD!-CUWSX#9E?xYO>0p7D@Q=EgtS&=} z$#4sh^iHeKB-+QcPm6Pp z-qmsKQKxnL`;2{1eA?6$K#mSyT#>v0%4Hr3oz&6}-}2j08lD z`T{a6I4+cLT7)be)tD)mSqCUY#lx*Vgx{G3@@O>eCqG1J=>zja@TS9+dvPE z2r^+vzUcF0rbq)b%eD^*K&0;s0AeFKE~McuTCX2t35`fw;uaSf>#&ucNq()t1a4Lq zUWnpEF#s5Yo8+{RMms6}KDEv&kH%@g@!VpB^Hyp$tqB3mA_5YXpx6#uW_1xsYX^iS zK5YR2OewBnB88OX*`m^ZYS5}?e~HQ|!BdT%syi5bTf=gxj!ZywPKpp&(YjJplcC=KXEK$yXrlBa3gvC|X(a-Hp8`*) zeXTJ40O|$D)ji1yQWd1BNYfB(pJa$OIfh_fjhXWo z22{dXVOz+x81k+c=Y??PLQ6qFk4OMf7Ti6=D=FP)o4yL_`Kl)(Zxr+D{=h;f^K3mw zRYg>Ev#b0FS7G;nb8yOrD_X$k?sK0A3HJ7>WuG`n1`)fh?;X8=j51J|+ZI4-25xCR z0l6!pM@1MM}4-2n} z;=I}bO0tzAmew2yD^-|Gyv(fT*)@Pb5+RIu{w*5#zFCOK(%bv+Y7aROK%q-gTLZ9{ zdEN^kN{}}yPMVFOt{YD!3Yoxj9674MY^A!9ptAL9k(TUY(7Q(3InLF2`Dr))&?o%! zYV}@&4oCIG=m5~-tC<=A+f_|SH4@p+gkYO%osoyKT%9n6ejB`+USsK17X0%=@ z?Kg%t#7#R1nvAz!EHuz|(j(KiJgiuHPvo1IL# z6M@6UW37R(ilMK^b|f|F!VEO*PaV{UKppeB<;E{6XRNFmI8@pHQ(Kdy`U8oyb3^Ibp$_YhHt}{jGnjD# z{+XQxU~XWplGZxFCN>bDqh@rHO~7#>k!YNG*=kK0OD(x}tLy&z31|tD#@{P+7~fVg za6sz)Z6tbNeQpPZfVob%Y{R9ev4h=IQ!rWai?o5^FPe~pw+;me$&^H#zbxO5>i(_k zO+3#u3_v287Is4G{u1lBwCGb<*V=0v0O=5iE6giO*AZ`?EQmBmJ$*eYB)@JtC(hq5 z=Nk)DN2O*1r)VWYiJk^{EHuQ;FtTb71q+>k6~$pwW{94t^YTz333A4Tg*WUHV|^vS zg+e2rH5GxRSWV7I!(JA!b-kgJ>O<8>6YB%T5H2;F+HX8UVVw0d+ZrNbPNiBP6NYfF z@9k;4>xiswfX7Bd-V~!iwb8&@)(@A^(?&loB;Lt9)6-%mvLt{jbFr4r%a3nc;N%-5 zh@5#Rbc%zr>I{Y1>13=h1_1Fr^+~csmWA)cvW{w*{WKDq&i{Z;tAjeK zjlN&TTi)`P0Uz7ow{6Iqb}php?%Vi#DK?ZMltycz=W8mO@ajzXK*@&4@Y?4qom>yK z&}hf)Y3kWigurGCY*(ga{ruUqvY`@n;JIjF(@$gPn`}opY(I1DKp#IMbLz{9V`L*f?otGcR z%d7RJBpI_AfMNk^WKdf>(c-z*?ISpZF}m5>TCZ3<>}n%*#rm<~oLm{R>9S%PdVL?E zMTszzJY1X6_208NPTuG1U@UqU0B!sUEDQdZy8It9Hk_0}6xnQjvM>lUOc20YITIrWf;WIOI(u30GTtPORK& zPi9$sn_#z)LMci1y?HkCaAc#D?@RG}JZ=&SaBg+YU(ei9(meK>>$gcE(On`G9}?sb9}j{$x; zBS5eYg0g)Mr(=n-)5!!N%EDO9E5e4lBZV*!GCC|KlIq~;)f!0dO3RS|o&ar8eModr zSAXLq0L*C+W>w7{qh%E=KN=qnU{x+SM`pQosoUQnM;4UjH7-CmLKPbVLCggR*C zvvO;QbFz(7(K#iZb*Ojxv6wtuHT=U!aWVL9BdK-x2{xF(OV6%kCWVWuSm%%lYq_q? za*_i-Lg6d`c;Si^pxE5+XP2WAMt@xkD=?W>BH<6=DW1uLN+i@lpKQ<{ObWAE#cCs1 z0B~gx2&8D(A3CiJl3I`3Ij8az;SV8I+1S2Xvi^Dtr-k+%UXY@pziN6XM#LuWbD#Uv z)Q+nC zgVQtnC?{okpm~OYyu7@ni+nlwvj@z*M)3f1`3ZN6MUsP;A68Lg<{wlw?-XDzI3-!E zhb&WUlFGdMs810wRq9i$P=R9h6@8s&JF}4E2zOInyA#JkFl8~{=tEPos3V@B3>elcrQ_-#$sH7U+XKn55vq}eZzP9$6*v#4hyFO}R!MWj z*pN+OS-Hy%#XR%OGfx8=6XaKo;243Ym7gllCdsl86br0Z)FI&uDc3^jm;hJ7jAR{6 zq^;uB3Uio^Fo+}tNs8`qk9!yt)R0b~2EgdFP|iWJJM(#usfDqWYUW7+`X0y>`G7^3Q*-5rTp`dlfZ_Am6bhdi>p335*P z$G_eptt>z=C&1tD^v}n2U0NTn!=p18IjJUW+fujhk0z}iw{vFXJ#&++hpYhUApw#8 zT+BLkO+>e-JrvH&*v>Sosq_Cq((9eAxm*-r;9qMKO>)(lgwRfIJMA7`s?DYdF}|v ze)j(<>mzP`U4TPCBCn-3oGzk$4|&tJLGm5iIj#ywkAJay{2~dp-2yHap zg?!kGBv=Wy7MjQZw#To~Vj6gE36KdlyMVxIDCcr~I*XgZX~rlf$aN-HLG|IYm$sOK z$VPxjc(MraENyZk3+Bo%fY{Z8PqoUoi3^USm9`D+7+JDp~;>0Gnf>~vxP$iCp2rw^Rm z1G&-UlI7u)X%O1h@bc`b0zy3yTLq2vN0E8conQMeDHh@v$TC!!Wo@5`m+xQDeCan1 z3J9G#yFA>oG)Qerfba^thY|tdgFTR0V@yu&nG)C2JzNPX#5D^KcdTMx7A zY^AJ*O5&4AUTIn~n_6%$+kkv~X(jp7%Wb;SYaLa_Yj+>^XBY w!y~C>+AOk78@q;YF(yF0JU2HtxBUCDTMX}Nq?T#3%51GMX_}_SSj$X-1+3kWHvj+t diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..65cefcb1963b4062142389ea078ed10cd81f2347 GIT binary patch literal 7664 zcmZ`;Ra6^Hux=r^7I$|G4n+e5io0uZ2`Px?;u-WqJ6?L-`SVq^+ z{7){1pUF1u>*preYSqLoS02bFs6)7bW*ixj`+?N#;meiLU_btGGilC*=1@42lJ zS5WBHgsO^>$$V29l8YNxQ ze&c>Yyik>{sUe{7~|SyZ2`i!+j{G)hXISp~{+UQse|P%RRyE==eVNJV& z^XR@HaEQ8IYwK*|{C*a@$4nC7OI+lM&J#H!9Bw`Tnu_gDe;)ip5U`A9hJ2?Su}7x^ zvC7Y3X(Orl*%)Ie)FfqeD-p}g9L@~E(yF{4$`*o1jq_|zuAtmfjKO0~)pfH4ZTK7m z8vdSBLzvBLAp`eUJT1n78y?P|2GyM-%OVhC+Z!ks0Kg$0fkP6h120|DvV!xuCH1a* zI$p1la9mLaeY@#YL}2~l6ogGSLztSQVz_URORMl{G~K}5KVG`_li^^o`>#EU2-$r2 zeCrJse7^IBA(O09*1OutiGOeXN0aiHpg8X`0!ITawKNwo;IO()7)|Gop27;p_NIYy z1Q8^IYU|&$D3dc|kD{v+C%(6MvRkpPeU~alD;6)qp+`;HP)wA5U)cz0U@w*61E!rw zb%q2xDQM0$9wTLWD>!p<_58)b`TXbbQ&~>T%p9_Y{iHu&bH{S5p5xfv3=enKd!0Fl zdeSiG%)wET=KJi1)Btk-Kfkf*==@Bhku7Y{XwRg#ngSlQ*Az&UL&n} z3-uUjsdhb?Bctx$#&I=(gk@#RXsntdK+QxAngOLiysNq9jbxZ{P~8;F)k{hlCyUoH z-qb|t=4qnaD1PScr(_HG9+ywd?7Z_z1^Fw9rOjfZ`elEZTK2x56dIFv4)@av1m@%Ulyc%*VhvMT&Ko?Qm1#<;O5&T8Z)oNk_vy&a^~%05bm zj}k&BO$!u1!&x+7*@od`Ey%IGa*_ZF?v^k(yrbjZ{NyhRwzKUFvG;^%HnTq!X2<~pw! z)y!9@YKcbCt^0nLPc-Yr#!0Cd+p76J)s6&{B|e45sg#e>3F%x(+C}etLwK(K3I7zI z-nDMYO&uC%T3SYgbEBY`&ap^{&>+55I)N=BJIJepiI|dR`gqkh8o$eUJH-}>3)O3* zF!(naW1cN^+xfjSvi48gKF8RmaOzDwtV(h-EUil=(hb*k117;|NaL4+aBdM+F=s zor`E`PT!u;T zTO%Dbc~K$MtxP+jg%Qg5(e=s(GPqA-)8PWC2_Hcx9%y+EwctFzrAC|mnA1fY3x-vV8 zua(UO#<{FwPw>7UAb$nIkU2e+Q{lj95b%QwSm|!$xD-edD~1*5og)j#*3sB9@&S5g zz3BH^8H7I-S=JF*o1V9h@(vi%w19Z4ZeeVBl0_49Wp&5`N8~5 zKjLyhM(X=0h=*NU#EVNNL8cQZIbkI8WbJ^$wS$29cv}u9FugZC zC^7G#4n()~?@%U=9X3$vdj)I<@%}UsOZQN@IP~4o`-m@~USJ7kwjtxOEi;;=kt8DF z7+<&tRbu?6gI+b58$z{CJh;Py=G~tdk0P{)6$sv@i+eEnP~Pd;!mZ`|azHE{ufJZp zo!Qcw7Z4JTlW`A|Qgaf%l{@sLvi(ELIto(HfbMF4*lcDGQ#7zBW~FpPTGiGA>|O1C z1kubt`45@D9>+9FsWY9@PP(6S`MgubORyhqh32X~ADw_hp9kQlj9cs~xiY=7Y?ss? z#9_irOwW?mJCvZ(jYoMg!g0?LOl!NGhZl!P<3+L&;QF%lc*`nlpH?Kp{qOr8YujDC z@u*-ky~G*a_;aLO<=-*D(s@_{4n7b`YkBXdd+t}n7}j^+a*}>NGMD+{5;^-ZQ$b@n zRBh5JPF*LQsXDKSQ`YcW9lsN+LaoDvG)7ZYPkyK(oV=eb?(na-=B5lC#n(lB^YtU2 z+hr-$Vv{PE{2&hr=E!sVqsh(O^V2{0?XSsv8M7j@OLEep(%Lr~4gV`rV2J?X_QRQleC&7ahcJXP7`=Dg7lU$IQ3H#P?%yCmgS-;~JA*d|RQ6Z(tj3!e0YJ0j?; z8|`Kxg724LT!isf-2V;tQQwxjvyKO^TFEPPxtaIsZ}cqL#3|2Xj=U^>r3=#Y!UD0p~=l? z0~u8xJ)sKag#iL8XHYv_pWh>t`9{M$(Y;ce(vk*GKgo|gf41vR4;Yte#1l*5rBb3S9t#8 z@8My&FRCjsG`5cW9@-?)1HPS{<(hx&Hy!Z>V~bQ zBl&zEsbU6A=u%uWG2v_IE`gCy>9?rb{ET|gt{~%+q~Gt@bDJOBrM@W>?+P{$HH*&! zuMv=qf@|FahGjKX4kScR{X3mDS-_pyG(NwcOos(KmTs!;6*n0c!G3_r=R6QmRw8IM z=kENE__NWavFI0dRxVp%#9o9P2hy8-9euPV5YyDgznOA<)SBEEt>V=vra6Pa$pe@1 zZ&^TIAR)>wBR)!-lbqz!({)#@Io_a)#gj6aaYmb9sC1-%Eu}0Nsiuph;mFrAPD*^F!GFKlg{H9fS9ZT{p_o>=53bnil}P0OP}}Lqf{Dj4Bne_nw47Q!9qJOg*23nlRzV z$rEm7V|YGgTp9qrc8^s-DF;~U3VB$`cC5hE&9NScsVG1dBrI>{eRqjcG%gEZ$O}Fp zgV^X8{~qwp-xo2@tAS$BFS}S;oD2W+h0(fFy!z?dCKF z)m1I&Y*aoc0yE9Tp*w#q*udLVl;&7wfI-@=h?_v07FQQ1R2wm&yBhE zk5i!v%*#|CZNsFD8-J`+ei9s{!Rm&oYncY6 z(KtNsV9|qy{4yhEm?Hd>tcJ{$(T@(EnjQGnK>Bq6ms%<=dr1Lt8%~5007ejNM@Z%j zh5Eke=_x(Lhwkg!ZDhhwVu{O38j%MRs0pco;ixoS4|88*CRmHvrXFDlN!XV;eXrLb z+Qf=2sCTaegV575@*+shA8Ph*+}j^Ux_Upe(=4aJLDHJv(J;KJub6P}%u_2tJ=mA- zUu@_$GfdoK9h|oMhEp9*4~cVu^3W5kH*C24Q(psQmqCfm{qHEFzs=2Vc3eL(h`mGi zx$U|KKC_5fz>p;2``8B&l8pa^lfIE&nNnT$Omw_M4S7h-hfQD%jy;Ja*kn2!v?8jhNqiMt zk%+viMJh(1Ch%9~Trk%GLs!=rij1~Kl*<}kS@(`Ml)D?V@~09K;2Or<)?|%3{Xj>^B1DAf$Nft+y9&u{tpyK zgYgv&6KxgiDoXl6%iC2nMVM&=j7&k&EvIC-c=4bDk0iPi{tI=FI+ znZQ9)>&Y+-mLt|Chz>b5(Sabx9>!$-Gb!m}NH!tlCQ}Wn9!G5iEPyT0DF{8q%;0|` zrXGG7bY0<`P_bixA#mE=d9VfL5U5LuLbTZ;Nf!l{`GY@v537*;T5__BPE49A@VaxN zCiCTuu9%TyKGkBI7qql+hAoosc79WiStVtWut3+d7FoIUN8D}{93;l$jHeK=ZFlmr zOda^O0^)c~H!sA-xQG2JnM4tcSJAtlQ$2WHG_{;7M zW7jr0zhkSI5>TIX@ZW^!j2{ZJ)d2YF;kDO2_!QHoKoa(Jv&x$N#L(0b+2CGw_tn*K zy{HlhDi)ucQNQ?J)PD95tJPYFD{X5QuyM~FZg{M#u>xQEd8&I#$adme$-3Wp6ZUC% zE{nU7EvB0wF*+~3yRs6B*tH19k`9lZjZsIS2k!CG;m$yim7V(>= zBGD-ESi2}YkF=C3Ou)x}-QQ9$*@@)CYFG>_6n*K6+3!7KRJx8gV}>#lsgsqY$x8n% z^+jJ#4lpe^+K-S;PE>k;VrGyvo7Wj*DL~)ucU<{stNno2q^jP@cKy_;HrnLc)j6RX z(wpz**?CLHq|tdx4|gEyi=8rIAbNn)U&x{5NyYfnV93|SGGRhNu}62vnb($)UekC2 z?eJuLzKCG`1D&LEW~giXX~np>$C`48tAtEg^lbdKeSv@~-E}dwh(1vS?boC?GF>zO zvN^s?J4Xp9(gkeW#)OXl?Tl-KZ)nFO*6Vr^XjLR)mS!k1VasT&@z*%oxH4%5-dYHZR%qO%~9x=l>t~H zNo*2N@M-|GykkZuDNK%04T`;Oi}X?zo`Y40FR<&u;5-(>#DitNs{Bu>gbvw+`)1>! zVslvSj$X_!aVKaI>?oxk*9-t$@IzOuYy6hX;|XR^BDa9A%a;O_C;1aCDZe-dU0G7i zy;OHDIA(hiwE8d*K4Iy$F?QTVL=PT?r4|5 zmaL;5^iFM2GHZ1Ak4|U8myup1b?z4xa>7I3riO(17UKv=#ygA;8yQw6$n6IaUWdnv994xOt?UWHOSUk&$SZLdz_E@)DQ7#c(%^^P3x z?llZt^eUjK+pGS}l6ncpp(XK_raz*E6O+<8@MQ>mcJ{1Fo4Z*jc@em$n&K;QSraUA zBqX2)+4?u!!(`K$n~CJXpGR#jY*Zs(Y+;FSMxk=KO|M@M0+bw3G>~_BJAWJnPLZUP zBmeHkrCM8wj1tx_Wa({Z3gjI?YCGX@!9CG%>(=_qW@^Wxv1hN(C6sBN4zuUoUpaI8&V5?VoDVRPM&S+xqa6n`;hFHFi^u> z@{LRY{=7iJyx#`P615Q4vv&JHYv(nvF=BaPBjE7~5HLQQsAYEhu-mjdTEdi+udRbh zQ(e`!c4yp*z5VC(V-&{r>e%8eimw|fuGsNS#$05jx4g`M$$084d4}C4#HFWub%(UuN~D`yr_P*x{$C1zINb0m=U}D33Vo=^%%3l_+G@@rIVDz}? zQVwpji`je3Fewm%q+Ad=JsLfI$}pvqw(G#iw|B`GF*douCgMmcOGO~CG{lQ)NLl|# zE*dPr-f=j2m=qFA?gph%@LNt(Fp|ImG`xct)Q?Gg)h7yB~(a3{Wu)f^t^6q_XslML=RMqMrO@cl@)G=e#l3gm%?Ja7&b1Py(ZT$vvoW+Hy6Z|Jkz6w0AJgit_IT zBHZWb3GLqZ-(B(S>alDRgADXjp)gisy3=&SH^#M3rzViIAT<}B9TfHg-d5y8!`rtxKCjS}1M14kah@|w5)a}$bsKmBOXrDJE212F z0m{l+)-N3UT7e;psn>YAsdHvQP`JliYrUSG%%fE8xziNz@E*l%N>n92BLqNNW(yaV zqqNwe(- z1@H+|cxsNd9iggi$Di#)zVM4zO3H83&SEq^w;0}4^1@uku!4tdG4h`TOFGi@s^(Qw zhP^G%nGhwguDy2i!an=jwmUHxJ*|op2$%($U4*BVy)UjY&%9{_e~_^eDpAP8Yt874 zBPuX-_b4Q*(a^V=%WhmNUSv)JbsB1`W`gNBbPcpeOvb19`D@z(#(f~EI=IZG<)0Oe zlW+M)v0~)vjB?6FAAadoxxqi5*ATV#>($;ti)-K??Ln)yJF8YvmQ?05Y7AI4<5CdZwcfQ>coD>7^pDtd$k0jE zqF-^B(mE^C?1K?5<0*`@w!HJAA^*?Qn7zJBhLMyZb^sd*7t1XXCF~7tm5tN~qF&~4 zsVCV1&oCH9Czg`c{$jsveP{!^IZKx904<)Bu%Lrt9sIM_FoY*d+l6tn*$#V8RW45vTZs`2>ZCf0%>JNjPt)9GfpWs`8X!63^;(m#HcsAu0Y zGEFWvmVC9dmzB&I{tpp6eLw=Cp>p$*LXS2>ibj^&G$ZYYF7f`4Rx*5ri#PqraT4AA zp_a33jQdu$8ML7iOq>(9u;)*<8UOE(sIAt{GxDcO)y^3bW{a1f+*eBS>fl=0_n-a; DA@h_v literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index bf191eb8171c41c8f46e66be48b647099254f843..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4246 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 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp deleted file mode 100644 index b3336b2e2815906eadc3895cb94c59b5a5b0df36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6154 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 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..5070e583a0482cf1902201b3ea4c51c81440afe9 GIT binary patch literal 12925 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 Zd9WUlq0l)&o_{L=s48l`s+YHp_3w literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100644 index 0a5390f963768a0a39cfa58f6d30e1d0d199509e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7718 zcmV+>9@*hiNk&E<9smGWMM6+kP&iBy9smF@kH8}kO*n`oNs*%Au;Tm+Uig;~(fy^0V#l&1Gc3_Z4e+bvjN*%4G18^Jrn`S z@Z7iU_J`VTA=Br%uhw>(z1r3y8O~GFe|+Dta2rXIBIWall&0N@2cVOZh?052r*2H-U~TA)rulDTIuNj%bT1^_O=qd91LFo#aWmMwou zCtLx5$5#O7$5oO9w$S$$L4jHnSOj&>IT2YrvNb0?SOgf_1a#f!uPWS1k|eQ%bWA`2 z020H|BuNr)KqmlxxR^ncBqL7vdc5`f3xH>7Is@SIlODhsnABbZfV58(0KdP;q_4R@ zns^}q2Ec^^faqw@_ZE*500aP(0)Ryl5rD!4Hu7QsV9OSEy70mlwz|MZaX4rjNs?mz zu)BNiK@brW&|kv`_6M`d;q^#IkJ?y-8r=gu%K8#T@9u|2r=`s0g#H+_{Qrt1yZN20 z>H#raoDrEBMavsrF}{KKei*+2t^5$o%p_)MW-fNzp{B|_i>k`ZlT~Bb{mfLRJ25I@ zn;8WaDQM$gOugtZl^Ir7T;>xYmX28J5Vm97j=Qq7n(+m*|7J=vQ;A_^wrgRGpd?AM zY^(7&_W|lP*GT){A3g6RC2QN3x6So@|1YJ?j0@n_(}GssqYb39j+vQjOaK2pl&Ebp zBw24nWT{b&vDL=dwr%dNxwEypySuV&+qT=bRaQpC1X!B>e{mzH!D`tf%a+H?gJudd zGcz;OEtPkW8@+-Yb4rfP%#6dPVKT~+Nmlov|NU3HU%@xb=<2BY(v>3(&#G!c!PD}t zYk5y$TJF$|rb?xn(}tNzVdlH9VNN>CbmHhjL6U9LwpBIvKGw5st3|K7-?pu5{e!*M zlo+;=AR+P`^j|RiCMEy~ex$o9wGFTo*_Wv*oCM))ff1%xAn(L~6p?+7DxBm$0?n3s zga>n?KYz}ueSXky%z(jXQ8c10DQhI+KP8jTkHk;%YgE`0s5^Ne_95z7k>oK7sM>5M0S0uk~g?>cZcp?j%kML0QIeX`leaa;C+ zMI@oxV#oh6R^}_izZ{MYisYA=`NZm**YUykJ;GTrNOvlO@L21-$aVoa2dN^(qQ{4o zuEk=8MwF7!8qCXy!;7Gk+ik*EU8oGgEo?Bk5^@}5lNR^z8jHIAUq&1f#Gr54 zw;_DDDOqugb*Hi4gzO^kKfVWxee2=vNzCW=wLAnqC(CZ4cdEEm*P+}2_LKL2l(P78 z>)VsyBfC7v>Q34<;G}vy=6~~%t09*tx4u0)_5P1in&YbEn9tsCcLyak`sK8dBjj@+ zik)ml--AE>2})`g@I7vESQp)#wh7Xz3z6(_v8Ky=8_sO;`a1S}$6XRh8r^H_3PRn( z%8pkf@<)kTZrDqHX=myCV0iRz=LPoILRwg3S6m}$PqrNW+vf{-KOj0tE7reRWo8LK z?@{cU#!x@X|F3r;GYpagMSHJ2=YUqIMl3D) z4fpc+d&MI@&g}gx@Q9k+75sO3Ym&&c(rgHRJd1vS0`;)KA{LnwS@KYtEvKl4Xz^kM z4;1S6Xnu?sB+VkXWh)5)mSYx4rXku!8b9wv`FjQWM^3p7n{|Rk9#WeDeXG}T@+5}a z*?_b}bA=*zVg6%bgy$t@OPEDYK^ho_q2gLUzN>%r>sn!LfDORX673PG6QvYH_#tGV zy(}>2+)8CpP&2^ZzHhHTB8;o(C&1bxkD;EpX zuvOUxHaHL{SEo`FvJ6B^%JDgd0D!Azer+eb2fS@z$3i0%ga1X$cx?TX_j3jWcew4e zr3Ub`Yh&?m+&49t~~sh6DK5Z*a#es z;wKF!xof4mf|DZnh6A>~aDn93$}hZalXry^AP(7n=y3(CQH{tZ!9Zz=;37~$nGv>y z2V5DB7xoG^!F-I*7ml?eYUKaB>`#aMsbCAMrG4V=8R!Zxb%R@?PN@ z%A9aWaw5qhtT-JcsDL-kRqzT~0R&?}Z%8NaIc7rbs3e}L(Y$i70Wl13LQ}Z=9j3yR z^1sY+&_CLG8z1Dr-**dhkh>txdWv&0m@FNXG(jIIZ{>-?>G6?*XiPdtt(@;iv3}aI ztz$kBONljQ7=1tX56*`F=s>*Z^w z(!-VihfS7l?1iD&J%|4XU2(k`-HpXqHxY|{jg5FWGH}mZzn-C*?PhGm#9vHq^ z=a#c>`hF=XVKWiSMnWHRH_`owMhw*6&K~i~<^Y_WD&6tRA2#pNs%F}LmffI-(vw?e zrG-#QNi4)ntfV?I1*y6FzjFDi2D!UFF4lsTR2Qs$Jdj1l2L`-0&{|$vydMCx-})`P zI-#rKt8;a6fpcsV(^z==wTxa}6P@2^XmL%E(H%GYkdsQ1hiODH_2*|9T_!jF4KoZK zlC6ObBR_5nM| zrP3Ym?OV(T3e`DC`Gz zk5+frUUuv=K<&#>aebx6jXva}5_3PlNz%bksq#95~;n!$M%n zY;aO1f7Oq9kiv|+2WBijzRI7gynN1n0C1eY8(wo+2;o`mrtThi7m&@4?K>sE$x_gh zAc_Jff*y~7dX*3&L{=two4#)s6>elEy|1??=eU~XU$Q6<224MUHk)tng1pOSV+q29 zxMhl)A;b*31eTWR~yA%P36mFwTyIqU9xl7?N4~ zlSy%fHC6=F_sg`lSi7o^v~JZh3*2}V#3gsg7jIRHErsX~Xa0}tKp1k4mYT$XvgQ?> z9be)2Rgi7uh!Bl%AjLTrp*a<%LpDAqQjBG{XKE$z*v4kA=5W7$I@$v%+Odpa+|v6Y z$X~oC1r5(`J>SfK0Vy8H7Hq;3R-Ai$V-P}XA~NyK6^Am%JmbjgD1V*v(hx4 zN4mENrJ9FxI4R5t=@QTt(%u6iVKHv0umWypZ^B-8y?y6;=eHM>twe&*-P^p2FQCRB zzbxWf$z4`p)=JjcSzmtSRZd}!5II1j>;ev@>eIlD(&#l;mWp@v!FgLDnfJJcd=~ zl^TTFLA0#$@R>=Wzd@3F8(+&JE!+Ku)_+ z(nR5zgh9n)0`L=!kyPU!t$?ayF*wmLMG9|-cJxsx;*hz1)Hah`s5e4A5YM98sslox z(4)2*^L+uRLs_gzk!O3j6$+UHu-JU|3fBy-&KM5j&>GETpL%lY@II^ z7{M@X6;@yqCV#6o+)Ju?SpvNm}(;sGc*EiUfd2AatF38N}2jOeCmU(Pa)y{BowaUhc@2w zqj%hUmp{&i&1m4LkEplghnw~O7vmaFW-Yep=I;ICB~J3u=RV3Fd$K)dCpl*CVsp)6 zQn*WPFy*Gicx$GQDH8_|8V+;c>vADQM4>y^*IDqbVlsh5%TEm#6dMaK1~2^LFaE_8 zX;ZE_u_jfb882ry9>v4I(Ys--ktqCn=m^71V6f-zn~dDZze_A$Ald+__5z9_4;_>L~w@S5-h)JwBr?q+r4xtLKN+5hIQt5D;a^;Xhv6Mj0zObvB(qFv#$`{f_ z$Ihd%0Wb#q)pJnxjL-||6XkOM!3GytEZYN1^OLR|T<-%KJTiq&P~K=NjiwurTNjH) zNFZ9+f)G!?N}x+b;}=6|MH*MvipybcOYgU^x6sD$4-7U4YyK^WHCYNBq;&8t!*zKF z+>~fuMf!+khw{PUL~vlm@+Y6elnpXwGew8jf-6FsrHgkbPG3j=~1(LRraB=8@FE4yuuN0o^46F zD+=@Be$i^9IEW+C>tR#%-{q7&1t-JRL`HySdw5BTrH@WGo?0#&EeJR`xn&R(e3`Hs z$wG`~@i^rOpxeI95HOFHHZZK%>EVC4z!Y|DGDj=q?*y0*=*BYNlG!`Tg=l{HvZq7^ zHxRLEYo9Qs#6~;EPBxyx^N_ZzC06+541mc6b*Hm$z}1gC;ryd`-FD6mbgQHIYD)v( z7)e|@K~lv9%F)26d?WX|ufS{AvX#p*5gU4UPpqkCI^@)DW`cE6RMA@1%I^o|rB@4d z3$+SOSzDXHccxtx_R?z^;Lyo;Ph=Th8vlrQVo}f1{rDnmV#SYLGBQU;sM?5dmL#TyKkEdObwZ`dIc)kLmGql=HeIBT=>8^Wk7`Ix z{d$mdQCbry-!ahD2%DXAge6ET3Op;S_^6@llgcV7gi_&FC8tXt9RP%jTdFzMdo@D8 zD!i+KD~{quBgnwBQrI4THlfk{n?|IgB5nT{DRzUDAUDsCr7%S6N6_@HrH+3u<2-5V zGq`UM;eLGw{*Hf>AlC`WSNwBXTSEKzw`$>3a0QX0M)@av15>IRYYIB1>uy+Ug{Jf& zL<#M8!Vg@mazTM@yN|X1XU5gJr$NP9gX30e1v*~WgpheHT73#tpccp^Mh#tO;AqKI zvZXA915CRHHq_iwc&R|wi=#xF8zf8Bb|i2niT>=2MR_zcC`h(yA$L~8_!y5WeLRv- z<9vln34h^?qgeh{;9*)V{rvJHRIiB}NZ!#Q5UFRV?YwO-?0r|Y17WN23gKVr8ftx_ zI^OkLKhZQ)o#uaQ)N<$ug*F`~VW*sE5_mxMK%;-SV1w`{UTF@!>;<8zF$!8h8x=_^8tPq;MH1-c)_ z`Xh+LV?JscD%`2%nJ1rv^qRPGsDdIgq(%s_pQ^Wg!#zvuR_x&mCW&gj^lOP_&{Df& zm7{>phd!Ci{NuCbpHQX~pm)AoZ`Z##bOpCn8tchMwSMbnt8t?GDmG`KY1AF+Dw<>4 zBTsnIa1(dmJ4)tmd=%xtG@Mf4gye8)c#W8 zxsk#=>K)IZ!KH@r2}r`DD6_(yfIAkfeG!%8p|hL(_<3NotV9d|mCdZHwZ7OD2Xi2drI5Vtbr~2UH6Q4fPfrU%%DM8 zX)Iqa*aqMco}gJsxbVQbITV%3HFrEWtzh$=tLf4-E_9`ko_#4J@EO$KZ*^)0h!>&=KYh8?f00twEVKC;|`OJr1e-ZL1dzwo&vY zUr^eAh=qiR{f5a6YGE_53FaQ)K_?+yvy4VMGprSWn-yCbP>kU2!)wpVR@LoMIN+`a z0@>1ok*tUOS|Nah7}J;*S)z#~ZWr5f=Igc0qroyT!HdO14jU0 zIL8sRxfUS)jmM@lzqk^*6xcFwD@v191E?(o-sQ6Zk?7<91mNd-QdA?uyVuthCESWn z5r9jP0DQhqUUWyT`|U@I+H!{2N4$lfCCTsCg(XRi*&|7 z3&H*=aQA+enXfte=DfGaj$$&PO&vr`+jLY-ZZr|PE+}}ncsbO3NmPPygsPS zJpX;A*CP0dDwqO+MV*0N;reNqlzngB#rHO7cF|B+>Y3gv-BHUkeQ6{}i!BIu30Dkz zg?2uhAJ^Lsn*G^d12 zo>co<{AQfu96HHhT3I9$t7#PlNK0rq_8ESKd&;Y_sH#e(O@;!&{1~$^wy8Rc(;46S84V z3ZiLQJCJOIViKyVER<5I-zULlbQLOw-9~g|kI_oLPpK@v1QBd@CFs>|GfJZE)g2@V zJ5oaB7qAP|TkU(~ICPKou^q4uG^nQ!O;R|ah*WSy8fJr?<^(MAzq*ALerD3mI zz-&MOS45~RzLL`1AeyxQX-n*p1{JzNxW`gbVh#N(CM5HYRz%pLA|j!Ji>uODe{ASK zOBOKY0*X*cgXs!ziB1WNP}-?%`XEV z)9Z!64i{DL_4E3MjM08WK~&~roT$jKs2vc*;H)I18uMMl{zgoA0rOuV*{dp%jw983 z54(h;C$U>gIAYK?a!qEP`NxCxH7%5^vy34ozEHky*k75YV*w3E0he^ISB21dq*AG# z-vkFIF>S)AG23y1*_ea`Yl;y9RSN>O5KC_%9^&a;$lLSx`os*ip92SR8b~cK_kyr% zDpg=gO|X{G+}3|T8cHEq;_7P-F5TG9Bn@k;F|vS zzkWim3eq){%_<&_DzV#|>6RNTB^%gUD{CW4BK&tZ0t3{Jq3Af5p%ptAjy*?9)=b9I z6wfd7d^>M%G_KJf_}S%ef5H=%dqLP`g%p9Ee}apg0$*;Xyk@M8&RANTBE!^`NHMU; zFeD+OPp*=@E4er%$DSPh)C&@ZtTxBmu9tSNp4@ku}2!!*=OTYID5S&KV7f zZ3GzkoS%Kn^=8~fh8e+~{V}}_>7KU_8d4&15RUdSf4#iC4BV;` zc5#t%Ql5F{WOA=F;V2)-DTJz0y~U~Hw^m=xraXa(t=ia94Uz^O0!8Fm{8_k|h-E# z2!Y*Ssor~EmcA@Y@4c$`o=RZ|K_rAwRaK~}5JC{jK7gcBRn>d1Et*M6%MgNu5JW^M g+?Ohqs?=sGn}yO$5ekL-WF@I2sU(FYg`}{f0S|+@CIA2c diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..18252905f84787dd51dccc08148c663439ebfaf7 GIT binary patch literal 11075 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 NSwUUCT+Slo{{aNteX{@n literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index b8e72301e0f7b7f4efaf60a6eb7fee52662a62c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5854 zcmV<479r_UNk&H2761TOMM6+kP&iD=761S*zrZgLRfpQPZJ7A~yIa~G5fgx?%M~cQ z60zrDv(4bSqwz}rziN`38(HQRGcz*{Gc)zHhM9SqnVFgS=H7Gu=e+NpbHt1ji5dF_ z#7xslb|=!CjhGc_s!PnNiX)0t)uKqh>PR6oD`UnkF+@|_v6w=7#Vj4Mv|ZKWOvVsH zW=Pu*awhmyDL4BHwoJl_oXII<%s0T38N`YlI%mEL-+>@ zjdt&zZP!V$wrjiUj2UO!wry;OFp|t5(tp9Y>;DAMi2!Vtq+@eF-cjgL{V(I3uXVI+~_p)(A;6c3k$4M#*fpt_3t z@PLJ``a|&WI$RGEO-8nd25v-*0}QMLjuwK2SJmO*0Si<0RqcH!pxOtBXc03us1||; zUdpLpLei;vRWI5IDKLg4Nl;d=ztR${!kOFyZX`*vRaN=6yZ`4tR00tV5eI;C+uAW_ zY}+%jZQD-jbY^8ce?YxmC7o?sm0f=tJQF|j8OSu{{p>)EqA%pC02MPv|JqN~hXs@Yf@+gr@u zHY8-xh?W1iy~kR4wjDHZck34`Sh{jZW106@GtaW$z|%D8A`!BxZSWRr=T_mieSj{4 zqbq?XF}L-j&0YgX@&x?RaR4-B(94Dpn(|4}O>!Zi5Lh91H94hdS~hyVYFL=0}e0K0CH`cl^P9*X0~>KdglWyv@ez(HV-1Khes>q}WOqis6_ z(6-K$B`b2_B9QH{Ml5eYevwWe}Py1J&tT+h90iqy?F1q7;{Q|A; z_AkFsX&4J=C2o0jE%=kLQ9b(qZ9&%G@2@;lX^1||Wi@7c<`mL59D*@4Rj0C>02|kP zw=P926cGa$a_TcZb9I$DHR9=Ok7a+qty}VRkDiY#D#lUh#i^DclmZb^V?GcQczJ?K zp2%ajDn|lR#!{Gj)Uz2wqJS98TWF*D>U<$E{+F)TN{jxeFrNebwDRP^YK~_JFVbe3 zx-hUCLqUb7-`~{FUZ4M;_p}d-s4*CcaelOtx=r!&HE2Yjs0Im)oftWdC80t5Z=+$S zb6oxZex4iDvM&%3t@`5BeRe*3qfGSS6zi20Mk4 z`s(x)ue$s~=H9J-+Ra^;weMB|LwM>pbMn`3P&QJ={`tSP*jkwk86c`bhPTwSYvz#* zQ4=6C+kzW)$XAfrk_Y5EF;Lu%b#K%f&m4O-v4f>mENC_mjq0H@U-`Fc+Q&7y>z??1Pw2TP@X`}}?uk9T zN#FKRdACbvJ{s3!e_b_5eM9aV=g0RbNJ5#pvE&F0RBjliXd6&siBJPqK|)9FI+cGOm1r)mT3sc1t!*ahS;@$lo4(ynExqK_Mx9q3^8hw} z?1DOkbPnSh#XYWPLhqEmY5mg#X85_5!WGu0j=bR{x6G6fF$A6ydl5A3O@FpH%s(%q zSm4Ht9I)WQUP*1s71kz$Qy7O3c0p_cTKll{YVOs{je(E+%Bb^8+sa{*NZC0lDWkcY zywa+(YttyCp+iHb#x70WZp=7LF?q9_Q&C)}h^`Ub<6P`@-o`JD35RZBt%PGTEAATa zTl+~ex)&=_7)=BO5v6-&#!%jJUKjSJ&rm!cc;OgrK07GuT0Z}EF6JKN_D*5PvI$uU zY%XQW3S$z`%xz+Pa(ewR*H^!3OPiu7wzAo|vDe(ns0(Q$F(|NE+%=xJ|J2MZJp5BQ zE;A+DM_sBH!Y$`@;YgeaoE!KOlo2^i;kR?w zxZl6Gtb!Cw6Aq8S)JF@yp*U2r;G!WaGFHZzNO?zdkRW9=Mf2oUM$Q);gE+_( zt{!(iuDhy&6Gu^Pb(C>O@lP9&F)-uL{bz8N5QG2>9q!_r3VVb0=Q&T0Ac{KDRw=AM zgKB)u+=4PtMUy=EO!K0;<;IpjF9wmU*Wj+PeYKOJLIY{lIn-(3L!_=3;BVD=q-kk4 zDPwNCtC6@Y#;9B6Pc`fU?5-Wvyta{iORA51aQZD7bbUka8t}X4qu|C~g~B#r*ExoB z#Ep#X7}ha_LlFBQmJx~xo6VT&%=NPJY3bF%>$MuC$ga<#Ecs(4A%-TJ;q(%jjo;lJ zlIp^VMlM%EHLq>_Qw$}8AwPq=`u%Iu!B8N+mzmGj9&dn(&(Ju1^%56`!9qA^!$wZ$ z_>J$iPrUUkhp%}hzMLQqXzjC8C<;|1VXCpqOsXgxQy0mZ41V&w+?Dca%q%?o6V))+ z`llN((<{b=pSriM4~p7rj2H)@k*s_yzYSH7_|$t*y-8}k#GqL}vZzVGek0jwJ zOf;2dvM11YsWP3Xr@EJ=hx8jzoyXW|;xJS_;!}rVpgUKMZ6Mi%0dL%ijl`p`C>?2+gr)E_+EyW$KQ`lQHw+6RUS0a?-a2 z0P?gZU*aRB##e-w)to%~IC4kTrqh~eKGeX@J{UNdE{V&={noo-BC+=6g8}okyY2<6 z_v~o+Q2@}>TSAJZc+F6NHGeMLNmQW-yX!?0hM;eA`wW^_awIN0@sO&rOaSIPz5^HU z1#6C{7CML$+uUpe(yX_Y1FMiU&mbv0GjQ2E8jggDBoy2%0KVlfJh^)B!Ge>z zEdV%GG%eX7Gya^$nZCTz6qnZ>=dS-5g4m|LC%h`kG|gWO1QDls@;FWIs3PGUX9M6j zKDZB9eIfw>Yot9t^QTWjY|zXUZX3r(KMNB} zFC^VbYD^>m^!NAM5@Es32LKa#>M@AcBDzGNVVr-ffZLAys0@bL2SGYf*~J8aQ*|Zl z2mt2|5+M3~@%AifCi3_=uEPyg<1hell9iF^j|2e7ZHau+iVtMz@_lta$H8Hkg<-Ig zZ@U0s5_gZm(*OWG7t!m89&uP|T+b)tx|6VG;eo8^S^>Z{K9&W`{vh&7DtabhCk~Q# zJAv!^Zg-HNO6bfd0IYUBWaj;$;G#+7kx=|ZcG7OjdD>4?iKPR;C_|7nsRaPYZ%Op_ zqEAY89L?a;vHU^-z<}TVu|#e$#kXOn z;#>mvP5l0yp3KrG8=v}ouW($2&Fr6gY+t?F2|V{}yv8d4K*~!_>GHkQQ`5Od_=~Hs zvW1)RKuTL>MR5K;C{uoKI_C&U{%Kh8RP3kyc>vx=ScUx_+Yw6 z?;n+P`WH}6v9+RGj-Jgi+1SERybvEKKxXKGW~0pl2IEj^CVkt=DKTF=Z-1U1kpvr# zB8{MEL|z%{>>#le_mYNTa)BWwW@v{h22hdTb2k+3k;feI=h_7$-fdFXrJOAF z(zB{>qf@$(Q)8DVZW|}=-0FhLS_IjOZ9uz_4q-=Lpj(s&ddBfi;*;VkYuV-@Ls34o z>UaP@n({k+WsR|Oia7Ewe&ASNW07$D zw@sogwpwY3wa0Q4qW4C{VWiBK>8p(3M$*3fdfRPtEm!eP;hpqi9&z2`x8QVOWldJ~qj&=7NX`XJY{oA9MNNj?7CfC-B7&q!ERpGJ2LTCK(}` zk=fB`q=lw;XBHqj(TC=Zv3>P_5mU--foKKt220Ji)sj4I(1NZ>OLk0yh$e;}?kmNfU;SaN$tr=Rxm1OAxI z&087GyO)z!oljXqFR6;U@LsOCwtJz#$=p67D6sjkWjRyWS;>i#doX&`v3)j=^xgS8 zqKSg&6!!PZ<<{6OMR8%(CDe(4$HuGa6%)_Zlbu^88aur(qmnBHJObJFUjh{d((E-1 z+$||>Npz62Krar;#t6TKIOU7SP7Fb!vCC)zCg&QJS3YA-G=zRBM7J1h$oE6Uj#^gc zm74l-Ogg6U3Y1<-6&d?y{}&<-v45gf(rh^XPOr(}%dY|ava55c#@N1oiIv)SwaNUG zKN;Is6E&*_O^>HYj3Z&tw3ffdGup~Cr5XUTEXzQ=R+{q|xjfOm$PykOcm_rY;Z+gl zO@^b*AFg-3i@Dp~jM*zBP8E2O5VF&qf_G9nGHPMhHHK=Gm7-Iphu+=pcDK7CxmD*d z)`dMH>1Mz?aJ*+>;7oF%F)$w)@!o%(Q9co0d4&>B`BtC z1$6@%h>V9q%R}04U|`IzI;%c4qKKmS7oC$Pc-qQoRSZdzh8boUltO5p2T4!(9>7De zt7joQSP^c^i|3TVJzXgoe`b6Q%}?%Xz@PrYF2~)>X1ewD*L}ACD8F`!Q>1k0pp|7=L56Po zW2ZqgWS)XzYn4FKZf>?gX%rJy7R+-OZ;6I@)Iq|!;7=}dnS-DFlVp+G#W%EYJD;hfq%Yzv#u%O1_h!P5K)M0~=gOgmIicQJF4N)ARfwXFMoh+s< z6HoMDy$JcWc{x3CiFPz7hn<{n`^C_*w=p7YCEhz+zjo>jou(T&Tz=gcSfi3f;h-a$pQc#cL>!8$s&HuFo=lv z>XmT=8VwGf0zv>Lf88fkiFV=#BE?oRy3?SKZ9M$QcSt}Ue>^42p_%N5p zm~7@WM(-zkY;&)LXN~rjjs{>&n=h>+-6v(BGohclH zO{8yEfb0N_^F3~fO1i}MG(Va^T z6LSy$M06YR>LgXBYZMS7@M@K2Q$x0}BJvcH)(OytJ_Mr)dj|4an0xeV1oxrGN3Gi1@rObqWwV0Mj@vZ#md;jq(?tkJ$Fmy>)#M zKyW!nLsk~p+NysFbTDJ04-JE89)aKaNj5Ioc`eIa7YHR7@aLb7g`t}}Ek2&F2Eqwm zVG$Ze28!4 zO3=)D2fo>(I#H^jdZL<@-HMgT7=bSi27m={%Xq5#p((0@Q+_509RX|v0OjQfkO%El zQ;Pa}2WTUJX%XarAn|3CQ!QDqItxjhqX3`6q$-64t7_8^)okomm~g5S@FBt=c?8G+ zle?W19sTI|6{@GVfWu&v3j%=J11}0dUvY}ok9?>bY2j3uaB5oMS=lovGCRAe6T`FU;-^(`S3lL10N1vmrlC445Owx;)|f4o$% z1{OgDufqS;@-XStUw&lfhuO>s2D1GKkODfu74W)TB52ZSsya(`d9JVjZpG`>;#70U zf9f>CDgW&FK5vxo&`k1;fW9*4u`YxD9T>W otq^t*Yx4ffjYbyojmFFU+*lEsh9cHlqk-015t_cDf%H%p0VAt84FCWD diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..514ec36652ee118e7a4e9e923e31a3b356305347 GIT binary patch literal 24100 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 E01HmZuK)l5 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..83e115a87dd13ec5bc791eabcf7c70fc96556d7c GIT binary patch literal 18743 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 M72vGu^g0t40MXOiGynhq diff --git a/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml b/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml index 9c1cd0cc32..a3b9258141 100644 --- a/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml +++ b/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ - #1C1B20 + #1D2125 \ No newline at end of file diff --git a/nym-vpn/android/build.gradle.kts b/nym-vpn/android/build.gradle.kts index 09b1978ecb..1a6937f39a 100644 --- a/nym-vpn/android/build.gradle.kts +++ b/nym-vpn/android/build.gradle.kts @@ -12,7 +12,7 @@ buildscript { } plugins { - id("com.android.application") version "8.2.0-beta01" apply false + id("com.android.application") version "8.2.0-beta02" apply false id("org.jetbrains.kotlin.android") version "1.8.22" apply false id("com.google.dagger.hilt.android") version "2.44" apply false kotlin("plugin.serialization") version "1.8.22" apply false From ec4765c9c659b8b0fe2517ab6d31517106f73435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Walther?= Date: Fri, 8 Sep 2023 08:47:56 +0200 Subject: [PATCH 46/47] Github actions: fix nightly build workflow --- .github/workflows/nightly_build_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly_build_release.yml b/.github/workflows/nightly_build_release.yml index 6ddee762e1..7687035157 100644 --- a/.github/workflows/nightly_build_release.yml +++ b/.github/workflows/nightly_build_release.yml @@ -28,7 +28,7 @@ jobs: run: git fetch --all - name: Set output variable to latest release branch id: step2 - run: echo "latest_release=$(git branch -r | grep -E 'release/v[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -n 1 | sed 's/ origin\///')" >> $GITHUB_OUTPUT + run: echo "latest_release=$(git branch -r | grep -E 'release/v[0-9]+\.[0-9]+\.[0-9]+-' | sort -V | tail -n 1 | sed 's/ origin\///')" >> $GITHUB_OUTPUT build: needs: [get_release,matrix_prep] strategy: From 5bd42951648efd824fd23d052dc7eb2625c98fd0 Mon Sep 17 00:00:00 2001 From: benedettadavico Date: Tue, 12 Sep 2023 10:20:34 +0200 Subject: [PATCH 47/47] bump versions and update changelog --- CHANGELOG.md | 16 ++++++++++++++++ Cargo.lock | 18 +++++++++--------- clients/native/Cargo.toml | 2 +- clients/socks5/Cargo.toml | 2 +- explorer-api/Cargo.toml | 2 +- gateway/Cargo.toml | 2 +- mixnode/Cargo.toml | 2 +- nym-api/Cargo.toml | 2 +- nym-connect/desktop/CHANGELOG.md | 6 ++++++ nym-connect/desktop/package.json | 2 +- nym-connect/desktop/src-tauri/Cargo.toml | 2 +- nym-connect/desktop/src-tauri/tauri.conf.json | 2 +- service-providers/network-requester/Cargo.toml | 2 +- .../network-statistics/Cargo.toml | 2 +- tools/nym-cli/Cargo.toml | 2 +- 15 files changed, 43 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1421d63898..4134fbebda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,22 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [Unreleased] +## [v1.1.31-kitkat] (2023-09-12) + +- feat: add name to `TaskClient` ([#3844]) +- added 'open_proxy', 'enabled_statistics' and 'statistics_recipient' to NR config ([#3839]) +- MixFetch: initial prototype for insecure HTTP ([#3645]) +- MixFetch: prototype implementing TLS in WASM for HTTPS ([#3644]) +- SDK: build package for NodeJS ([#3558]) +- [Issue] There is already an open connection to this client ([#2845]) + +[#3844]: https://github.com/nymtech/nym/pull/3844 +[#3839]: https://github.com/nymtech/nym/pull/3839 +[#3645]: https://github.com/nymtech/nym/issues/3645 +[#3644]: https://github.com/nymtech/nym/issues/3644 +[#3558]: https://github.com/nymtech/nym/issues/3558 +[#2845]: https://github.com/nymtech/nym/issues/2845 + ## [v1.1.30-twix] (2023-09-05) - geo_aware_provider: fix too much filtering of gateways ([#3826]) diff --git a/Cargo.lock b/Cargo.lock index d99d5fbbd7..4454ef48e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2927,7 +2927,7 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "explorer-api" -version = "1.1.28" +version = "1.1.29" dependencies = [ "chrono", "clap 4.3.21", @@ -5928,7 +5928,7 @@ dependencies = [ [[package]] name = "nym-api" -version = "1.1.29" +version = "1.1.30" dependencies = [ "actix-web", "anyhow", @@ -6075,7 +6075,7 @@ dependencies = [ [[package]] name = "nym-cli" -version = "1.1.28" +version = "1.1.29" dependencies = [ "anyhow", "base64 0.13.1", @@ -6148,7 +6148,7 @@ dependencies = [ [[package]] name = "nym-client" -version = "1.1.28" +version = "1.1.29" dependencies = [ "clap 4.3.21", "dirs 4.0.0", @@ -6478,7 +6478,7 @@ dependencies = [ [[package]] name = "nym-gateway" -version = "1.1.28" +version = "1.1.29" dependencies = [ "anyhow", "async-trait", @@ -6649,7 +6649,7 @@ dependencies = [ [[package]] name = "nym-mixnode" -version = "1.1.29" +version = "1.1.30" dependencies = [ "anyhow", "bs58 0.4.0", @@ -6767,7 +6767,7 @@ dependencies = [ [[package]] name = "nym-network-requester" -version = "1.1.28" +version = "1.1.29" dependencies = [ "anyhow", "async-file-watcher", @@ -6814,7 +6814,7 @@ dependencies = [ [[package]] name = "nym-network-statistics" -version = "1.1.28" +version = "1.1.29" dependencies = [ "dirs 4.0.0", "log", @@ -7006,7 +7006,7 @@ dependencies = [ [[package]] name = "nym-socks5-client" -version = "1.1.28" +version = "1.1.29" dependencies = [ "clap 4.3.21", "lazy_static", diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index 1143f4ad60..8b7f695260 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-client" -version = "1.1.28" +version = "1.1.29" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] description = "Implementation of the Nym Client" edition = "2021" diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index c13f3b8525..03b6fcf5e9 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-socks5-client" -version = "1.1.28" +version = "1.1.29" authors = ["Dave Hrycyszyn "] description = "A SOCKS5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address" edition = "2021" diff --git a/explorer-api/Cargo.toml b/explorer-api/Cargo.toml index bd6fed0ae6..79323fe3fe 100644 --- a/explorer-api/Cargo.toml +++ b/explorer-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "explorer-api" -version = "1.1.28" +version = "1.1.29" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index c3b4ea356e..d54d8e1ee7 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-gateway" -version = "1.1.28" +version = "1.1.29" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index 91f99e9f81..9efff54500 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-mixnode" -version = "1.1.29" +version = "1.1.30" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index 3fb1c48506..5f5f6a9bd6 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-api" -version = "1.1.29" +version = "1.1.30" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-connect/desktop/CHANGELOG.md b/nym-connect/desktop/CHANGELOG.md index 371cf6441e..29fcf45d6c 100644 --- a/nym-connect/desktop/CHANGELOG.md +++ b/nym-connect/desktop/CHANGELOG.md @@ -2,6 +2,12 @@ ## [Unreleased] +## [v1.1.21-kitkat] (2023-09-12) + +- NC - Handle failure when config is too old ([#3847]) + +[#3847]: https://github.com/nymtech/nym/issues/3847 + ## [v1.1.20-twix] (2023-09-05) - nym-connect directory error handling ([#3830]) diff --git a/nym-connect/desktop/package.json b/nym-connect/desktop/package.json index 00eececabe..8b147f6324 100644 --- a/nym-connect/desktop/package.json +++ b/nym-connect/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@nym/nym-connect", - "version": "1.1.20", + "version": "1.1.21", "main": "index.js", "license": "MIT", "scripts": { diff --git a/nym-connect/desktop/src-tauri/Cargo.toml b/nym-connect/desktop/src-tauri/Cargo.toml index 1edef0686a..3947434d65 100644 --- a/nym-connect/desktop/src-tauri/Cargo.toml +++ b/nym-connect/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-connect" -version = "1.1.20" +version = "1.1.21" description = "nym-connect" authors = ["Nym Technologies SA"] license = "" diff --git a/nym-connect/desktop/src-tauri/tauri.conf.json b/nym-connect/desktop/src-tauri/tauri.conf.json index dbc556f694..323b734069 100644 --- a/nym-connect/desktop/src-tauri/tauri.conf.json +++ b/nym-connect/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "nym-connect", - "version": "1.1.20" + "version": "1.1.21" }, "build": { "distDir": "../dist", diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index 67ed6b41fa..88c1446563 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-network-requester" -version = "1.1.28" +version = "1.1.29" authors.workspace = true edition.workspace = true rust-version = "1.65" diff --git a/service-providers/network-statistics/Cargo.toml b/service-providers/network-statistics/Cargo.toml index e718333802..3c40a1ee53 100644 --- a/service-providers/network-statistics/Cargo.toml +++ b/service-providers/network-statistics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-network-statistics" -version = "1.1.28" +version = "1.1.29" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/tools/nym-cli/Cargo.toml b/tools/nym-cli/Cargo.toml index 455da72803..deaa5dd10b 100644 --- a/tools/nym-cli/Cargo.toml +++ b/tools/nym-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-cli" -version = "1.1.28" +version = "1.1.29" authors.workspace = true edition = "2021"
    +d5rnmH8#zHb2< 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%0DI<^P7e_RBAat38i?( z@Y*-U-LjuQ9~^cG|MpZ2gY%;jfDj`y8NplEqK{gDR_RVuqqj%@(exXN(;3?noGv5^8D}YcKg{{d?9Pq&rXPh7(eCP`y=x_E5`{LsDFn za>h2Lm9+l3C0_XuBr|;PM6oC<@1gC?N42LBUjY8QoF(#ZqS;9roH_p#B|wJ5B65Yz(z(H@3c1+QlW zSi<}_*(E(TS;I|@HP}pNbHe!%o?&)eMnu~WzWyvOF1CcX_nh5WU9cV3#L_Y=Sb%BA8`URry-BN0N@jP%kin@0g_B*>6Vzw4%3^a4iQ0kwH;MqPD@X+IqsoMX0yL_k5EiGH1v>c z=brd`E==9O`e6;LWWevb{Fn4W+-mij+xLIEmqwgCoM+@{PFDMko!XaVn`GH3&(5ud z_3#(MWm}CfYNxpI>J78sJ8j>?A&qniO431F&iRQtv*wMDdu2~fFPv^pvVfZ&oXzHg zbhyhl1v+V2#GiwS`0qY%GSE^o%zNUhQLP1sn#cX6e!&zuF6ZbTuBK}`CWgCQ2MH$j z>hKKYauf5{yn=Yzwup>hNB0Uv0(h(KCyZ-mzj35_mSC#bz5*2FXiPi8qfh#=>?=px zy%r}X5D(CV$M!61DPrV$DLV*hLia6M@J3t%WuLL9K$&HXz~a4xxY(s*Q~I%vX<&jpC$O~Pm?o}7T8=q;zBz)nlwL` zWZrulH`T5J)~l7fIwUrRG*BGL8N-F5>DL-m1!HUILMVMI8~cS7L?NDN&5)aVK(s`6sTS)2VVO_Pifp9{Y_3G! zy~lY4eSg#Q&sj3^&{xr`<(Vp1yhM~Pdk@ph+o~(*$40NS>P^Dc-1xg&cM=@7u%72j zdjv@UJAodt)TcTvFH*Ux>~pbRN3vex3#DuOl!%y6t_zjf+s?g!)Xnb>q6qJIQ@tRzY}==mW|{YG#|NQWao^phr( znBqF8Oif#6-h;q&Za1mjzg~sNhUl}a2R>0y!!Xly zQnUH(63EXWHfE~sFC2!7syvP+!3ABqeq1HS?a`-4DkO{&F-J}QETsOiVc-2fv0(IIg@EwA!WyDuzznFMWfs!H-E3KkWk2m@92AF~9UZ z!)5T;|0~h8Cm(Sxw`a&dCTdf_kg#9diRW0m=d?zZ;L!M&=H|oVa}Wx^#Tt`%&&dMK z1r^g0RlR^f#xn7#*iSs|!ItKx#D#Us>E-j@@0Pzn%)LJK|ZH+FbT9fGCW#uFaSz@cduTg8BjX&t9S@jB=dE!^UseKTsbl4wWiCSa5 z?P=_6P(PB4VLSd95*0@K=-%CbgDU>LAgWZ7dH(MU&C2FyQyzy@t_}aQzsH*@@+5cf zZ7N8UWl=oa*k2uBF(2eMJ)BS8Zx!huNGtkXJ?TYUdDFJ*X$9xJpKHH;^)wCR_e63p zZ?7L^#pXAH?(noje8TkvO!jJ>|0vy+`RQdDPs^r1niPnA@1S0z(HW1J^LR&D>(nY} z=|3*bA!dSZe+)v%S+rV>jP%=H(omb6vWHKgP$ewQ*$-JYXUS5)#3ME2I{HF$#?RD+6q&>l>&1otK!1A%p}h zs$jf^ZGt=BpvIAnOJK_KlCrkd~5*HB6hL0ld~ins%Rid~3#wr`6`tpRAyL&%uIP$@8L1CLvWJS_`c zDspeQSj*8rChB|po!`mF(7OwOx8kq})3d*(?%Bv+fB#0KC`Q;=Ml>b(8aev42;RPt zLAd<{SSCo$_fY44?41!;GeFAJ zDrn#_h~S%$GRt|Sf1*yB(5bg=_W{@v z03b2KY(=$buuz+&Voc-xVSx>Qlm$or-3Jd$!B*HAO4%BVta#SXoay_I-10Lx^)A8` z0qMYeJ?nY|9v^icDm5<{x$B4&;bKBAPiDN-DzYbmjuddsfKm@qt3d*-IP`_}O-=%P zhL(u)vPP1CX;eZSE?5K?;AdVwx_a7EiiIdpVAv70WltkF9@#ue_h{q##$;}^g2F<@ z2V@C=cM%!piv4xzHxtA(s`9`|K!Ky?L9}fK%cF{_6O;I2YKR#fqlDuth)bYkyJ&GY zI{RZq*a7kKf+sUpyqH|osc9(?U16opL%j_n00Iny38bREr5+I-8kfl!J3(|EkbAQ| zrQjYc!Qi=p4-+U!Ct~LrFX3L>kmzGSPr?*q)DYH0zuXqX|Jd{3>T;iC*6-&tNk3f~ zVMdiu-5pC}@(@eLap(|lmoWcNeEk_%LOptlR_-WwC*c3?<<6I4TSBTU%lpY?EEe&)qY@a$G+MNJg722WIrR7E!^ zKDI+1-aCcXCP)D~_ZeLsY?I18>u|R2fQNwEV05MZmdry`@shZiwUE^6jHex%bt~=}{Tz2*t}g^j{?dFCQJG z$Jr{R=qz3eszKH#HQyvxq>}j9&{W+h7s2SsoCzc#&D6TVL|^IBL5^|yiiB3-$!7U- z`^)l$mBHLV$pYz1XWO>jJ4g`Rz-9OR=LZy_FFL>nrOG#be@qL!3;R#VH+aa4T%Fd) zzL%nY7X9=vYOP40-KnbVe<6+Y`{wLAjM>;FPIQ50+gg>BOKRa{ewtEb`ZPO6&bE3xr)e*9Rf3!;rD80Oo*!K2V3 zs;wn7Ts8HcJZSx@gF~~h?Xm{rQopa+hbxes8Hr2#gZ-%lmuQG+`6hbIXp@tder^6| ziy%qUZoa_QSihebYpd%q^KuX(NaBI_v(aXMf7Yg4sfdzIB_X9yDmrZ>#KpO9LXrK& zgYQ)Xt}~Ayl@~-<=b!ebE;+ksC_v%L^Se@O%_e9opgVD~Tp80Fpu8pmt*GKX9@L#| zo!PNxXJ3IpQU>7yMPW@oV!%g^T!%gI9t8A!2X#_W@t;-zlniQLUJa*hRuxO*h~0d! zYoZT=K(NcypaM}0-1)G2XYiS6(^!2=!+84aa3~JclU+|;a&Ec?TL}$aGu!G6e zE;q1T8?Rj4uGNalVACS0qqw$Za7DkCo7Q;gd>n+6u;s&o_8IIDN+P6Ju3r6K`-DHL z5c-DEReU5o6W4=9SM?={S0`@b5)y&XP3Y34bLnFRWf4qeW~&wXz_J|)y!?8F#z@Qo zurJ`ww3I(WO8e8i-9Vj@EpBQ)+yo~|qpa2yHhvXg$^|KjDqVIfRgkB_If1KWhURj( zz5wO`AN6~coOdBzpeYvAj89JH=g8=r^$ar~L=Zrf1fnIU$&WbYmndY+Ta1=vb1z*E zss@}IraXW$NqVYc^DkQSt;Z9EE1TX{7k9aKjRDtat;Pcf_&I1EhRPS=SX@ZSxt}GU z!1hGQV;M8bH_?$q8Qp##m9ui_#xiJ-0M_9jKYo0JW365<6wB*GtEcs*#XIx`%`0Kg z7N>N6-d~q;^#0S0irJ4(o;J(Qyi^Ki`$PY>>g|?r?19oU^=e`w@x`1HDoCw z@%IVg1=s-J=i1Ui*xz4uRYR3Xnw$z^X~Fo)U#gh>wd^%`=iN&wM4U(BftX zx1+5GGeLGDS?|>PEvlZ6SM${v#{%Y8yv*9Q$QfdnZp^s)TZ;t9@9c`4XG3ua*nBnVK1fN9#j=o z%G2zwQvHfb;hFGc?B2FokWltpswk+!`+Of6xA!yF-~F^6HLk$e$YhDZyj;9C|E|;_ zzR!9unxkKzdFOQ6&1Y=NWA#PgN@eq2)sYk1MdVJ2vv!^UGx3(v&l`Im`}z+oyBr5H zDLjjtN@bR$eG^_HVR5s4N_&8B*e&AXn;~-R6w+3A*G4v&NJ68;9)n5D>7&`ii$c%A znSM`5KYj@!+MQWN@}!QYs{|Se8B*N`gj;SLqS|gEecFyqf2?*&tPHJ@S0Yn9GSPVC z$Ktrj`TUr{;Hh_E%~xVfKfwL`*BH`9YqB%p?3KxUZ}6q{7{IQj;riCQ^~I-Li?Q=H z|F8}7pG;49aVa(J*OQIEY5Q$c0f%(~t-|AyKs@LXSD59M)PIKUZ2&v~7pf8;(LQli zv|jDtm|=n~Q4Madb1SAMy|m4n%KWv9R}S|!wB@pL%bnz#Pu8f8XYu#qyYhrcL^{jQ zT~Bm>qY&6<29+fdbVBLyA^wdO-hWr`1*V&Xd$Z zDw84%MJ1zW}3il3j4D0 z^B@Y&`Kuafa-`7qW>ih1?YR=dvQzoxOHAmEsK&FkrLD1|kjGjdsx*s}ZfaIL%tTQz ze}2~gbYRxG%q|>QZZKs+yc(#{6BdlJ-2PZ+Zr}L^lqZ}$9(++&MkI321W^k)GSTDX zSK+sOh%X`rulqZIALrglxeEU$HYo|P55(3i{$T`@1Zz@>Vg2R8SxBY0e=E#NQh~J| zN~%HcbQ^vSj=K@>;iX&doW752pNBVK&aWuc@ABk8KRdnP2!-5$3u8D zJ<2R%yM3?O?}Sdojbzm&36Lq_F}^NK;dj*IS_bf<-8ZIxxLySs1X5h#cT#2#J>q?E z?FeZEUM($|?e%ql$p5m8^-tdLy+h2(;DvyyVB&ggcUJx<#a)OTdGL-c>Jr-N0Opz=eE{xz>c)rOr|-2dVn^HUduP&OZsy0w=`DlufceAt=K`DICa`j^nB0;Jy{M9$>KF0e^X{34kd%^ zv5P<}!BUa;6DKjH;)+mFiv%bc7-f&+EfAp18ze;{`9bd#bZ2N+451wsFCHK-*)Y6G zQ@{6T86M^3ovbq%h@CuF>l0-xHDKnf0GlgRX%9k=*BAEMI#ddYcJxljqzQtJ0>^L#%{WERSxX@SjPu z^9Q+51!nBE3Sj@e=eD+zqb@NXeA6};egx6P%y%c5L9Hd{wMb;A5w%sUrE(mMWB2(E znQEYZRfCO6@P7U4ZR$+S&2FGQig+dTLW!Mz5Q?GM(t775w32<>U8i1A>;XI%*Tq;) z!5=+V79H$S@2Kvp%9BiMYWy9_v*;uoS&^O0+97xVMvyxmtyNplNwHs9&7+`YS2BW( z4N()csK$EpnICQy5qi4F%{e=t{kMYTD^#%DhYw`;njP&311o34R)?0~zt354*2mN_ zyZ!h~omu#r&WNA|=17m7UU7JP{iB;4@~M%k1sW;eU<8u{S#>7npvryYrF)bT`~UB& zFk)d3wp5DdUk>Id1Gkhr>Bt%+@dB9OLIOJyMNpivw@pO0G$4)nffJR0qM%KGn%9bN zGHr6(=y6YEBZHN2`p-MhffY&uWlR0>$jMo7OwLrwJ1fHsY70akO)9KGUXjXsVGY z(|pjatfs&ff5`_~2RR}mj*QhxL0J0Er#=_vXiwLOC!IHB;Wxl=ym}xXE3jDa;sCyZ z9Jfn25&;^Ee_P7~n27r|NMh2Rb<{3h`Ue{`a69qftf>G`6`WjZo=U9WT>(zid``kB z8Uy*|9C=S*gjZsZb$cPk7DbMhA>$E01fr&E+4*~_Y})VN&jHPPTcdp}oZl6dAswX_ zwsY&H3mKDC8|bOQ-dLuYA!%FSU)EOeiuxJdWqdM5aEE~WT^)99Ri`bbbYrnM6tCgS zEca!=$!pabLMmDSvQ#io46h;r$qJ?RUw-nmgm551{zTA z{MT*a;H9dns_^Wg$t$3YZd)}Prd{GmKbg2LO=upiGFiqTY z4}wydu?JnLCMp0Dg{&2DOnvxRytt(Qm`sl`in+MwYu&fxbQi_o8j3=<*W8|AX!COZ zqgWKSW#e`)!A-b8#!m}vM)M_ar)X?r0iWy@pP97nysdaS3$|_3c4zD9qcgitspk0%hSZO+o9WvtB989@Ry4JHuuFR^9ny{TncGKM1-5{FL-f0o39ZS9 zP=s<#-Lc00KG1 z&V4JIZ5ymMmG|3iWqG;v?O-unEH-rR=9r~31cSJBJDMGZ5I8-*|1eY}monky1>zNu z*|>x(FdrS8@BqU=_;MJ;B1bc4nQ*_RMEm}+5EcD{DMvHs>g?VMV>!t>n=_g@6=ONt zM;}Z%_+uv=xv0{m_l-~2Em#!eUw;haJs=v zLyY-*U{yVUjsvK(>fotmeV!VHvOSMc9wEI#*z7SbNb=}WD%AVQhLPZx0cHlSI6r4u zoVgd5LGdP)tbB3ldQGOfQuur0U_L^7o7B7f$rf0w(fOJu(+4C>QVF1gg9~VZYEmr> z1NP&qHy=6NU)*e{B4*{e=R$3;H2u zCrY(aU#(GZ$$)lEQ7YrI&)Gz!?Ff>OMiO$Zg-GzwPTVwhqP<_MOn#IY0uUR8oRz@A zag|s>c%4A%qp&#O4gL%4akvkV>4WRNZ;W`TU*^RTc0@BN7F4D*djE4OD|(Ay!@8?A zJbAJ)Sx&s@# zvPTpN*=3JV2-!u*URl|zj2vXkOfs|go*^SMBYR|Lujli-pXd3b>*~I)yUyu2-|z1; z-tX7jHANAUP4E3sHxs7d5vxPlCd~L?pN0W7Qrr6VQML}VYk>F+ zxwBTPVZx{TR(qna z4*a=lT@xXGu*hz)O!R6=Xip(!0hh4KWpU96?>y(DT#v5;Im?v+jo`nMx zeyj2*9gpuHPJwKpLNjGM@zpP?#v9{!emN6`7K#RLU_A2*0CJ0Zt|lvHX!u@|*2N>Y z7cJKJe~3KlVAL#i9bL9m#b8=qxh6Qyu0kT^t0wv5n_e4~x>ZXFmI@r%U-c!sYy37l zG;|kNfKZl{lkyg~!#TJ;T__pXczXPF^qzr^2OyDzLK`RYa-@a?%5A2Q?ZcClppk-x z&UyMh^Nl4Rmx?m!q|Hh#^TEqx>^O-yi&vU_{QTY#O1Al5p z_e)(%57m;Fx@|pZ*Snk*PsGBvH#hd3+!Qt&UX`!Om%eg|U~+wtQ$V!tn2jH^9rIS; z9<}P9x47hlC`FdI4buLQ@3wXNT3Q{!Mt;Tmg_8vK%^So^kZI=Hq1LHO5$Ka0=3EsF zCzfaPw8>K_>)oUKo}8-v4#m_tz2p7Gdr>s~yu$5y$-CuJ$rElG|Nib`>kp}=1g$@Z zbseqOktA5%eAbT_(5~V9c@h-7NZU9E^(C>t$`qRrW2W)b}KInC1xyW*= zj_(xKmHUcc>^$(k9z&9Ey8N}Q*vX0d{?YiJD44|(vNd4F_SodMS?L>`V(Y$$NgHj= zIL>dA78gPaS6A66i_n7-Y*EIu5B!d{QqTOGqyx9lPrV!AYt*D`BalXk6$^T!iB{t$ zda6b;jN0L_wy62?O%<8<65O|*xCdlhqF@;7J%XuxA7}{?CkyP~FmN;%x}~&_Yquif z6|xj!%Rc@$OZq+7yG&HaA?DsO-@t?Yfru@9%$j2ndNzatUv6^u)q&OHBo|un@IT3T z9Ho#2bQk4B!Q;>;U)LXXYtUj7(t_S&{|bUcK|{y71F!E-grp*Qh(#2vvt_xi=T}_C zTEN`vV+H4V*McoItD!8=hhRwsR|+7zU{wkOL|6HyKI@E?9jHPXvt$%jbz|F=2r4rD z!tYs*SgGGE{GMJO>mer1OwzhJGnJ-%tK=kV?1|N59_l!UzkrEvA zt)J*2uJ!#5efd&&B>h_m#+x2ERnl?FNg8&EncE*V$a!=A7)Et(&y1?+wk<#baT6c5 zW=g^zZalB{7m7OmwFdy8hA!XbOMe_frs;iw4M1>1#2LU9opTe|WrFz!oFEF(H6_SQ zM~3mCYF%-L+4-?UA1iH`1`(#g(^>uUE6=)TY7Lynv+5q#nF1qRaxS-*=K(baL%7MA zd_x}-{wabSnj>w!d(m(U?7Wa3U6PqX^P!!MtbdbY%8q)(W~}koXf2^K-u?IRjc1WD zk;NeN_y2Hfy=pZ(5%`NA8ZIM^!q1caQ6zb4X>TRGY26lxps>w;`<_X!|9Wqi?=q6U-tTyzxpebg-DGgE|sYvc5xuh~F|h z`?&=K<1ih}gY@N8L_@y>eDbY#!`UeKDH84uOjCX&>MqROcC?d<=i7nCm$-g^=;s*GL}H*2x6nv?zcaPc5M6X2F;*Uf$~lWX z=TmWxEEq9CLlF!d={zmwpiC6dlM3n%p3}bFZc^J7X}!ik^`QiktKlMMxcDpr%j?%HWnq*0gv>AG{6T|4GtPvkH!2-{HH$vEuL!#6kNleB zJ`7elL=0D>B1tM1yI4~((%@w;UFKg!oK%Css*U_b>z*ixIR+BshkpL-EHNt_1mRt^ zlhZeY1|MxM*c~kIL`8V`r=I_P<#B#s^AonR2U|1!pZH8F=fiDwVPqOA_4%FAN`1_0 z#;#?MA;-i#^*G`c{{d?T*PXVuGf3!`VJGjf^Q)VTmkPFgE$pw(14s*Oi6LfWc!`X@ zkY9)sB2pbNs|wCvgw;dek-7lS4zz4wPkc}P;3EsMR`jB@KepsU+% zl#QmNUQ1`L&r+;brx8caId6`2!Ca#m&7t;m*(8(JoD&r3SF`k(sleUTT;gG|d=xw& zRM4_*)H0Cyc%%C{v|v*qq*}CBq=KC@g_QR;9J&?kK==WLE@aeuEIxoJkFKJBFl#ty6c`fkDPs}R{%8)sa{~+yY;<6pdQaK%zMUz5Jc;E~CPKf=EdMpoz4p-NBlr^H8M_XQ-?<5dr;ODnwPGK__nUd&YG{Cn->H^gNzntqY=xBrtw*&9YVuM5*g#QbwJT!*U&EPVSd~(ACqH{s+9($nlz^l z%hCgn6(Z2Vaq5uPd>(reOtcYfhK@xr>u}#Q9C_x$2HKmt%Bx`X&O`@(RB+df$AS%F z35A&z{w+RVkXk|hz#Yf-aGDMn0T0|umSX6iYvYCCAt{{q9PxAZ%cBrgq6k*)s*+e> zlNPx-JRG+IiI(rW@bE~%Z2hTM<7|_kJdYfRHfdqOByx7#&$~UWp<37SfpPNkRKMs_ z30RI!G7LP?T|{AR$3fml*ePe{TaY({U3t8eh)xhigd2&503HBj1lod@JNO9C8gi$pLOy+<+#1}ZKu7{q4A84)uRZ=i1)SWyYu3d=xnlBA zv2-q$AlTo@@+S&W{p4pYPo@C33eA{Q>m9&F6N2atge#(|(12cfuX7iguW$LfVc8ZJ z=P?I7&l5j3UZ;w)yw%CfQg_p}?{c(Rr+cO7hfw{}h1*!Z=x z=T0l9JSVI&`)kT6Z7r(jrF{Fx4KKPdSzo;@7PHewtCerqe*Z{)I$t=fmFYryE0^a) zT30<=Jrs7bke1N;R7-z~^QsmD26>WrT*!RK(3mTjIah92qoh_C7;!qjQQ`V;P?J|Kh?jF{rces z;dgo1$*e(_F=dHkmz{eT>h_eQjT<>_{7;7*dFqdhaqHgwASl}3x26^z{+k!Iy!+|p zzZLmUJj5?;`(J8mGDpY<_n6_~-xB=6>Q;MwU((69r|w^Mc!x;e;G)P*Ye=1{%jlN# z$;OgrCQFpMJ>0MS-qRizXU(Z@I|1ZC%JN}qEMBJbSwD&ChB9FZo$iFbOXh0-o*Z+u z=*7{zm39MzD=p2<3z6_cqh*3W9~F6xex^wRA<%l#YO?$T`Ni4QHsj*Sei6qNwdvFP z!$EkUWTN03F{l+=0>g+7GbaXr#AsqTedd!~Rmi&*yp32t>`iy!%@@BTIe_X`&!RO#^q%?m-q z1~9en;6s!#%wPev_23F}f4~>y@QZtkCP&*0xL2bUvc`Zk12Ue^pFjUuSwFRFe#(3Z9``IzImlXfv2L!Z-Y&T+F+p zfBp}k`UcEVkU@F}77l>;hv%^AXn}qQodM0_NrAoM{1}+{rX+V9++N!2-|x&hIS`|& zCS9;^E2{j4F==-M;)Cu8+RB;B@qHp7u`NCYU+V{J%|5RSyYkNHm`FDN95_^gvOBzN?$F_Gxs>i>#8S{ZDKL9#?{#QCw3G9|H`TAXeFViRyANiRjGwO)U;5Cvl zQmcDKoF@9qyA11S)b%QkFZ(>$hwg#mL+tR?&j*kiPCzZx2oAN>Bao^5_XZ#qXX}a~ zg>XTh0>%UK>mfu}JD$~+*TyD`xbQ>j7z9o!7Hj`=_@|zZ!fmZf@j9`94D!RDpi!89 zcq+$yzXW0nf~TIbdVYz-IYTN)EWGVY}jI7T5)M9HQLFc zM!1{lSy{K`ih5HX27Ucn4^N-8Vmt3R>td&#XYdi?E%Bz=G}Ma?6lMj;F*l!K?tzT$ zW*Mh1bNDEOFHaBq=JKDPv2RsRD%PZ&B5=jV$QU(2YuvcQG6(tmKU zc6NL-p&+XN^cMwy-NxHPcg;sSz+y;nWMA?i#dYplLEX}8(ZxyXgB89UkM$iS1@gD& z;lodXA*3X#{wAEQ#ZSVu;4L+r{3<*GqLl38aOx107$xiLK(gALdkh&(f%}QB+vJ3S zABfXWucHbe!sO!%r+#vMN8$hvw4r-5PS$Asdx*U=DmY}_XQbtDK8&3Au>uIoB`I-# zam!{gWwEu6hu?{!`)`NovT1etUCLf&{27kVe5ItMBTj=d@6wF;JSC6crH08J1(F8W}@IP^b5-4ctCP6w&wb;9|f2pmF|_wza>3YQ0D&pX-mUP zp=v`uZiO}a^qZbeSoSJHjk227>vvoJurR2|+fu^iPXrGt_-VsJu-%D9?6^yH7dhRK zt`O#N)I#?XA_)unKOU$~}@W5PTq2K$$L0(j; z7?#_B7L;l3-cgu5a6(sf7dhUr&F_Vtxi~pH z@X~<#fHBH&_{$SXY_<$-F1R}Vu&#s95zITM2gflb3E7w!!pcK%lz?zK=Y~63PWkXH zKHx*r7YV!TJ@Wtxz)__~Hd)^F(ji&cUNG)uPwZPpV!wn0DkztH^Q>%do}WC06$|q_ z=rno0Hcoz=>&9q?=@6_(yKe5v>9fXvHT-+D(@GMeF@ZMC?K?UUY`!Jf^sRzqPUY#T zQ*F4#8rxzCc>BxiFNC3N`aWb?J%y^Mdl|2zf00bC(#W7v{*sZADKsF<)q6d~&7>VaGNV}z|39Tj< zM<(CE1O_yrRtmmOcda&wXp9d(+`2zFX8R5nN|_@q%OvFO;kSA_qnO4IN9tX6=*PWN zfgB05wh)%^v4MZ4NMi~6&E2-EP$zv+!DO_a=wCN9VAd2e@Rz``8>FILqoHE8zB%qc zn$o@+qTznN>uwu5GcU6#eeH5)T4XGHYw5zkJ+c3fd4EPuIGt)J&m{dfcHzmTLG|W_ z%->_&lm*gR4Qrnwgj=X_@39xtU=w*PavJ;@&+(2}x2O#NkR23T0v7|wDgsyp?oAm~ zWnmp&&Z2Er9nvNc-k+bekOx=p(}njMiQ-yD-NhPK#Q=QsI_@zrPM}gaHWixRc=kGA z;}$GL1J{qx>MW>`X}YA+yz5t#`!)0nB8EnBy!~xkJ!}LYmA?MmFq*?mD=dm*!>xOM zWo+lsJ*vfZgG*s$<)9;wb$7yMZ{QvxrbXc4d!i-d_%Qy+KE?`B^nus}pum#KEOBRdF&`3ma}s35tm{wasGOo#A-w|}Hjyz~8^ss(r1VClL( zQpjY`c^5GEj8!<$QNQ{z##evUNB!^g_sO{GII2J+!%1g}P)^+hTG)e3#BjnuyAXj*2gd7wMAaZxpE)`gD@bQNZ>u|WbhVLXiCr!u;q7A?;X z0idk0i<9Xi!^2kq=;gcq;}f4BG)VeW!r;pt+dOBC!U0eM@G>Eqkv3weVv9Jd5=NxX znU&#wX-c7N(R0%ihh&9Sg;Bhu0JP=5d6V60k}xMNwMpD_`(B)A&8KMCAGgyBg9gCDI%+cQl)}nS_gL4j#I36#bGaWwlQ<2 z9HCnIuJE6L)z}?mmALjR&&~>)5{r$Y+9zAyzKXHSl!O5To)t?0ZM=3nZFo<*nH+yV zECUwRvd&4jI`leJA83OZHG{v?NZ}y%Id8jOfx6ij=Ud;Ge=K!fdhY6bUk+r*Mh72r zTzlxW$uXIP4m)gWcIFV7-J_3pSi9a&(2PPA4^-Yj&@T4KF;9ktlwP)-c}(rkzJN zYIg{U=ahW2@kBAhcb8?^Z*y>+5D=$BMjVbu06zl;Y@L;uYn*y_MS!;K8(WexFD$2dgAaVn(?{9=ALkXQ* z8?g8kz4r4A?D`+h7=gH9Sm{&eD_~^=ikOw}R<5Z4CRe>VV zoQyj`+5*wB&28icKOi{)iKbvMI$HQ?aqr6@d5R2bO*MeXe8qePXW&ASGwKFZO9*MH z)64<-FUBlW_&Z_CA4c3FOYaYpv74iNKb6rxTYUL=`Q{$gqt_py#o3+MU9_4!5Ds7G zx1E(BA-Ev1w!4Ae$h=d1LHfRQJ;L^kNsxdPL!sL7#$O+_`G4lXNrZ~-MNR};6V1SsxuTx6G*f0NykXr9I&HaMyL(s%EnrT709 z>1m=o7N_MQX{+gINYP6C>dsmo6Msfak^dt@iYL^sBq(i(Xow>pp&oXt;ONl1SATaA zo{~?%sDQ#%5g|tHno&py92(2dUFA$OQjAw-|E(Z zPty06W>39Bw6y>cmuOSp1!!AhsWcR0wDJ?3r+v9Oy|Am&P`L4#Et#9kr$|PEtdz!| z6iNI$jN>&?-hY1OV;4UcyKM~ipyO-x!44K-0R{q<@21Nv?iQ!+Q}u$ne+_QXJrU79 zAKl+GpJDwqsK7;HHnG5-~zf$~Iw$iJ_Wn)qvQuoP*s%Y5QvWmGRb#y3^;_<|@O49^iT>+ep6fL0JloF01 zz?KX4q!r(BjdWu2m$7U^vTA+T3@g28ai9;~1^-+M5^!dH&zaemAIsXQ>udSH`Z8MO zjmWyAoeaYU6dOl%#^})UvX*F(H;ng$G>1E5Y=q|j-6gQ6%uiFbo@9(uyz${N!~?24 zSVRqS?xxI$%gXs+)Y$hvpBQBKxbfvDDLM^}ZiHmK%Dn8&=fN!loB3bA$dCm-QvJ@I z*u$9FsO6PoPu%92GkNj7!Ni?+RN&dG^ydaM-UgdBN3rJm)9-}>^;3DZ5f@24N8 zD#y*lT$DFF`I}-Dz|%WOp_n03s^UIeFBU|b^6FHqJZPlMK=`bnus?6;JI_JG`01%7 zMmq_ciBF`q+a$su=h&sr~ojt1h>U;l!VT(X|I z^0ecoJlR>EJ9M{pud3(Anql+bh;(@P-puKB$tMY`w32VNlW#fSKmN42mvxWu;B^jN zHBRs^syw3gq33pR5vXZsd|*+-*)Ai9-j?z|(mvyPD*W!^`24arN6Zt=ruO`$kqVXQ zM#i1WZdu((r#-{2KI_!lg6YXW1U>v?<(TI6U^m}h(1^GZHjaZs{@63t|pZUJ}fl~iCVZhTu$pbJoSr>AM7n(#vkt) zEGZhCkf=V~XEqDLn7J6K_;fkf^ZwS|SWq0=9Y$;|A&~Q}`dydb+l80ipPpn~=`_8| z)-Ub$0{c-}o%X${v+9Dv$uOtV(IfBW%P94>%OGr}oa~>N*abSk=ezu^-tF=2O z?|5p*PY%iU_c7SrJP zoxbr$XR~{o6J=qGoX_YpO+m(oPbCxy2-)-)W2l2l1uN3Z9$WST0LBd#pP=eT;yA%} z2dgKAT!|8c7bUV;p?JeVg^P= z0=G_~9Sa%J<7t6g*ZlPxc(gK_)kK4V3jQ=6jM;NRA_&(iScR+f!l8795~?fH0Y<*w6Z z<66Pe{u1s*Cxx7Y@q*x>(*BAr2BajEI+uPm3QC!@GL|SgRB-C!Ti*yQG@fIYY(2`I zpF=C27n1Cn@f|b{COUn{TFN6g@EWzNQ}c z`h1m#PAa)Mr+LyZY74UzW9Qs3YerXmt#9=u5P1f%x9-<`d>OWmt;UhDAM(Pk<@iRr z>Rz^kMU?INxoL*U$B3;UncezHm*o4O^msa!#V;|zJx9r+{D~s+P8k+M^S>k_1_FMt z_)6hq;&*2jXqN@97u1Bi%;*R6VU0S8eDf@EETW#91}RT4D;BNctKDj z(s8e?Rs3Bd@J3none+y(R+qy zf>u?)Lc;EJscQM66{-|*WCK1{&OEdD7Bq@8XG{0b=EX0VI;b7++yClt>nk8V0#YQN z?e)I`ojyD`if*TD1>MMuD5{CgFA{65ABrNaD0oQ&$5BxmPKEl5XMJG%+IdKqFK`{n zB{oC5#g2(P1j-w!qO5YV(Zf!6o@f@Og)hWRu)~A-%UVp{Sed1kMI_jhssHp@87ra@W+< zyyLWX?;QzyADPb&PBB9rP%M4T8=XDn0dpTSSr~+_!2yHXNkwP}Ba<630px0a9dgSP zq{5d;!l^GDE6)!P2;&O0rcvRKqF=5`JL5qk%CqS&RoWi`w@jouq|MluM6`=Lr?X!W6M0d*Y?1Mu-2g_U(mzC~wz`EZq4s+q5Yx`kMl zAR{X)0OBhwb?=tH_s_EmM)x)RT^2{bFB;K7=bdEZy*!C&(!BYL=r1oEIU*Paim8h2 zn?_(+1QWR@qStTjw9rlemp>FpNJH)1eKCfP`3msw;YeOEJ9BJNb=SYc=hNKphp0!k zpGtgs4gh>z%L==Hof#*WRE&ndkNBwXu2GbO)@NZ~0c^0(;bTMDO|0gSWh-CazK=tR z>T%m?BY)B@ixa{TX!>E((fqdbQ~=TGof#$G?3879^DIBl9GT|LCc3|71%GX%hMQQv zY;2t9UwReY`1dW{o{~mAf@TyBMuQ3!^i>QUJuhCJq%s_bXuJ`5E zTbgksk? zYX5DsJyKxOaG*lmU0l={Lca?#xv-~?4Ln4_1&Ku8p zYX0&AzW?CM(vr|ecuv3$th+fN)S>S|5Mtn!6CKH)^Cu;nlCf#o%j??-LU;Pi$j*~2 z|K0c)7w$MDv5!I;nKG?BVat!S98uHK(qe48$t{(k{0D6kc@Z-Z+eXT9W%qw-8jz*? z@GMl11y91#(lR8Z8WvU1a7ckn64nQD?27)CjFid>FbR}?08zGRUm%YFp8`AtpiLsOI#&>un+y&AmT^*clE5!zMkrT% zqA=}(e%J)s6Yv|t5b$TNM@o_JAba?YBIU`63G=hGD41Ylq2Wtd6l(meU6&bmm(Zb> zJ8jT%{BU=lEOO)J)~9;?iozm-D9l;IeFH6294iuB1y5#tTG3CiN#`QNL(O@#xo?pLJ{Qb%{s4=5k#}LZe1*(iqnRKemxI*E5dN#{f2Zzd`9bR z%jPm}OaD~A6qkUUiMYmlrY4ZH-UE}jcKhn85|z>9AN1=3_cMB(iKJ}jKis#y?BBu@ zG4-ZS@HKG)iS~T8m)eAOq8bHHtC%DXF{+L1W55>A!b()?R;lWK1((B+WY${i4HeT# zy3|$E3>tGWH|Dv>{^eq>rcZnsF!2v?BPZ%T(I5Mg=K8J72*l+ZYqmxU^sQb$9^ka2 z{z^@-Z;DTtQ%|l!);%%+hMSx8_S3&9s4G&7DfJBTTp+?K1`!BP<@Qx1EZJdKo)spL z?&@@i`rd28tNmwDosVTxoigxzp~bGv8e0T7*!^cc6N!(ANl(J#ou=X;uLQQ2C=17xQx&1jdByuL2#jyk=*$#ws_jt*H?c15)g$^1&+~8 z4h~^cejSJ{gK9J%5)DwU>~&MJVyT4wIlJI8Wto$aE6X|>jH^dd$t&kVIX|85S5bSP z?dZ8J#y}G2m3Otv{FnWE@xT#9=0!7AOEpM9C}QHZnyIhTy4;>$S$7T)8pu!A5G7+u z>|x--vzQ$I^~(<0nw^DcRS-~IwyJK{*9@(PN$K;}A2A|@&2@JTB&{^D$n^T=qwSgd9G*8D{J-sgaoZnh1>Rz-%N?U6lIR^!w}6L4n2O+-*} zaSmtS=H+9taW%@ybhkz6X14VF#s(8)M17Xshwl$Z%V%A+pZXC`?fFlRq*zD_2VMhY z2pN!BXeFrV>G=>0x^Vx&HxZVlf1zZRV^&x9K&N>4)-lAc3Vv{mgYAb;L&n)<(#+xf zc7Xpt1t@kPtZK8P1{JQ|Lke)QK#IMTLgIY`?=np?xzBgn)t)^I`o{(uYX}omJcGl*Ba!zd<+iiAzw>oAF#X+m^vLfcY`M&F2QUb*i+K9Lhfap}Qb4>)@Zm^Q|j#o$ne;;b%~8W7Al2 zwYi!N!|U6d!{7VMwqil%vTkl}tm5)3eb*(Z{18A;N?Kj6?1%`$KmLgI>F$2YMjS4go zgQ6aYgaS(0qgg*fUw$($+sMCeUj6GDqkH!)`|YmYXzxF)rp01@-2x{J1dz*EUhceW zf>Uz#?&~wQ*I=jfu78}ntn9pgLKRN=^Z8)zv$N$xr1zO0%gVHwjD-mobw|6CQ~#+Mxq&Fv2lBqxe&5-%(EqS@gxf=x z^&ONGZ))}hRm4_JU%2lJT&_rUX9egrs8Nf-kq-|>I5}(1-f%q-Gd;GQ3t+?{K&k#dDwz{&d$bSzYTwYtN2BQ@ z(1mj8l=ue*1`amHO7Q~(0K!c=|5*%$u+C*QR&sBAeEuS;lGR^En=DWE%{ zZmW%6Cw&OPv`7*Z5Qyo{fY?7<=!xxtmxM6ntgScf`eYfK7?u%R7`V;s^y8q zQw2)&=K(>{3@0mFo%BBK<}FZFpyxEqzSliJYqW#D!S#jhJ8(4)oHW*Sw4sl?iZ%h= zH{>>#NB(J+Fg1p$Q2uqBhVy4#?RV-v{*m$@yGs)APS>XUaoaI5M*mq+3*x#SlVWes zeEBf0XJe=A;ZrW0;#bI%V%#ilckh(0anz?S!^3Yq&>ao}-J4!@IZ9^n2jPBZI>;3U zLyM39=@qw|u;tiA+NPvEWG<5U#?+B-xb6P0OCo1EI6ofsZ&NxT*+@YK`c0|7w~*lP zzTu&&nyphvyE~`f%qxQlf&FBDMRASAeF$}jHTsKJAb3jdV-53t^5`OLUMLG*C_oTP zU#-|3iuDJFwGK$ql`ORz1~OqrK%o#Z{g$VG*`(*)@BtkAU4&%}D+wOptH1>>g`*<8 zYT74uYSkw+j}HSpQW#)Ds7bCc5HjNxQngIPABfjy8eW zN|N(hZdN@f3l@C#1PcD*^lcWf``3oI4*$FiBX@Mj28HW!gCoXPy zS(q_K0SzT*m+_cJnm>Mp=zXy;7j5X;T3Ib5yIGBwVD{j4=e-=Hi*!bCh159qm9{;E!FxAZ9=2td>4@=m|+i$WR^F zi88sfYWL%n)C~;!L9p3ZpkMP=t(HG|2@Y>VTe=H*vFE8XjC#x#&2ZSCJZH+n7ZGhm zb4h!Va>-w%N8pL0naC0Ac)lBBAZ9A(!EnM0Cb({pFkS{O(upx6OEbt^30!t}^*ugrhztCj$Aee+6446!Jd*jZj`ZXU(E4BZm$fhuWHIuic#AHq00o3%}M-i+Ti{> zBu&%CFRoyro?E{8Jx3ZRHwWF9$X&-1mj)ufJW}C`d<}1n&toyD7yz1L%$X<(>z~i( zt9g*Z@%UekcrRk>h0)l!vqJ9Ri<@&9lCWVLZMYE7GVl~Ar%4g_#~GN}aOpHt*LNWdwbPJ>8Y?Lj$qZNn4#wmz+f}nTm<9sBOvrg<9;#7-i2!aN!30g=w(gsp2)($MyVsls zRU@+7nSt=~;Tf_(D{t2gnN~&aqda7gNGMTYX>K^%==1*8{cvQS2p5tR(d|f9D}Z^z z4hnX2wH@w?IezL+H&~Pq>M{I}DRQk0Puco8@T^pOO12RQ!E*pl$v8P(?>;QXb&B~Q z2=<8J8!DncP*gdcQa`tV?=3uY;9Magiq4zA$2aA!b*1_EA^7$i;fX)Dx;X=m7QlM| z5am1Vv!`O9el>;YUe^>Y4v|^_hJtEOURPH);+7OKEaR_y)2{Lb6J8LqU&XZxK-VJ1 zx++C&h;*NjCAf6ycEQl{PU|_J+pY{qPj87e5}n?U^=L_UnU;se*IfxQjLq6TmF}J% zVks0#MVh)`v%kJZ`XMIzdqH@lWolC8G_+74pIFNBywHK9j(F%o1-nL$nn2oD$Jr^H z(@Y}SlOBT$UzGC~0&?SqpHCPHSWWMatJg046lJ@<+~&2PeC?E1CO8FT(1%BdDIE52 zb9v0P*fGM43WQRGXG7wbH&~NwuNu^?<$)qN)xzQpo(MQaJpFf{+IFs0AwC*dr6+h_ zEPH1Iwm9>EIHCh&{_IjWFC(Z3FW0n^E^{4IYtQ+ zRkSu&4V&W3G^+HcjIHNL#OUHN?_QX}Z}9HxH9_i!qM4bQkI?AU3nUs2I_I{-Uug2P zq|NPn4^ecQYls1@^JPhr`*c<9b~B=S1oG*KI_2BRSRoaRERPo+JCEMLR2?p25VMOM zB{ozg!8l>s>(qMs?K<}h&;6&<9(&i3tVEFcTEO+#vYM0H_vJ}ONQVh_t9L0^n3W*g z(3+6DxOfQ-h-P8oU@-|oJQ^ghrGwTTe-ZoI4bY}QH-OOU4!(X=-yAw$+B;S+Ij+GY z2l4X{(22>360;_E`QI?L=?~&Dv&VOz_SdYq@**ze)vEK}Ac<@DcGD({ecrREL%neE z3s;g51QrKq9?Zeu2N5UMlTh^?)#ENuD%%<|;i~vATa=HyVWL%3f1wj_ns&$2R+hO|in}iX^$NL_yMup9 z`LMD`VOlkFr~?B*A`}Oepp~{-kG4Cggzq?vIARe}!gXbmvpMYfJ}S)XEz65DYDUrT zTP9a}kidE+v5tel4Xc@HwU3SXW1Z=$^I4XcBF-p}0$7puR1Lq$HCa-MkhwbYtpIpZ zuTlJ&>Xdh$<*?g0ra2nklgVhB+o{h_*AjQ%nTfT?2d{Y(_p<1yYK zZEMstl0R8_ejrk{QLfueFolOg(^=VFFKF;N*_aGVp{yUtI@fg3w!sawsO8xK}#4+ZjsyzvZPBwUhK~fe)~Sb%`?pSw@Dt< z!N&0RupvpC)Qq0WX&WW!7!r5X&C7g|>y@5R8Rx!2by@t+tJkN#9sS-_JRiw4ZnWlR z96XurhXG=LtD8HWw>}qHu6ru{T-%IZp%wF1&F5YBTluZDMa1n;(}6YK5jaO=wh^kRecu)q9|L;F_^Z+GCJKl^;` z#_zhPM<+(c?)p=y;btXoyJrst#;)$BsNSR9V(9zn;Qc&%dEe4zXH$BjZ^LNn;E+_!coNW0|FWxD(8?9ybD6Eof)K=m47C5TLa{>IRH z$c;L|9Yc{ZP@OaCm{j00`GK^DZ; zI`ULfc~jNfH4u6{2w(AvF?jfoDE4*~GH1Iv$0uBBC_I~HxxzjpJ0S@B`h*0hD@v(i ze$ev4;2x5K9`qcLDS*T7jRvk7kVsj?V)Jh)1Vba+6jb!F_k#+o7l$c4qP zF_{zUZ28+Us?wh5TlJ?r^;>tne!F&mH1je290{!;iH`L!UxqJLdTP&Or|co-bJPs0a_iL<%l5WPOzxiQM!c==dX~a-Yl^Vu@ByjamX@ zOz9y-k>ZY_M8zmz6I*UY$zibH&d(Kux}giW5##E*ih|K?6rPPe{*bE(vCoTUi{SSw zwi|j3vn%3Q;LkdFd-~wNQfgEIwyx1N4;mt+o}M1}d;=N|s(>*AIrg2hevz$OX$K9? zn3$XA7b#(xbq(i}4U6TIHmp=1=G=JTxl{D|S+Ll+)^kW)bzAYKo#WK<3b32+@J}wu z*-tkNvKlLmKi#_ADw39>RzswMau$D1aM@1_9dz#9f-ey2O6heq<8b z(Vx`NOjg|A-fn4F`W)od1}SRs0+wWPFHT0290$8vGYAR_6$}C*$NsoE1-Ia|xz=!F z#M+Kc7bSx#JPJ{T=l>Gx|4xMca)ZB}9``C46!cJpKv~qo>t)CL{iPCb6g0IscIH1; zfmh(skM~~{4JeJ098qx-e8g=DEy&`u`_^Kz%Z%9(aSOs>Z*X5AMy0n(uBybIm?M&J z1pDPQs^5_ncX?gBc0&*kCnu&Oj9PSY1uX z%=soU6;*khLL)S|Kr;O=m_1xQ0Ze#y;P{z6#qHngH06iDRshm#d@;}6@yr|cj#nas zq(B*xcOxT$Ts=_qd!(M{8}Ax0QZgm0ARJpH&TVHX^#TRiAjmY7p8ifal|bnIX;*Z1 zGeZB$y74?R@sojw%B9qTMN5NIs>A712d*BVRzXU3^R*#N>|eh_M$Y%37EpE znm~yTQl_g<(Z5DYLGla)an3yJhfsQCr5$et36@e=y?dgixS62qrEU91IrLz2Y+jD# zqvTRK0La@EMthd`kU7EausAhc-LS~39d_HEbS6p?p@~91{~NU%vUN&RqTm;+ko5%` zI?#AP+v&HvYYzoVP6$bP(M?@=KN51$AOFZwH_5Z6{s4(pFzXz4TUU6;Jhl7pVhWS7 zS~onA@~uXPhp1hKWpHEKGu+-UXA$mqX8)GU=1$ z_iALlM=xpW32>d!vGEt6p=M0%O-Hp8D839@VG1n|S$6;JIHbH#!r)_~s>Y%gk65zY znO%c$ip8Pl%`7h`n2eRN3NahV-M*@F9IY)Q$M6|PGRN)J)jPN5w(*O69|uikorBd^0SO*+>I_Ep9#3Cl;2#|?)R!{BU=9Aroum76EG5Y-6X-#55jwhRP{ zLYTLBwyKcjd6N64+Zo7T=~MfIcKjnKXr8_bAVS@a22h$WHm&PBc8zR*8dAnq2BDn1 zyu2OJEfb~%I8I;EOTO|G<*o*(GG;9x0l451gv#;Jl^@9>aj7#dbP_ofsD0wpWwJwu zQ3n`yBcrObd6#<7oiEpdg!H0^_b%Y1A+=pixkMr%W{`y>#Bh=T%rI+fQ~(_4fGJ-u zc&6IQM!h0{PY&j{FJGzNsf$Tzvt>bu!v6Z`9vlG#jR&1+AB-W9^6ou1HaRGilv&KdrfK{29=i~nBO#kD*N@XB4hAv7Q5#6)6 z?MXQ4-1+jZrdDAaMN6jq4N5^PA%$aDVhlhILlu|a5swJOogK30E|%uCJ?Z{!02&fd z`Wani^@2?~vb(v0h+CGjU!tDL>8fjK1+7=J<;UOoBLu+@Ails!x&@=xHe*;3Xj(*S zj%vbC54K%0A>f1h`8dO)ExR|7h`%yI(hqA^hyap7CIw-dsT9wTnJ)m2rPU}5P3E?n z=tMB{#;ss=*ib2y#c|+u*)b4wVzF3*hzeNP$mTxp z@(&$Byt~%(od8}BpHTzv>yyq>0-#F?1nr1Jh!8OnY=ww4K}<*>l1(m$_aaF=6_!-v zb)B9;I0G)AdIDSs#RGec6n?q!hHFocYdgRr^#ev+k?Ls#wwQb~TGTGTF#_?a-Z%eq zcM^Js&}-Np<|u1P77{U>_-k`L8_RKLX?=ND2lZ@h@Iu=&-7kxXlCkx(iBeeKOwi(n zIGHz=uV4H$4oh3vJz7-2b8%K;_mmJZ66Kdz2LY`Gp$%GBoJYc93nsYU(y*0^5IYe8aZ>Q|F;qOw z>$mF*Av(o1MO82nsmvHiLeiYn9@zuz2Qq@B<|++)VxNP8t{P#E>j@Bw55UYum4^h zwX0Z&H}8!`0BSURj+?&nF!VFQFQ*w6bfyl<&VKpqo3@IB!wsZ>Gc#L67S-_lgj1(o z+L=}Fr7O?Q^W_z_UVpinykIdnO&xV_)$hjho8h(uU4I2dtWbGNLYd`Ql?f{&3y1}f zddhK?gpoMNLL&!A3Xud(-R##(jiiJ4jOH*vkqmS&5LRh2u+0jgSu|;h!GA-HokdQs z5s=`)jt`)pLr=u!4eqWx?Z}f8sptu!!7-0g2apTw<=^oI!dv7sZpF#`>mKX+#c;dJ z<%qgNa(U0Rgi^GB`BM}VaclrYs+I|473<)?*dRm|vMI*Gdgw8Xf-GKWH?KKaDTq+` z!KiGJbFNtE*rT4va8HD9STaDeSe0IVb-3eT8a^hYYq50=@5_GuQc7~wYuLyMmnRQr zLd=K|$!RH{HF0%c{f~d3e6W}#r?Lv>`oBZ(ZO<2Oi#PpmE3DfG8yZBH%TPkNoAxyF9D9ZBiaJ>8rhEN4sDMB zh;`f59S#}KUTx#;_Sr1A+hmOwrB}dKKqw*dF_mKC`aYxN$IMdGpztCG5NR0966H3@Mxu&Ap?)Jbd z!`b0uOzr<}H~-j*9d@d%#wA7N-5)`ZBopimfuVY%k1X{|D#8TiPd%>H*Ta zC3Qe`0|p5WXx&UCi`usyzh9HTU67j_4+0$ZTt^r8Ov@w_-h&UDyO-_irn{161T~F8 zC%n$J3B%F82Zws~dmAwgX3&6JeK4w%#fa2Ldp5rNCZef z5okvvm#1U{awzf3<9@CewZRZi<919B;)Qb?Q0jxnwkuOHhGE9*l=}+k&su^AO@_Y= zc&urpN?B^Czqut^=}PltPK13Cnp?cz^bw{dNW@U-2o&kyuz~y#2y$eJMvA)s+-3+; z5Fm0{U;u-;D^RWbK)PT0s=s$lFGLmWc{0S!pa&P-aM)AcLx$dV-yfv7Em4*VvgL<# z7@M0AoO0ZxlUGpOPMctj=Rq0#hUp*F6wpcnVmE5=CBUSvaJ?{wM;Zac%HvQ@G1n{) zWZ42q(6MHGo)eDk?`i#ru8ulEJSW_RgI5q~3;=877%08}y267v-Z6WquDYNHwlVN? z9vgfKne%eGb7Ly3&M!G)j3LUWb^ZyApV}fBq!pA@v;N!W!wtkdca4nug$!r`U@(~# zpuqkJehd2@@YW3t4{Lr6`h8e`eMcUW=n=slz+C`XXs(#E9Wxiq6oIT?a1=|t&fk`d zQ}4L`eFtpJo*wA7Idd6t6%9)n61$uamqk$TVAbQy* zFH$^Q6KS1`l1|_HxWk4hIUuri(w078%myjGFOL^5w+Xep^M@up{)eXP0H?Zr|1EoF zWp5eTWREBrA(W84lf5@3A=!J2jHt|#Y}t;P%wuF^WN)(m_xJr>|M$AO-ch|B$N4_b zeShXyi5doT6&rU#=~4elfI0yADZO-a@9wBTNK?Ik=VYlMKiH#x%>HQ}7lKUv$b4(xzNcVOIj$wL`BFW2nUV&b8xyje4Xj@$|D^ErmY{T7y6T+}bn;ht?+aq+{X7xA?U9k-+)IURgobOe?|v{RINAUwRRO>!;uz4vhEEN zEwJWDMEq4Esit?A|8NY|Qo8~v^G_7EYJ?_)JZ}wewbz*>%=d@}RAx_%G;lOK<;S-w z>ihVx`;M0SGEqcb4@`v_ ziH_4AunMgSC7byghc~~TL`0LH@IY(}c!Gf_0H5;b+sKduhMy&npmsRZ{#{)KIz*xQ z!Wr++^Ys_4jt_#vh$HU{bl-}ln%@=!BnX^Q$TZO>wW|s%9xz3-5kh^8nd-@>AEvX^ zpfoX6)uT9wGq@>91i(5imw6~_9c`RZfcEdw`faO~aXi!y+C>#-e_8U$e*Bsjl%!&$ zsj5kUy|Bhx!eWyI=u3!tv<+Bn8xOsrlcPt}+K(M5>58 zwIaRqe-+_Ma{Cj{)6&vauD)+*pzq(^@{5MK$K*|4Qe~+hL`%JoqSB`1kO6xSQKwT< zfq8o%*RTr25nY0GE$(5?C$DSnLT##)vbRPjJ;@P;E=Dv46HvV`Nf&|yWf90mV z!*t+#YWw;7Srq#FUd4l=4;*+WiZ*$4+*cxNslNk=hi6%LCQq^5kk({6AlcerI#uIt zH&Kx|*g@;Bw6GgZ<&Hn!!GI(V6CQnqfyz4DUql|ehe<)5 zO|rFSX=rb~@fk`}$$ylIjmDY|#IMk{*JrjQX4yVt#9lg)d*UR(cw;SeBx_!pAw4&4 zLu#d_)$CuRE7=6m$;n>i@YM8_sGRrfg6xQ0j8 z_vy4nJ|3`5|8g8DeRz`=-MlL;xPsqKiKyasD=&_y9u=t1Ww`bsX*_<5LfJS6%=&Zx z=siMH+$rk`2WKD)(ztqY!gjpMo+ipXUa1v2%>encKjdi|v!}x+@BU|Taol~^SKO@p z4!Lz7PNnzJtTBKB4^CPF0JaH*BCTiwpw<=_7qygIlvt@fAe&wKj*_wOUIOF`R#L|}^}+)#Y>SAS>Ag-f z{)b597B6TR5nuR!Z0K5L;ExJ!=u8FthmGdFxiJ|kf+ElwP11qmMFM(f@T0Eg4N)P! zgg)^lS_nb;E>2wgw8~B#E?Z9XXP@ELhlG*@EeJn`;kpHuPyhxm!LYA@-Hd!Kqz|PK zGZTPR`9P9&SZm!giJ!<1Pu%-${4Jb!vHSnE0AIdt^PdtNw1#TRL{co zyEMrLA(r2QAXOXwLT--<*Kj*@lwYEh^5QR9)zZ{Nw7HjcL7BO~k5F&VYEzX|pCkSCpz$wqw z@WS!?MfZQwsfwncb(`xG^Ae;5Km2lI`nl<7ZmKf z08k@rx_Jv04;G5In%dg0rz!0|HEbS!ApXW@K3H*0KKNw^F%|SK0PuVcQdd;-xVXBh%zs>)jc#t-@gp+Ez#0R` z0c6)ySm10nUdR9y2$>Q>{v)cqHOtI>VrLN=Y`m>ZuaLIkKS-VXzJJ0_tX7OlKJN3H zS^8~F(7l3?6#z;kbpv9(WO0}9C<2beApIk+9EK0SnGTXCN+EdH&G=v=X9cNOUVc7? zIrK{NTl>vy79?So0Y8nHJt3U&7(gZ6t?#Pu3>L-KBCqr2Ga}HV)xc90qTJs~+YK;F z0sk*X*nMa-QJ;=Bv z+zzk$Pm;b~g@r&M1Rkguf9-z-_6 z$$sD+3y0v^lb=NN$X7)6@utT zqrkI$>3{|=DRnS^7QMqQuS1u)frOf9qL}DJDxE?Aq9i&lhXV2Au@WS z;gnN2&h?nV;j){yh2+ML`(C6f=9tkT-8J~d;|vX9zVa$T1_|2LH`aS$L-Pi6F+H0><}Y(WuL^`_t7$GVfOL;i(%r| z??=+U$tQ5&?FZX@tUTn=t8hka_%Xh(O*-A!Ij>DmAFuWn0yf5KVcA^Qus)=2$&BC5 zadP}Dgy&IbcLkh5jNYP*@e;2q+OBei4lFO?-eZ_rZ@Rs}>?b&Q+toPm9x9DAa%*`$ z+I51eFz3>E|D$ui8J53ee%lX>f3wS;+nC?)3>B~HX(hQ~ya z9N(?Tgo^Bv>zJI}Pd-0=w6h|W&!0k{Fnh2=Rdd|mHX6E6(_-enO)ifeOnxK+dlgn@*V1N`IDIH`ht*79gwiW4Rt`9xWXO9&!OdM-4_>ob9xV zgyFQ-OEnoQGeu@tP$7QM?9g~r8FkzC2?%I%-xV-e{5iO)P<{Sqe2;(TZLix=fbqPQ z#PSgD+4I!Cegg(8kMwehZ$$Hf2a|z5{r#2bqbFEilL2+-`o`q@GN0ZJhSHU`{p^z~ zINxw6&o%RUd=)GP>wAH6YpR|V3N`*g4&lzTSzl!}fUHcQ5S&O*no<`wDtj-y$!FYr zf=b^07)o#U>qEK0>G)gm&Bii+r45cz z;^c1!1BA@s_kPzI|BK<3)20gClk}B=L0@#}kNGMX<_X|49s3i{2Kn%yLjprmY zC)0<>(Imc@66-flGh=dcKz9l3U(mNudlXaSWQg^dJj;4ZDtqSQ94Fx7g#EvBY<~oe zggW%gUeLnB{Ot4K1SruV&5$WxnI#`k19lSNL)yR@_h0uU-gN1EmokB7Uj$Enddm*o zj9|_2V$e!VCF($n%%O0dz)E*HpDbz~Ky$Cz*EgzRcS2Oo$Pwq*aBNk?{XBMWOkhQX z{^6W&TEXJY;?XCS-b0H&XCei>N|+t5B-XaKPa)AUlPQQ;WnLKt)Mgi`5o z60^x_E9P}CY5Eu)ba>mgVX+|&`NYIqI%W~bD2PujOu2e|z8Uj`n(6AXT>fJ@1$EN5 zZMt8dlaCuDL6}4Zw=(Z4bn`*yu<6~V1F4m~crn7626vK4Xz+^PB!S@1XBRs z=i9Jo`x?BEr!^v$CkqOaYqx}1QCaXyLqo&DI|jJ>fnF6!W}|;A1XIipQ>9=eM-cS~ z5cZ>q&7qSe7jf9Dz(0WrvxZ4eN;v@g7|Rsz*2JtL1(ft54)$Ffw=DoCfT!n{mtWVE z!Y8;I!$fFh^1vo5@Z9?;+JTKensjqX?|zpTu~-9mG^&@feEB5|F7Eny!Gp|=`r&Sf zXpGLce#Jlg95%L7hEGQpPXapbe?fwBCt2?A$i3xh!~0^#TKfG%mwW($ti_v=wpa`u z36Fm$ky@9|M*U`Ubl;CpW6i@5T82Bo988GQ*#1nn#)7k9M_}TbMYYCd=GM?VgA6LH zq+)$pI0;}4QojH6BawI@y2}>GQe=69G4mz(|KP6=pFihUdEBb?-2AcYXQyw5CIouA zqnt|iTo=yyj;&cmr`GF=WhTvNK;Q1Mk}v`F(Yx4!g0Sbl*F0e0v&~ox7TpO&J=qu5 z4JT8ZJ5W+l?t92Px7}(~I(5BY=7bgrSS-x+kbv3Oe7xch6oo(X$};9kPE$={vK-u~ zygJA`ie|r}Con5a@fPtHF&~gIYV6qpzyzQ&YrI^XhD4?nBqJeVc}P-DvokH&Jmmpp zOYcpZ3!oeA+Np4X^&LSg;8r&A9NPH#wD?P|k{8+Q3!7)pOs4C+Cw&rKOg#!?#d7~ z<9Fq}dv^(B8ES`eT-@Awb#)nlSHR&YMKqg*!Ng$gdRdv7mT(Btk6B5&lqw~&f_`U7 z`__#{G04&@X!5Ii3i4)Z{8jfWP-w}*RBc&1T*7)K2eCGtP-KkA1=!fyXr;Vj`uf!8 z{B;YgI&3{ifx!iXwhAM$2{`p25wH8JOX8jDSBCbeoMonE_7z=jkzDNnON?<5S{URD_egQ2;D2g*88{r zooxp8Lv$SWwJT%nw|=>OQFrLz3p-h^I3J^sr}(x0!F;CSDhznf?=X~RDC4sO_60Y^ zv*(kZ&$mBvvsk1)p0Hm;l1R#EF+V9J*}vp|Fjmz9a{VCtaR(!=@1tz`{M(D;^rpdE zp>@&p$1%Aa5RzzQH0^Ah&E}tBH`~SY^ZQh>g2HQX^b0r|iTC!Zfv)p)P0dq61_w5h zH^kW2>eP(%JnRbqVTJ1e7ryzHv+_D>vJb*t*F`bI=Mtw_48Bnr{JnI3uwK;E_2E|d z`_{$-Wv;IJlfyO{wf_F5?nhBo0V;712EN%B(lC{LlrYd)Sp0MS&AqyklQmkuxx>-Y zZw=_fnJOM`R2~GVWDk#QzcrTWSsQnSb|%8j`csuYLl54XtSPTuWq9YCoyXf64#EF1 z+t}cJ1Fj0)sNtm}>0z%KalNkIN|CH2C~)eOm)HJ}J3pRWk_k1{`yg+k?6`@s<|zF8 z;R6}JI{&c>cf2@O)2AK<=X1uS3^GwLWUCt)(HB@&)S8OMxvlAX?=25b!g$kJ5m8*s z`t!`zt0(TGgrp=Vr9^_0nBUW#H9Nx*XIhU<2Si4X*tB4s-g?h)76vN6kdw_u*?AYI zAlvWU8f4#^-QbP;r2j1`|3UK3_x>}i%uG7ucRwia?gN0t- zSdD}cK6-kv?;vd**^HwO2tP%<{xobpe=D5@PtWS&fBJ@d!$-<^fA-ViO>s61-+OIw;)Bg4(D3Ak(M5 zT+;_FUpSbr0B}(q+JhQ1Y^bde)iSW@x`#gmpe&?ins-F)x4WyU^=jrnimqvDH`h(- z8u_e^NFe~4G}99ayf~QwN$kp3evkEq7}hr#8MI^y2qiczbW1r-@_X?W{azj#*-V|_-CH2B$+qWDg#;`d@Yl2<~c8NN9iuO>q>B-mP zWaaDyS~^A2niqKOcMSnIz|WBfLk!9#vAvS+vtC?bDrds*uU{2`7nc|Nv-<~fS^!lL z04NTEPDr9VVl1lyZKa?xiVZaEoaGWaNVqjL2NSnqcv= z&YuYemrY(DnWb=Mel^k3I>1%`dmuYwQicjjHvmEyz_a6i{GHt#)3fnd635ohUydT z7A{@1W=RvI6hsg^T-6b#W+9W14?~Ug(ssC0cNNDf$3@sYMS7+b-u8*lso0 zPsz>*^T62y!`)r%*PxqnY|fAklqoI-;zHKO))wNn;z^fz-z;~Rtcq3L)pk#mY$8j9 zBzcXeTHP@jOnJs?mGxG>_y6)oa(AuGe9J}#WtDsmUe248zrc-_-kroO44;x{jcakN zgTE#hDAFxwIbFLdRDnJK-MfNjinK2;8yg!u|1b>DKg?Z~1L0tzpi{<1Mev#0zq2M& zr{B-$DqNz`H?XfsU3uomf$FtIkv1VeVLZK*#)9DdRYW5P@E53H=L%8T6}OXgnRI9HX* zx}!ZDKmFpDaAZ^z_6-9kxl+QJmsPnoX_5@cp`4VIWR$+Gh)bnd^5pQ^8pm}G!SKzOcV7I+{W0H14SBpx6+JSdr&DH6qyOEB?#IJ?b?p^X2mu`cUPI;f zZ{ZvHbD)fdg&r6y+&fl4=@G2 z1Jyq`q+;IkeHR;gvC(d~@&(=VdyKbS3LQ4*TJ2B!RmOzQCg`&6_6XNT!;%Ahvy}?f zSe3iQu2Q9zb6XeY%d`Y4|J8hW7!a6o+H_Y|XE|$=J=1$NqM%r5C${$i6IsB~d#vLv zEXU;nyia?YsKltkrlmcV0RN*cflC9Eld4kmvVB=q{v*AiGJakyQ_lSOuQd2OLGL=wf6{o>|!m)KZ>%ED(~#l{n+xzFV|KcTr^wo*IHb^1gg&^{t;5!)A() zVAFVvq0kwIe~8#>4ScrQ$Ovz-+Ox*8;xJu9q7H+{GrzJ=wH;Yb6>nVJezP|#SW48+ohTL zoeni9txb<|@G!rs8rU6BM!({FQNbO5hY>7p7Oi2|kw{25e!}0rrE*#)e-nI5Iz{#7 zf85YKKeUG7;^Gp^oBjyKNhv_08CRBxDU00r$Um(GaaqU#TMj!<(-&2%#q~t)iNpJrp^kz@j`zo^$P-Ioc{EXB3h89e{(-}1Q{=O?{f02U)vZK+FWS-1$ zr^6G=W3DIl3W^3v@G)y59}R|PSOKR4@+Ict&xGM)xb6^AnE7;8z2c1Q&=TPAVhAisp5!$g1iMjkN;b32E|_YYade8MmGJH9FU|~ zPzVnQ_cn@MojvaqEU=6XXNM74JMsAZkm2_~B7=v_newA<7tF_7&LM5Smmp)f1mj)u z;Y3D_@>e1TYeGAeytX#}5U>baiF{MtQ1SYqc=|_QCcygA>D)sr!bpe&wj5}p0lMR; zQV?E@L;J*KVzO|fEWmdPMu&WHiKR|TXB7{tGMlv$VbY(G<4d4&?H0!~v=rOD zHW^-V*zZgWr6J(WD0uho1#(t`4N(Y)N+f2z#(foW5yvV;;N+85AH}^jT(v>}d91CY zLmJ&y^Zj3!yoo+Vh>g#vd7Hi?lQPNSq$|<4nE*+;_4TZ)i>V|mcsbBr(b?N;`S%wm zqWuA}!{Ee3`-{o^t_l-isI|5AV_Dz8BkkfE%5R}W2nla&pbLHU2n9S!^sx+-l!ZtW zWU)P0w!tA)VSmR}yjp9}nC>LD7CT2sFQ%leOq z&7@vlb67oe3tqE6psG;cjDPy&*>&VCg@qFMAHW5cc|@xI{0ux*H)7aa3u2E~Nk82< zY+S-KK4K2%HlKi)Ap$QgrJ%hHTSRX!nfDWVHUh9%G>)%`pO$vI<%fXl?MlJ z)VvA$Nh1#_o3hL25R1^Zw>N499FqH~!}xjL0(p(0XJP(p<25#ej5^u&JzC`?s5xT# ze%I%dnu#?weHB5h(l1+=?x@O=;Pti5nyBWi7R_O@`_c3Y;3|giQB4gUD~a=!mnMyW zv0mPZ@jp2LJw0l9(411HE(}holVC9hSbKf9eQ#*h%!|PWwX?f>$7QKKEC2oJsoz7* zDdW=qy2)Wddkd!dF+u`g>SxcN&+!GG;kASi&e!es&xhZdMrDjwrb=0weRCgSZ#!Og zRUHRG%kze_Ovg%ypf_{&j3217;~tXN^vCNP!eK&j6o=32c2>0BC6aE1!Uj3k@onX| zGJY93W%fw*YBKSXSc3yp%J?%<;>U^L+o6yF4xBxr7pv)DLCiopHS1kCQD2C|KMGS2 zhU$HDfY4r~$__BwTce*Ao6fJMB-NJ6>PAjhjO1-JZe)#u%mRhv)ynJ_J>1=no{@)N z3KKsMe8oY{#DmZF^3py`pe2=V#zT>cEF)Y)khv}k@h5~3Yyu06o1voSW7VNMyJkrf&uSO6x|IYI91r(!P0uwPS8NSP?q38DUhfmA@ zuLVdf^}}Gvyst@4@@9eR`YXE>s~`%rwq^&M zPGQs?*hpnLxyv;rmCpvvREOran(wxfZX0nq>#@e+1ifVJJxQx?dy-uu@*FqqK z*e%Kiy_w~-32I2VE-u#6(t;jO*!F+S@%12}&h>J!k@4dJL>RAr4Ud%DpNLrXrMzKA>FzZ3R#dbG zua@}Aew*^3sj>%2?#7Lmei>$0$RXGcaU4`wO%>{XF`1?EZx~Opg;HI_L2*Y@Sf}A> z(nFQ)?hY#Hr%}7RT{$0BCgB48{;&8WRvTs}w*_oTKt@adRd&F)G#>)>fR;u~zsa(H znJO}iGolo+o#7*n@8as(g+jFmtHMX~elYVmTK{#rNH z4~Q0qM~zuj^v2K^^$#L3Ux~`>QIAs6g>6UxD1i@Xe`Ah}-;o#(fED+c)g2rhLhjk^ zyRdb3;h5@)q}?<aGHDn%ORRUCPjeGevNJ} zfR*Dt=o!(gJm{T-c=PgEW~l}IF4Ku$Ha%SFZHTw%9y2Id;I_`3JqYlx z%H;saAssbi0fG;t{))=78v9aO!S@W-Sf+auBHOwV0Gi}*!AMG?J%n&@;PLO2k4a8m z3irG%TvnTNd5GU@*`}`Rv=CvV49AeTxcHYZUtoN? z4^;DOmpP+G_8SiLjW=)YOX#Y(DqAM~VPuLShK`-(a8{ovc(H z+TUv1xKX4g(|amG~5B}64I_*V;c@zS*d zoJ1u>_SMl6%fmjyQxs3O$;hWvMd@t+6T+>(w*oudxWC+qag&IQjF{I|ikth`G8=ut zV!r^pu+5bJYduFyrhHCLEof6Ch4k%lmddfoqa%f-JUtN8{fd6 zo}p0WJX%@=zeWDhRo$xI(FPAmC{xvOGn9V+HZ*C)3BB%V#$q}l66YkD7pxH_`;d-} zUS`_;K;T(cimGSOo)y$h}OPNpjuf$reg;A zipLQPz84*SRs1d+-%(P&l`k81pi3qmz*zjDE$Sqn_7?i&1{xOSf@Cc40M1`JQYp2@ zLy`zU+`-YwX96F?sca!UGQFL&KV*7yX&+10T;DK>eW7vZH?EOizuq@MLtm&v;{7Lf@ybPj6#>^#jZ2 zXl)OtU-?lzMD?4fA_BYbhgUr#_ABe9d%~{2=eHjq8(igDT)IJwi&4&fl1FCmzgK;F zW>;1fRfVy*cUI|2d&}pe;-@^!pt0&Fn)2H9etq4la}~J*b%C;he&^ojN2j~^CwIL-e42i}`pjqXMfVvGmO|%Pm2LF%R6_Y!=!7Sq z^zO)fJo>BV;&Nw2lMDB!61BNF{J6>0l5QjKChEV25`F~sQ_eHi6az?~HV{x>9%e|xJXdTTfPVp3Wj4RtD| z4j$Z5@)DUhiLp)eM3OAua|Au+LIel^Zk=qN(1Su*n&EgL^k`@|5a}{9fsGycKmNqY zPbm_vvVnnRaBw6fZ;vk!4$9>kb>PeU_cGk*upK2NB{+e2!RPREWo2eah#}|@))DqWHwjb`ER^`O zVpTMisW-!mJu1!I=bca}_UPVYFVCgT$w>nUCPSRroha1%&z}>a*4MhVU=H8Q|CxgJ z8+MXQcH=dPUd+wkQDC>3Pyylwl5j6=DLEV3J63e6<0jb;j*W#elRegk#iwXtaj^n| z*x+AaPJ)7GOFc07fR0hG!A~4wfT3+iS<(LvtYzWEL125Y@N|qHbx%+)j4n1 z4B(S~ZIl;x-%ra2n%apLf?a^ALR|qi6W)lUZgx4TnBWT7Jr0D|ngw}aw1Igsf?g;M z$iyqnm)h9cAll-S;kP7Mi2?-Pvnl^5rvq46Y|`f_WhxoQ&QxWMcHt>CZR56qj#_;S zalz^Hy&rh+W{Gy<{7s=!XnTpTtpt~vqSsCr``J=^M^T|>6+uNrj3uCDULeZ^C0%r8 z`BJ)i`su;SjF!IsysWH@x+Lg0BtJxXZqF&OtA$+US0&Zf)UDp4CG&O~C>#B343%l@ z*J;LR1MmJ~Z^=|cmP7!Vu3fntLV+($5^uG3&Z>7nRynldCW^6XS2BD%syBd+sT)V< zrQoigN@|b+H^qLZQOj5F-MWKujncmf{w*7zR=4=2>U<3nY39yLP1XMXMZe8HxQQ$*M{osSP5xA5&h|P z7)>t8Zy%arPS(dw`d4JoM#ASffioWxogea>Pdw&p$?fn&rX$zI=P0)_ySFVoJc?uz z{#oCN80t;Z9EKiBWG(;?kn>EJ3A&N^#$ZZEP8LwKZqJ!1$HkCCk~%vXuIA&%tvi9d zOCaU11KX9<8M@F}H59(jC5E+-j}?`h%M3LT_kDdOAqMh8v5FY&eeBmJ{9%@EHMo<9bqaT4g&{dWccs3gN2U_obzh|h&8A{;CpAS=t zahr2Cdy-i9b)P@UG7eZhp+^4@(9^~p)^GZQt4UU2_%VP`tGH&CVP=p(riX3U@i$p1 zrocui?jFDuiHV89Et-f42uTXEU^?9WC)S#)c?p!YU)|k*t&a`zOo!iN_S<^JumG`5 z^V=QS?83hFtAkl-#P*r>Q ziCH;E1vjP)Q^_iZy`!TwB#;4Ux3}Wpl0Nf_Z1m?(m&a%tCOp_?KrQ{D7#^V67Cfrk z&&hrl+XMSF09;7yoX7fv0tcD=@U{1fksJGEF!3YhmOy2fapR%f;6X^SU|w|?YSj!#GB!ZdC1fPiNX-#f~OiiDtrppkZDwJADuicd^ zP|cK=x{kFh%E>D^zK;I3*;zS`#aZ&9>;uZolsS0LzU<#$Cz)w`VbR;=E`M-&>yL8f z1Q^gwh|xG0C%>eveD+3=U&eDYr(iNq0ED-jiHsgPsACVw?22Fk@p8O*aqc*`9jqt? zER`FGJfY``bX{&c2=XuNL(x*glW%2IQd!0pl!9{Oaj*;b4gkMp6cob8HgUq4?Iax-L? zm2EV(Kvwr7%FeNGfsKdtfA*eyqJastYMl|Kb>Ffx`=amQwiq#Xb^6N+C`ma>gwJ=X z34bR@z7)NWrI3N7PfugRxJ-yxo?Cg)XV7dIFDd0l>Xv;ZcUke*!$PF%po^+vPB>$*|AEJRG4r}aQ zmD;1>+<@{!2w%sGmO8yv((v!O1KbyW|Aew{#;Snt3Dd}T{WdgvssaoQX-Tqhu+LAr zCYz>FKzAU#0i-}1Sxa;{<2c{N!;N8uLL6!nGnNWq&mpVlzUE_Y)WVHMuax1BI=jHJ zrvMmR=JH1cX-1jrOnXI+`%x^O@eAcFE4H1`%$?!_E=9DjAy|2EvNld<8&A< zPSj0uf2@_k3N9Dr1Cb4Y#Gy0yvWBj%66_IG_K$RQmSX4NI)kS%PYVZ(WDq6ja(GP@ z8=Ue0wE<3GnkJ$z;+W%YEL5EPFHeji6{EZFLp~k)ia@HW51uN>l%O?MHA5^`Lp=-a$f6&PHId#|h zh9Q$@_8w3rf^_s7R>f=I!cN2@VNWg0KIeg858mQpf*|i7Uk|EhLukByzuY_#9q2$O zD1FbXb`tCHZ1feKsXcU95Gs3getxo9`1Lb66Hs%TvA>UgUXqzMe3sTe@pTm*GP0p6 zP0XXa*1CjnSwqK;%%gkD#xI+kX(7j@POa;5f@9B8D?L;2xvqV^mqC zUsr#UFyOL$hfNjB`BQ;8R_3#2t;~b*EAfXX5&0$un-gd>m4w@~#S_8{%nX&1fqfaV zR}bUwZ7}ElDV&nQq^p@Ik`Po90gYYOA4_A7wVy9i+3xN4T=-{TxOyg^eB$605KL5I zQWos8xPlV&-XGREh9Rs6X%|EMgTB+d^d)t3xc}4Ly)LXaJEA1EH3``~7|K4)U^rh6 zrIql)HXOYk&UpP{&ayO)a|7=BN>nnS(n}eYVa6B#G=rKMZHDA`hfm>-yTwTM=IRL% zF=6Ob{arW`Xvsb9$F7Pt9uq|R9tgrlhKq;y9TE^Ge{l|_q^jP;xh7xoH`fx;MExmH z;S$xJv-mVqTDQmrg$-OA)$@e#sQZBZP5i477c4Gs+DKgOj{zw&gQ@C}a)+ zRa9Xgl%vtuWwB8{vH79mn@!DR*fU{yeoEFv6+{IG@>yzt>J@<_CWK-YVOhXZyyxC@ zJpAWM$RHD8pB6za9p2u4A9)|zk_}XWE(bXbVp@#*Ny1y(^EH2}&Ju4>=~~V{U*9;q z2yl!cSMl`uNOHp-8@=zE!1U8?3g5$xb!UH}h=EyVw3iL!z>CdP91PxRF&;?a*Um{2KHW@+~558?9M^vDIs5iWnn z9S3f@jJ`ei^PfX;1oP4ZUf1$p!Yx(1^{TGK#Fm7kc^CQp+rIfo$V9`l>D?X-j0dBX=)!9R@8 zcLFKf9}Wz^H2&9(`xgdPH9%huXI`2NvSVcSzIn`Lxzh-ZXa5yi{`=Ks-Rdn~Rcl&R zZzTyNF^%x;7d+qT`1BNv`5el9qXK7sg1+1D30)wZQN3xmCy!=nFx$T4F_l|%kwB-X zsQ=SKdOp7gg+m#jk$N{iFjnO+35dD2rgH1l(UI< zc^!9Q?Yr1=jFj)*y=$T)NoC4g(FKMAA2=G|(IPO{j}sRu)Um5muCCdM%a;2)3GSOS%J<>UHrwGx9L z(4$5OESEY-`NRv2HoZEcXPg@=4vW!;sS>TJB)66NB=`F|BGOL8IXgS_u=+MmAIMDX z|J}!>p-qLi-SM0>?jy-4IY<%VWpPuio3FRCcV@DAznZT;9QhMn+hd}vCAjL)=^I&q zp>%V|ZcL*qgdovxGs{=ct53e9W`~P{+n}k3N{C9J;=`!KTKo(qFZYlf2MGYUnUbsD zcl#vu>aEy*Pdmma6;4UBcC6gGIJ7m}wCdqjE>TD=uG!xDnUC`NTU4k)HrrPFjrmCnOgIQZZ=Jj1@XA;&Bh0W|Q?fm}Qx-wu(`ZQmpLx^T-d zE0Z8U2MO*VM~7a;=TG&CNPpgTQy`93)YK-|OA;X1#V*%Q(j=QL8Xm8DWtmE^+4~1; z%y38OSnSx80VBq|m3lmbj}qT1U@71U%p0PUPFKH8``ltU8SAKCuRTw0u_zx0I%@%aBI4>~_=%!WPx zie6F-F<{(UI{FXz$(XNuuEw}7_E~};4~~?_3OU|0GLReYY?rPP^|94D^`=slXJ)O) zmvIjdzYmo6CusT$yw}cZpq_=F67G0l8(}%`$uew5;3h6E2mk{XLlG2svrc2RjpO}v zTe!~Bcu=E-3*W<=@z6FvhgKDWv+Vbw@-p|CDo5rE%bKK* zpfzdbp9)o=xKi}Czmyx*8Fx)38SRuoKyDL5I+rJx(KMFi-#UMO&&bib_5?$o1A8`( zEz8NW z-+&Lqg_ukHcqB-{Z~3k$Kjq(9&K3miM!E}OG(8a=>_B7cdAu1wvcrz1HnZe1F1rUP zV|D}q@sBIt<>Z)(=4cQ? zwm>z3ZnFuoUXqXpj$l4pKK?D*`@Z^;pY1=NNA3fvWph{m#_Q^aCyPNrIjv@z!5V@X z?zJ6tD~>r?Jj?1PlI6E0iSaeSS_XqLwEcjSR=~5*fVW{m8o`J_cI~y0dEU?%?Kzu; zrpm{|qYqdx-ME-Ogkg2LCdej5DK5eiokgC|pDl6bTmejKdauF_!ycf|!wZT!9$!IT zL+ac1`bZ;(H8@xrV*fOP;%&R@;W>?cC=n6~H8?%3uBoY6Itm(X{FXZuPW#$AupfYK za~4UKC@+uIWuA>KMhd;N{15a(2$GlE)^iGF9<;-mmg5v7th}4qY*H`2X_@ ztWUTjl1_-k3WX>Q@rJ#8K21YI(D~&Jt(Z4N+oS?-0GmH$oKP@K=t59N236O}!X#~i z_;wu-)yz81<~O`qQdsWH2WY0{toTwj>*qA;r|1bdF*++$6&0~wzkZ#%YK5dKwLOwLR+4th0l)}O`>P~#7;nX2!H%5BAHG@ z$l`GytM~YR-df5OF&JQbK^nLr*I@Bm$?oq-1weXh0o~<@}o6}51W>y zf8(wy6gV@(mo!!tf1OcM#Bv>bdyokp)7N-6z$S79^m=Og`nSM;YXNx$ZXO;!T%LwG z_*FQ~=EP4afb#?a4Cur)v=eiGFoP5aVC)5wVY|0gBO78<*IK#YwH6mgsp9on)D#Nk_U`J(oc>Ox*lQc zURG^kCB{aCRJb7C7?Yd!gLes5boJiNWR`Xpl68#l)UTWz>*F0W)2kVPnHjY4hg z&(7Otm)g+`346ihd%P9uNV(NvEB@{yu80#f;voFHvv5r={k=6K zx!m6+NN41Gb{om_d8{Bip?ayao`&%B%BN^gN_Y3KYc_UPNLJpQ7rPpVCD>O$V0x&f zD^9<&>neV6>RKz~e3cs6pgomJM#=uPC^qis0eY}HsPO6ecB<3ryVgOOyf8Drd( z3*lYT&xJpZezLk~II})Ia~1qvGsNcj?Q%2vBcXNU-A8X(z8hC1Xx79>`HiHKO^mt8 ziaMVD+eZJsKk7BPVrtAWF1(3eN~M09^osj1S`}lr{%(#T^Pk zz_XA@=??n91jJtkT;5J>v|n(lWhJGkl^vf}LF4Pdv_c{(fDpPfJtw;++-(QHG8X5W z4TRliNk~%v z{r6UB9wf^GHiQt2B5ss5B|{S<-B8C^H1R~ubyo&H9pd751xw!2{mM}Le=UGWQNl|^ z3dm4vvs)cSQ&{yIFJ~({@buMT!(lyG2;xD5l?qw$;Slvnk3?xo~-^+HG#$pMov=;85O znuOIL%TyUsZWKdEe`rs-Lg(8=ebil-kS)+Fry~Ix{Q(D+Qb#SJ8pGd0r-!v|`uXt@ zKWG4Wxgq^QZ+k?=4&_3=C@2My4fQvtG?Y3j?5JrDL5SK>e=~JH4ZI|y2Ck5vmxj2^ z?8}hu0Gwn#Hq?f94Xz7&z^ABr4GoPZXpF3lorQP1|KI*9bZ^`pb(haE;ZyH^2jYj} z*^11YkZS}IwMz&sKcPg58^Uqx77H0}d65e#WVI-=wb`WIm!d~HzyZyLJ&aPo>>36J z2ITp9Ujm7pY1&Ny;9;D5^eCQPPYkRIjz8eMY!R0FF$mELDKhq;UGOO_j}`j4@x;oc z_FfTb+lqSA!$g$i7#=n|b(v-9BM5i}G6!a#Hgiu@MW>QHeISZIQ~f>m>#C|JFpIn@ zC;~IR=q|0BmhhLD*Gt^@ID)>~j`~_CMW9 z4}w8mG6jxvlYQrI@7bz#G+5E$wPT|Dv_AUu;1s;pxP}y)f*5&apWdHqu+v|^z>4kS z78e(otE~5y1tKWLgAS?=<|m{rM%543EpgxCa?%^C3RC<6fi`GYDp%<}BFQjKi=RI* z#AiQyjP5XbWpP-M(JMjnVzrtPH8pB8BuoWu1fUo>6n*5s=UCk(ctt1kPTW-B)t4{O z8g^75BuhbJuuj(<1MiXuCL8#0ZZ;k~1-7UCSJ9(0Jh4k#C`I}|wVr{a?!UV}%z)yQ zb)1P9oAJSun@KLGr-7H6v`@-_VoColc{ikzR;v6`;M=Cq=t{f-OGw!Wv(#@;$sl6r zxWkd~Di^!TuBZU!eIozmyHb!dXg5^@YMwv0>W%n3omsiLxXb`QfDR$q!cU(f5J|>Q z0FPBu?f|SOk1b+fyZ|zGdChBY?!|?KOu-~H1>TT}FGc_D)DZOvQu!Caj%FeV3%5ZT z@e7bqA%Q}y%4Fo^0vie%orY8Ltn>9D?!Z+Z2=JMCvS0tH#+ZX_;Q-y(2SW^aQOzG&vXwt0%i*B3(HZQm z;3i{=VZ|B}t{Z!(?HblL2SlX#yb*lKnq=f^LmFhw@H}g3x6OM4;GYdpH3?xT_@XF7 zynD=5^R*V1mV7O$b8~YYEUKRgw-4lCKxdTE66UKIV(X_A%V$dN3_49~bf;b5N zXi~z^*x(3Ly|w3KY7>H*?wOkJ6=MYnKp!DS!rIIFtaE8-K@$EMxW#O)=DyZ~OwT8XLNpfH( zr~ky@D~BElK*I1X$7$N55;CX_^NOgOltLyNo^+`4Eu9yz?TS~)2St(m)Q32wR@m-9 z|4OC+U!azO6!b8MwXr}61?=(V_UU&R2R?RsZN2+Q{mv?3*(VCyPzR8Mu)9210J-ppE!gZdX<8vJE<2|SngYM|bZ-zp&JoWyj^mi>Ko|mU8Pri@%az^WXKJZaFC9u7) zD54)#{ZsNM;71Z)(PPJGgFk2~V|USx-2PnWthH2^^rI)EdgFU<9U9xCf&xe`C-Wl# zu(GSMYkt1u?HP*Y8jHP&S~W>(uYL;>R?dOP4(<1AL^tme0IS$;fi|CU?Hfbm z{8NLyL)+Is+84T=^yK|pc>%*SdX2Nb^%MReoZ;YTrxl0Acw_G2;t}L;34?6l{_I9h> z;C8(KzUx^uP3S*H)7rhOKreAP*mj-YZhhzP$C8wmroFbCa1zb)^LK8?jPRWZ;gXs2 zGvz!&xQ5kC^G6Ndqg%lDjwe`fW^+>ZfN$4>zi|A*$@X%u2x%|-v#)1Qi`wF?Vr^e| z%;5m6=g&&sW3)N>5FwD+l+>j{&tv#pR$}Ulgxrk%-bS(hm>eFy+lKutRFc^(fB%o8 zkKf}?o+V2C!WeH}{lZMob8+zA(!n9)tG1-m!K9uz#@k1mHSwR!__wB_j7cO~n#Da1 z7O>YYpWj?;?PN@&s1qI8$jDg#)ks5gIdpU9=Qyk865AeScg&Gb`c=oyMs!i$kd>+K zlJ~*XK(=ovglW+nj&+Ls{HWr>@~OOx1FN^nbA4MDnEgnh0}>u&DLx(3&~Ar;5Zvf` zNg`&`UtR}TRtaz!*x~^bBBQ^bXviuEW{~X-hbg$RdJ{Ppav>PJpDTFFl_*zMchsR905PgkmaOpw<8R-0GvOinHmdoNxamipA6Wd-e3O zG~n%>r#)On#UJ;Adk~H1k1|`bPG`L|&F+p$!lzvv@8$)8qMmK~=gq21stfhNwR_&Q zK=%YWDbDXDB7nn9boo#A`GzMaBaM=$msjhe7sjA?^SoSALY8cRZopK$Ypd}{NJvdP z3ebGrPx~JViH@s0I-N@IrR`U_{jpwy7XHSt1()*=xk~{UW)-~{V-03JCkGp{*B?~5 z{*wmFi0OJJ*gBYi7-ZA2)Xv(*W;HArGhXVkIJ92{Mlk70zgx_hd!DW)6r(zQmfTXpJe*&lk=e$cB8+}|f6mu3u3V~g-}lcEaw z9z~u+Nez1fNo_3vV_&IZ!(0P1bDh#uq^~s#sge7cJ!v=<;$2Wvlk6h2;rUoKnF~`l z5y@<>vh%if6Be%2EKWG^_tm|G31S~pX!j6Y6!dOG;MH4T1um3LSbd#Vo^FpGJ@PzW zo!R;P$@gu7kvX}DzQ#AP4rn02;ox+c5WhO6wnY`sH(g@=AL24k?7z|qix^`y+LzO@ z>Go?*&*9aE^=T;w*|1Bj*+^5_)}P-($;(-p5tt55fnxlA&+5%L-qqfTAOulBN4e5{ zr^nP__Fb?x(@|~MyffCLV`r}KhD@P9zI8~}`Sp!WnV2*M61vo-X&eBm%v$aAT;w0Jm@$%*p7XMWvE zkOJ-_pawv4pWtkkx%OU%Wzu>aLN|4K06yoM(g2=#nYYec#+e(N=k2WEMs9)R_m1RR)_F7?-A*Ig(qHxw)n!kr2=Dqb0gZet_% z&!NN&`}eyrWPbisRM&!C4Y|hQru#*j|HY3&xf@o&YIViOihi3=t8{UO-F9c8p)%E- zbqGEA>l8^i42%0Tqt~xtB+NYgMwXn|P5I^Tk%&PS|B$6M#)LeRskp4{6>y1p9AZ=o zkx}4SbAjly5wI83CUY(AdfpqKF(Ak&0Wd3!qoX6Bm;YT#b13_WCQ#BTbH=gxS+hxv z0NIGdHMcXeprjyi=3?^z*=qqSBcl2Vh&oGY)703y;N*;#8u`jZjoanWKVS*98ZLm$ zfvx-^OF@Y)st|bqdmp*~)I{)P60s3pE$Qa+nBShT3Vfy5;9tMf)O5bb3bRWuh+6t8 zt%kwf!=mQm{KOMd5T{<2-D6Q~k)u&c5kj=6;I}%gXuH-nKfX!!LMUSia5vz^(IBy| ztcr<_2)iB0xrB@c&vZgWWtpow+6%4X`O$#?P7uTCD^>sficFkhlAehU0cYCF!<99# zsi=i050692Cd1*SZ+N;LRUE(lHs2pS=7ckE_vZLmpO<%iUys67zc4Q^;Re*Zr3A1jF~xF)^@TmVXDvPW?77Xy zktZj@!oqY-oyDI!pKTPkR#$cYv{v;O-iUi9oqwmw^*S4~TuVX#OE5Mmo@wTOL%|G# z&6czbZZoyv)Mz`7(boFs{byTVGs~XSC$(EB;|C8OtZrZ5ior{xaaX*Ug^QxdB83f zy?gLO0=rO=VU}_85_1@kQKOr9g*09f3zdB4DWEbxw}IXEUzTTNQFnM`M1ny!Q_5siitAHl$6XDoVs_KFHh){TVnpv z)p*pjlJlmkt1GX*{%%KKwSb;&`a>62x9vey21xt#3(v9a+F7ADh%mQj>&nqpI@*r$ zS8{i!Of^S~MbmP0&>u1psJ8BL{3>-?BA^OnRIC4#C>fdxiZ}X^<@YxV?A*ntrFM3& z0Ji&h^Tbz#A%|`5;AGoll0(0WitA$^ZS;4=B5s!;yXVzJ%&p_4PJj5qnz;*E6rbGG zZ+iOSRDBTV`1lw&E?qm_Zw=?~=t{Qy)S3W#uUF zw3|OTaeA1J9cWIZBls~ErOS$-f(Z#yPoGjgulD&0f(msloWfzx$))C(#(vT7W1W;n z>{$4!hJ}d;KdoFJy>Y_!7{4(~gR*R3@PysNDO$hbGB*c5&)p>p2;_%Wif?Ll#|MH$0m zx5Ep(wT{=j_YLP-Ugs4SF1YmE?6|@&*u2ZozUq?0Rv^($ym>;*?{Iz@(Z+Dh4Y-^; zJiVfF??9WpqPSNdW!{t+ zP#f;a%gZ-hoIe3LYirK23&O9pq1(ic=~T9`poACM2c$NuYirO;Sxs0t)vUOSX0ta*uMo2~|@#dGy+M4R*ufdz~CB&3!#u|vRkyAg(;G~aRk>J3kBlnL8 zI%J`b356KxlV3n89*2?tRkw0Hc zx@fQdvgd%H1VBwRp$cg~5Y!YLn(R9}m>EF+ci(^eiuJ(;{8Pq`@OxO;WFf_~I!?9R zEX?sN;~KAqc`4Kr;1z}xBX#{oN{rA}tIbCo`W+y=fN`*8(Yf5;Ul{zMj3=syS2s5$ z66s)LQ*yWSOk_DkB0c-Lf)lvfe0*L#G%?W&^d+ztFaek;QDYLM%pVS-$=eS0_n#>^ zaVEX_@PXs~S2}fyKY#vkXwZr&yYi_N#;TDsAYY; z;;)yoyplmq%n@b(Wu+r|<2Eq-{x>rP~|*xfpwdM6|aOi~4i~-Js#eI6qy_ss#gi@Ne%ay4}`JK}YfJ zU4suXLYzaR+l7J&p9lQtD0&_Qiz`xS=_X|CH$QheQ~G*%=d1E|jPO?K7(p^|KIn4> zhz>a=XB_UdKFm-lP`%%>wwK9wP+;3hl!j-q5GlG9$Viw=Vxfa`S5g25`UeyZpJVK6 zZK#AUG0HQe(X$746Oy)?xd;KW0Pb!+^po&D=31ex8c7Hi_Pn-hgz*BuCMR%*<$&t! zUcK8^j-Nrsk+90UJO}Uwq+t+9SGg@4L(l3z@4;f^(IWZm*BGXPB)_c>ZLHMg9JY6C z>g4T{l|122LLu1;+lNJHw6Vk9i}MqAW*!Tr+xJCd5RcKjpY+6KWI~j~PVff&SxDz# z2wIrS67Kn4^#ofS>>uJ|V+Gm#s+V7V$5kGNqdpHz5ccc$o+)VwS1}dS@yJygwRU*o zsY6P$m*x*i&1=}>U)cC5v#@PT5x!|{9O z%aOxMNI!Jc-QC^dBU*vkj8junH)Y@5Ud^k3p8}0H#!FG*{~Uhh5OeP@$9JHN(jiGv z@Q9Gjr$woV=2r%>5iJx7RkK_2NcUjJVC+j{0toExo0n0qTCmtsmq>t(EH#Ro%^3(rb`JT8yzx&~ZFX4iY*gbhtIdjUVY*awlqt`{HJQ0kVo_+zZ zoad1z2jP8Fc$I)=rR-WOo^_-8Vs&-Z2t0%mE$rRg_^qt0638hRT!awM5aB7|uJYn& zHC=UJlg#~{GkT&~*>wE4O{PY$+ZNw8rukTN#D z6oHOiQ8eBEFy4jggMS7eG-)qjKd#I;7CN(42y-O$1gvtU-+20Tf{7K0v{Tr;{^Xj_ zy?b^#NB*r`B+_wWjD~*qbvw2WhDWD@!d?kl;{IG`a@iNf3bB{(Rwx|$e5CpcZH*Tg z#-Yd-(E}l>Jpg~Y{Is2vC4XyEQX2yMl}dxrfU7hXxDn{tZI8o#_oh~Oi_O@dMLn_P zev2oq4rw1vs=Oe>Ai@@(uUX&GN$1naZhzr#>oduT2-@Ay((EYv&S-v$BcbzKPk9$jgu`4|%Gp5`$K(jK4tj$&q!}%@b~e=$c~v z_USudjqNBjiS_dbljh89^cSYxxWhOC2L68Kw$2M!kl;3vdQWM!3wr%yi^w5lat`AT z`7rIUxpI+AsMjPFIp*=^eLhrY;B+^ipPh6M44BNfHR!}^-tqIt(ASPz_`{EGX+Fj! zq7zcm)V%5IyYzDUV!TqjTBf_^flA4_V}D6@N2iqgp~dJ-|L&ggUqODA!E1ooKJ@sD z0UVYmJbkZDUxWf_XzWP>zf5Ff%*EqOTVd8J&NW7PmEQ52r0T|NpMo3(BU|Sp=tkew z)g|skIG>+aH|?(6jCoMuaSIrwOAt$tU0OO=&O*tmiT`~y;bRlui0waj!MvBp=WT1f zoTJ>!>E}@rmx+1*Yg6Hih2F`SYUx(yM8>OvtA0yYvGeAZwY{?zvs^?a%VdZ(Z*U3= zXUv=~$#Y)(Fe|EyW=wULd!)#AtWfQrMOZ(}=l{VVrFoS%=XBG(3Cr+kXAyBI6&rR% zzFZoI2B2y_AOCVDiLfkTyR4v~aOZiI?c7H7%-rYEbA_DIUZ^lSkhzQj#9$e9?JsU? zc40YETvW5rqq0QzsZ=latvX^D2L3=E*c*d}I3$k&Ml~c$S3yzHq>cTuLgeM_ zHEOgqDOzbhKEjAfin-v}9b5na=YY{(gx`PV_o8xMO-(SoX_0+>93XXqcA}u*7HCz# zzUYS90zf#4xv`xK;4jzKFUi8q9U%4?HVD@wpT-NYXS4* zLDPvaz4t$EbkAK&k)g=ZHR)kqFE6j{BOj{U89c-cqOv*a*y?$33n7cwPI})2@6FoK z=zh2Owj%b{bH9rkea#Un2dVONgJCUl>8S0pKECFS{da5xM4_!-1`>fufaW}~*|&W# zG`zaLZaB&rFE>6u9>CJ=;_e=op5FJPcsQ8{1fV%!et|1^uLGyI-%DuU@QR{1iJI2y zl73F>gOPcd%^tWCK$98yk5KUmw@L&}iR5!~X(@H7QP*A(3dTo|(x4w$aI1%L2OeQy z^Q*TQ>oZNrqU35?*hFy6OP2s@-mK*FQ35zg@Fq+L<9j@&2L`!yo9Sj^-yO_%Ipr;; ztTsZa1t4Famv>p})c!-*It$F);8rFKP_+i!vX(2CvVL|4xZ~ikk-WZ<%u>by4jb0G zSfQ;(i0yUnA~lz}tA2H65GGEKTmk?Bu~}K7wq@P_aNRZ4)xoqB{Pl9!03!Ppv`G7! zEvyLb^@Ln{;@2+^SgP0l8&ce^q0K%2B}Dt6BEo_TFv0z;8K`_?Sp6M0B=wAI3+h5# z*Iq#S%-h^!ADm{wkHBnER95~-p*T)s%rEoE+QvGT^<{-33MW{-iyuEEx2rr@Gcj3U zOX5eet1%lneW}$*Qw?JTGfcT}IP1E+=w){+im)EJt&5RLry1HW^pzBH_r8vdj5O+A z3}j@C$jN`_d%Tt{_}ij&5ZY(s(GvR9w3yhpZ{;N~{F zAUAyN{NH-kA$UuwIyl_VHth227|40}oCLePq5_F@1b*pl)mIfr--Q**;y5dY1*h3a z>bsEvISqd_nS}y(HnluCw~O50TQDl|uAjIncQVz(%sz`KsbFsz6m=PsZR$nO(!J-H zNaUW!@3~Mbd;7V?qzehjR?MFtPrzDHLr<^e=@;iKe*UkLMn9Tt{QBIm({q>Q7K?ND z&Kuo2Q+$(-yuZH;3``6*L_qoQO*`v|Fo*H)e*Kn)x^6R>>M3Q6=(*s_<^DzZsdJs8 zUl^2!Axq{Pq6cq*rgvxOUVjujhiTiN=f@-#BE6o{qz^&GAsbCAjgng9D;$>h^TVt# zf9p8qI!cO%4ICm`!9g))<$HU3CooUGDb^rJ+(6IFgqF}GT4%8J$dSS%@7zxD^zTGr zrt$cYna}3StXv2p`$i*hE$R+D$GMnr3_9ZSb#SZ5v7!DV#Zbs$+lPu+7u8|k;{JD+N6Zyzqi?0!}CYk?V5+QDHfcGB#xNCq38 zlGFQ=96Pihi91Z zBbA|0gY~3kYBXBLQ7D5gLcz}NDuAptQ}(2!4NyHfn@-CE4wm%@J22mn!_UVd*-dnf zOHA$fVWo)~Pd@s~%cV_9kzD%J?*c<(@<)q=v$M0B7KQ%k7?7kCA_++eaN}?(YWMuI z?8czN5C!2o0cgcYg6z61wZxxl6BJU+?|E!rKDDfqadw6_y;2*9dXpE`>dc>nn@TGh0Y(Zmjv>!U;crsF9v0>@fWr z%ehqj#-}xNr^TqznNqFKwqt@O18N^$y-i9A&87(p;^}MO%tS|aA9N3~>bWjzgWYX58#PgAFr%|d{CvZU zPue#86k_P3sV%?G#Di+b*;!02X?QStoJrEjZ{ARkQTaLwDN88Akpk-lgYG`1m=UgT zwCYv(_u*FwW6DYHkqa?;w}$J+J{l4gH|Hz_Oc6qOxNyhMD!FJ1HpZ&4Nf{VmWZgHK zJ<+Ep=W79?!OHFdgi7n#*UaI9y(-K(8W|uk&0dxWAsfr3eK7KfM(5>bV zqUeIL>sn3Z>2o=N$xG=`OOg69s5HX z0P43wK0(hx(}nLP@e8Mzn-R<@y1Gi~TmjIn!Id34yjuAu4th2i*P#0cs4L#ZXc?-;2ggbMF9Env|3j6AwEO>dmy*+6LzG zOO+?$C-L({w2xoqq&9n~t6zh;7E8_v=DOgU%?s0|=XrwFqmqDY1O4gihFk8c&}Tlr zU~P)50RhKXZTtowO1LFEsg%Mh9$EBn28MDuqPSS;%v`1*(&C0P_r28u<&2Q~-(?*P z?l+6Y{`=|>W2vUYtA%BD|!q_!xTtQ^{mX@;c zT@GP0-FbKqAyfAX1n>58*CmNb^8jA}L<@+c50N@H;NUK^Tf1pPgG4EYY=XzjH-s}+ z=;Adt8Ft4HEiQ}A>)L8EX3j42#6ZlZnp&*;_1|g*X+MC~GFI)tKosgTIcB%NuFG=! zb{54^B)S+(nwjx}-dx)MWxYVC6dr;AFS_J3nD_48WAOgKfyZ2Ki<+V(T7DH}aqXHU zS6@yJ+q3152k)Pz7eDKhy~y0}sJ=?Ge4+>I>j;nZamJfBTO*Whud&nQTA%*G&0%~- z;0VV~j>Y(AuM}A1DFCs}yXWBVyyE?xSyg&d@Ho)(9C?e7z=194^CkFYD*4l=Ph~;) ziWsK@lfJO9{&G^UG%xk%^(-yrb|%8UBfCfuIaJ?k%KnA!+y0UY3IwU!suxBqVu0Ip0lS7Y zU`8Y9ipU@X9quk?a_2{b+P9e{oYNi)R{Tc!WundFzEU2wx*gLL%!{AfS zZ)!HtyTM5vg{%YE$Xixjbi50))slbxq6Y8ruQ1a`p{?ama!|{L3n-i+F*ZIfE`W`| z#np8fBFjMqW@%Yu0runM*Hv;IpE1FZMJw!_Ffv+l>*2$cff+}vG=V1Q^0x4|46>St z4RVM>hpi&6(b<}U(E$+N@d{g`3al(s%^#M?&vSdLiIaR~G-rKJ5-tUY0;A#lVAK;* z|By^Kgvx_|i1p#5S16j7p?THuzs(%b6rDjvR{`m$iXY^JTUo2PySo$YXQFeY;0wxf zT+W!0rTg77?$2PfT5bj=i?MH0@Wq}#zr3-rQG}M!&>#iK5Aus&gHKYa|Ak+b!$mBV z6%EZ{jx?<%QJ}p&1XDoX@K<&4N0&9Ry68)yOyOUdJSneRoMws`!YGWc$RfGjBgt9y z&`as$g#jw5YG1`|eL5&-HK8x{^}zB?S6d<0Ol;n%gyS{HosNrTAz*G6OYZ4u49ihc zkCOmAskpnCL%)(-H?|m!W+vyA7c=gQkmc>OcWQn>dOei9TeVilr!Fm~@V%USCW8Tk z*sI~}Ea`-CD}UR$OM*Xql8LMAZsxElWeAP1wD0Xh;||pd7gqR}48gAoI|ozIOp#Yc z#NPj3wc7gTrn$T4!yFDs9MVcB5(rQWOQ__%&Z(=!MLPfW9QO_1T|C@~oa|y;Mn-~i zGjZB1mPql-`yQmAZIDF8-0Q%ykFi8iXlM+r{8@is7bxo`^X-a-?89Y=IfvN5KDmXx z28ygoibfUhH#mVX>8!=>{n^3^gjQgWd{>2 zN)En^-@i@uR1Qj=@|p11&@v0z=2}x!9U88|oo%J&69KtL*xOkpmQoZOV-=jV75Ir# z_)}biClnt(Ea2VtracoJ&M@?2Xl~%#p41>^m6GRusRTnXAGx%!ii%?&fh4&Uwzw1t z3-(<6Q;#1eQD0@6nnGW;(61hc7jQi`ZnAM`ZMc4Rk>2OJej%by#eR9@a`gM=wbR(+ zShpo>Rf|77BHbR@Gs599`b;7rs@A8Oj0>>hSxs#Yz)~&}x`_^rlviNk<9prT&w0{Z zwx(A2&(AIoqhGLj;O586IU>Abe|w=ED2+&cjZu4x7j0#>QroGAAO|TNZ9y= z5Bt36V)|-Re2{Hg0Hg|b5KcX$*QDFoyYZM;s1xTa3sMzGa~PSsC7TQ;QGBH8jzUW9 zC7Q(nR_K5N8^H|crkcy}U`fB-ia&H(Sf+?VTcSgHZSJ_z3OdFrr=5#KDTf6`pqT;1 zQ#&G=7RHF+9D*>?9LpEC#VN0y;K(1pJNgkeFxoMTq0eA+eodvA-oj*dFM5j%Zgg6r z%kAwi53??guu@h{)LrRxX*Z7vZr)Zayn!{2>;Wq-LtqW9mAwpkzR?fge6r471kCcp zR(=Xs{e0plpA-=PntqS$L{`Y~?u7?TtT9tDKh<->$yN*diz8 zfT5}Q@3ra~BX(yyAkd1Q4_rW3VhWCf_-09{u@f?U1fm>&@n=n z1fyEc`}c1)H|-%vXvPV6YDlzY$(JP_@UwuS4zh^cJ$5&$VY2#EjC)%?EHIi>Th8$| zd~<=EYPE%^se1R}UqjKub25o$E>V~&HbJ{L)MLMEVX4Q;|2-a5Q@?t(o81H>DwKFT z_v9i7G&jz}-wY&3un}?}`n}EJQuUX1hV#Fo>ywRdf-cj9v#FbobFWa{7RaW*(j2p~ zd?hff;Qf>M0SJ_6S%|ry1Y-9e>#evYlG&&;1QD(qz##E7u;JIHe z@>PTnU@mC-AQ~pBWEBYg+17XJN^;TYk+^%m&?3t$QtA@X#d%h#A|F0#>9KQ`R6fzt zk%Jp1!0;7NZ%BQ^`wX}kU|P@I5e}Bfj>#jZl!X*h1pOIx1qhWy`kL~voRX4ZH!A;- zlvMfT$0mJm|Gyt!D&!WLJIJnQ0pVk%{0d;tH!cM*!b%jmG1op;JM$+OylypuZ8f4j zg~X;?5jh}|f=`lCCqF6pC8(Nhk|buAt_+Se6S}TnAex&i%}d7c4;wmA(v54Y#q&w1 zaYM<&XTzDWcdE*XjEcbtF^Y{#2{0lwcsAtf*n_f)ag2^HyV@$I$@l);2sMt4y`B85 z2F=#_VZg3ek|vkmud;LTHl{iX*&Pb_MaJQ`-nfwhl%ijheI2?@=JY4kDuB5Ig`r_P z#A<}s^$#!Xi(o?x`bkm+b8<~RjmTctz6cEz4z@D&-w$m`Bj?*Cl5X$X64*@TWgd4M zC$n6UEBkn}B8B?RD~oT5+{}8Xw3p5?CKRhHjD}^Xsfi#4O956?D3)9_LHT;AEh^fk z%v7K>>JFT6*aXqXB-wn@{|3T98HMuI1aj@1F3xJ-I3R^_b0E8+@`?iHUf4Bl9H4QR zMWmZUqT)k16rl?)ho%oq3={yMMLOka>}rZPSG%6MYF@Qb>Y;+_i608K^Ahs%_^=%2 z=HncmQUi}26bf9nd|-T)B?(TZuwekw`tPp+SbdqoX~0{Cgi>?lAOgaGL{hG7Zgwp1 zI-StDJO1msHa%5?Nam%~e*?0fQ(c`D8A%8sPhLnW|6d(}?7n{1$}(SjlgAJ)6>B!` zT=(dPyU=inW=>;c28^ZfPQq(#<#c64s=T}$yi+6-&Ahz55z$Uw9(HJJK#6tDq&-4T zh^Bk=_ekmaPe5DL$x-oSPC^-oehiohLqM=BN&8uVwnobwxLXR2P#X!-B7NlXF)kE0 zbp-eCd3zU`xe=HU7+{}{z`dwr^vgb9U45>FtzJi(PU{?(eKn1Ac)8sKKj4Xn2mVd* z7pLQr1-S*d2&ofjCQ8X%0q~J-Thq#tlEM)=&+d5VSk^uNF|r4Fm`Q-l^EgaDhA&A@ zK|z9C8f5mapHIdrEClrR^#O-!nfuGN%)i5@Mb3B2_!cmABVYP|R@b7aw*7VH;^w0E z#ex`P_{tRk;{n9D%GmDe=0Y#Pbmb5WX38VaBT#%!EBuCOQ_R8P)860ia-T^^rmUtq z&2umA|G3awjs-+$?RKx4WB5yg8elI0*(B_}Nb5SQ{I0s1a%!-J$VH0JdG|5Ob&RsO?c)FImCKQ@R-1%cJ zBuj*lZs*n#P_WG6#qA>Ru-v*e?_4_uQRcufG?!56FA}woN0DF$Ky4-cG^)r({-B;n z>SVm!$*;AFq{@juJNpZKiCE<1zcVQK<;ZqBct8&Mhvv_>B?8xX#;LuFz~gWNuW}-F zLi(r~)lt6leF04~?L=0s5%acj!PbGkw#S;T+NcoSPfEs}-~g;laWuyHuT}v&UJ8Gl zX~DS`@IPRrT#xAt8dz@Ka2p=_sQ@?~yxWFcAm5f4*7DY`2GR_METG%*G*`+Vx--9h zOR?Wx?xeC<6_QOnc2m&t9cC*R+dW7Ugq`UgDl=0B+-Efll(Id{xsPy;OfAfAhF$U` z+l^-b+`$-e>3dNGM|UDngaUHX$D)7C30@yw`Nd5!R)dyye|kRx?fCbrxV5!S(Z^yl z?^WPX{{g`l1p2*?n_P7MJ~8oTVncjbi$%UFUE4OD4k@Lhd?odp6@Un<>O3(}*KW3n zpM&DzL<`K9_Mbv?WMfyVjTY7e* z*gbeGGQ+&^MtAr07(;Ua9*U=a5LlrB*`oj(fjKy|0kJ5Q1X#_1P8I1zp3oHn=Yrzy zli2ihCE%<==K?74_vxV?u<@w1UK{~SBoMkFwlM1CI88GHAOU|)*viPx9-d}j7Y=gq zm;YAO!D^)o>C)k7n$l3{FyUovcF3;cXp z?qv1Rgf;(zp6o;PeNhGkeq`E_}rhqVX))QlFBe-BO(##%ai= zpMtL)aT|pvV`;Zh-T_-gLAw4Jml7Z%P~0tfS7JX?s|xbgaMm!NTT#~@Et{6j-2(&^2Rpzx({N~e zh?v^1PIKL`Y86A7n(6|(=&k>$2@miiz;!*il>n$EP9~jBa}8Ix2@#<|#?C>E6f*|! z9^*2(6X*7w2!oOp0*w@@C#YP3xFv_`LcXnolKMXGM-gC@SN_3>O3!sf8zLfJLhK-6 zYv~JE-yj<$8lu9W4F>zdcZ|gP0ir`_6@n7V)k-cJXgVNQ7ZAx1ja z(Zd$x*AQhD2wkpK*?MMy?(kQhAPs-Nz`yGEd`gd=>ks2$2VqNGBYj-Lv?p*a-Y`8b z&QF5?gWootFDA&0iBqS|vq|(-E7Q#gsGj31{{OmQS0Uu-zk7lg_$ucPiwBvUyfV{0 zz9{JAc6N5V4B4qYwBo21iF_EuP*6W=v&u z^-G9(fX}lM95l>SeOfs3*yLG}f?$S<3jmW^+LGE7aJI5zSATK2e5)S4_#W*j*k)Hf z)d5&dFv}~ZZcAK2vwBXe){rQpc|OA6u?|BUoA)V{iq1;k<;(A*uF~9Oq>d^F2Mc6_ zU0l5Q_1w$vd^amsilPC3Gy8g4jvQjvcm?J-XOR_oC*9+CT4a{W-c;;eg?G+ z;8U~Xf2+tvlaPR&?46ICG3fsR$yI;y#60fz{GZYnpOWBGiA_wDDP%#V#04-anwpv- z8vHM38x9MOf-5U4@T(vI1oQ*IrB5s$Mfizy?vu@+nf5q8TJ{9<77V0^gL@cp&=)5` zS`oNe{|iY4KpByCn1gSKQkF;tkOm;crZLe`Pze@=NZvH)Lh?#VqJeFkrR7I;yHz=r z7pYS`W;^6V9R+i{NAOpC#(N2^47hNSOJ@UdGG8$RfV((JASE#y`O1^C{m!HGwk-<{e((NQU#Ru?4VjrQ!}by753Iz z+GRU*tz3h=bf3U?2HBho`qZQ>E!~9tyb$1GJ*F3E79$ZS0ilS9{|re$AsN%%yYVQL zuI*$^oEn?U=CyfTVh?qcV~5b^TyB3ue?~E=`+;l^ES_)!Dw>c${)P?i73rrIqhY3e ztz3T(j*5$lxP&9MU$1|#g|`;DMP8;nT0d$Nbtr8(bX*qRp?s_?k?fQzzvSuX<2z`F zN;hY${^Z60({d&4!$6KlB*412;3b?Q_y%m= zZ~Jt2U^mEn^MT!T|E0}>-o^Ph2B*vjPa?HIcPbgyJ%ZmGOeja~e0HEz`TT9Z>~nr4 zi-zBgIts}w9XMar1qO9U(IwfpY{;QN+4?1Y=XBB5*AJRu5F?R-F^MR&mp*~NU(bh~ z0NS5#t5QNd!`|%5X(3OK&$xtBb|x-v0MVGK}FRS))_AS=ixGL`&>$%)~9= z{kBsYC^^Y**FAB4GR{zK?sEgY4zc{qOlOrs;zlt?rIQA=!?rG+9 zFpoxhNe~lr#|L{@QzrAgHywL_ZzWcgDF(ZG)Ow88>vH?GKSWh`!lP83&xNO{z1Q96 z6*Goct2)ZqBAyJp02uz$FmxR`x6YNX6Laqs5DbLO#Xu>8J*fOY)_EuI!KicPG29Rl z80rD3Hsq26GVue0{c102+PiH7!z5zbeDN%|yIqgSBVV1w82uU-W%^QNQFYEmpc|mgGg!T0)A?tRKDF+O%{)U1GNi-0q-VPQ6paYg6mxleEB(Sf*l?93l2nbW4 z<%cr^G(c=|gm?;q7ucVKP*e`_0*ze*nkGen6S9AjI5ceILhuh0{03m(1q}U%59uH9 zRMbLpv!$gaP|s39xr5*X9maP9)Yu|B*SKk<1DR-5C>6BChm~bT#Hn@7H0D55){txB(EY%*}#&zD_h>Pza zFGcl)?>V(gwYv+jGXt{Oq4p&GNYDzzhE4M&K_;+<(&SU9PGSxxg_By{Dcts8_*PrS z^G*gm#!)Ug)d4XQC5jrkF0D6M#x(R;Be-V36reH$ksd@z5)@LRl4IrAXmcuZ$&z~8 zLBi0s=v?MKVDF+VJECQ?PIdd?3#Bc`l@-gv@^Vt$#IAw+jLi$;q^vKw@37;(Ysg7A zWD6Tzpp!79*{Ka--|(zC;(}}%Y9~}*Prt~V#dztqJcZl;=uEbr{&(LbaY((ohSl>u z7=+JpnVJ0{+ptS<0<3UMFpYpZr|snVG*pPE!+gMA4$etM?H+SQR>Lc`@}blp2ZG(P zR0??tNNyWH;vE-^=W+>JUteG7h=XRhb;)5n5M{KoaxD9S_>^oJhlhz)X96zWOV8nC zfJ&|}laEG!6rrQRe&>mkf+nAoJPRZm9Q*uU`VDA?BurJ5F9eAJrUH&1kXI`B2bA+^ zoA1#7`lih0bCNTO&A3Gmf=6>MmlkF+}K}0 zN*BN;l&tRZoaeIHl9Q^5anmTP>AWQr*|SYL6H9>|0Dz##`G&y-4qg0V!5_x3&L3GY zQyG~!YT2#G^x=LADk{vjyjX|xnd(s#Q7{vR-pKa;xmX%uEkfO!yW!S{2BBC~$$OBzrQ z3xPS0)_#8o9&z7bcMo{WO)x})S$)W-31FC1>GivJ@0uKxOo25TVvLH)$cWK!I^-Jf0{-tMdNVk-CjtK~81}+8RPIguuZ=#@rki$o^$o*{V3@EWa|~WZ7(jpiR0^G*+$>4`3G9h`*ztu*9Si#; zc(_1$1d5}A`P*6I!-pQTi~z}BXICLnJv#-K;8>$KF&fRyF3ONKU=cSD|JA!90ub9^ z)e*)VoXX`$f%E|)L%t7=x{|Oa^A^9d)AC(B5C2f$*kvY{oK^Df<`q~7!tbS%Xb=N)u$75n1)fs2hu zJ*INH&|d?8`0KJnC3SBb=I5*OD6kSBgtCx8o+`jbOhoAx#-GA-kmzgK{zYj7)B+8-eC54r+jRc{Z6Ef>Z;#YSuvye41Y8o5KWj`b z;TfNh*S#{rYrSLAcD_BJTWI_;!2T|_Z_ajB4ibI2(?+IR>a~aVyT;hXyuyE@AHKJn z-W(6#nRqIW0(}c zeEh#1Kd=|G05zRr4n6}N)G`FY&Xsl2n=JQdAXckLz#g)({?F4T(G1=}7)gjlPh&yD z3woyjwg@n3H#TO5PiQo=ONAF4?&$FF@UHSc$V9ANO0^l})y(Ldb3|Oe07w1Lwil%K z&@s0yYy;3IucC5`kB=g$*KGURym$JXBb7Yr@5vd=F~LJa8c=wE4haGa2y$r$4@EWY zijtqBqli8L=%~;k0PP1HnVC~kQVxAYpeq5EE>a~D5|B6-SiQp}4IK|W(;Li|yn?vV zciTK0U%+2c@3vtK!&x81%|e9NcaSm1tBT0Owi%2v*`X$o&YbU8Bk_KqOhFWVN-&>+ zvNtX(Yv8JY4<=wt5d7k?yy5P#_<663GX;p%I{0Y>-?4(#{%NNB^MR5fwV>RjlPJ^Q z?;h;mSm8^w0~tFC;;OTbkCDV2MX(3iTj24n^h#@;Vt{ZCRc)^Nl?PMP#KWkB!S zuqvP+S>waQK?2Q+Fj9cgQeJ)mH)LBNol(Qn1SxF&QY}b74)UbzYu!579c?-r@xdj; z(&dMd!Q=7tt|n8-#r(w7h%&?|0@Dc0yq^)9rIS|!sGP9UMJ#81I{#(^awmAik&}`t8LYr}4qs@<qZs=j0*o$Yw}>-&?AXDj|K#!gG~?Qg*FPBPI{aqgLbO97=y z=Y|_oSndob#k)$EM;I?00)?sU(w!{PGHz~e>$(E5AyzIn5536c$-jrh-Hu$230lMH zycPRhJnYeR?+7eExB4l>^vCWGFShtB=+jK$Z2UVu8RVTRm*cue3pQWP3)?wsb=p5P z$X^3W38H9QWFjvvW+nMM5!4$J^-_pwG?Y!M-6sFz$9tV;BkLT)abnKDf&tr6!9lU< z_LS6>5L-?%s4&^j9y=`fAc*1N_yGM<#b}AdcS06YA~>o1ut1}5z>AO zv&ioLghK_`!vmyR^!|NrMMb>WSC^^YzCKfsSs)QoaQ(e}$>Zwk3j4Fcp&9I5_yVEu75Bd$O{!s`TZu%K6_=QN%nGWJrhW7NWgSo2h^x3iAX&wk+}x;||jd z;I7)*Ags(SF189YL$B&E!h_0B0KZgNQ2|2@!uwj`Bo`GG%_3@(4Y%F<7d!VszBU3- z$?)ksWfMkUs;-d{6S7#kLdju{gnT`(i-c6cm!pjbgFk% zpAGOUwZ|378~GFXxPhd<$?sbt*Da zeGLdg-W$Ne3!>7BN{VGhjWc}8h)&{DF>*WQTsH1~gk|HLbFEx5%21gA9yowA%-y6= zr61gTm7xOCmei8$;#BQqLfkX(;kzNtm#@<<9^tx;JN3hn%Mu!&19y8~(9ZC;-% zupECa<1?NVIIX*tZkkU0l)|l64}@b&-!23n;W?q?cR(ib1{@khQ_-Y>!HfigESD7% zIm@(4W$K0Wpuz&H0xt)X%JP>Z>F&Od@j~uRzI$)iIpRqQt<_mPXK{_-8J4&)Fkgzu zK_w@*{cC|IQ2?}s(BFzdG+BfTE_RrzZa!IhdhB>uigGH2LBO8mb?I^2Fa>W0^9*TJ zT%I2dGk4BAjz@jDt0CHX6K59{2h($|+7`bK9Fm4(ytW`Fp~|+maXygSFaqBykNbCq zl2CkiFnNeTe2YLz13sBVh^d_112L4m1c5M#1U{7#VGZ8%st?xhDc>s=W=(w&-G4ZN z;;1$BE;X7Nb>%!E-zeX=9;n!Kow>ZP3F$3h56FJ+o{6EMAu3~iT&Ex+S^0%P!2k}P zrUdG@!+ABuuL4cUwC!5F}`?l7NX}pb1Yz;6!4Uy$nZSz)OL-U(@4<)$w-t^!Nl{73QbC%%ggUuRg;e=RnOt?~ z8Bi?O2wnqA45p&5UopUB9?)M%FoK;DKy4bJ;>lstbDwgBuEw~G3cN`w^5tmXv{TX0 zAOJVATbF)wUDsF`U=+BqSovl4c!Y#{fP~xuGd9Sw5gjqC#$j{a0bcTyAY%a7c)pe4 zoD1-MB=-;b3t=rED)NsB$eX||1gQq39KGS_MU1HcL63X;RvHkOx)L&i*YINzum^x1 z7I`4MbaZrp#2>yAh%^S}uCh)LD2|l=V=z-7?VPapJ{Z*Ee?2@DM3!#deSN9YU%?Yfd((CP!q9K_KJAM&!j$_`vw`1;bGNu=_Eu49;1MDU#Iu^TMY)faC6*! z40f(a1BTpis(w51@OAo~%sQ;DZAd1v_O^^HaBq1VGuZ!>bdvBe`eo8v4k|1%!VoGd zs#&Z((RsUP=7qR+-)S+6!gb2d-&@I^N=F&f8}NHPrYDA{j+l_( zUD~~~9G4lV;`W3eD3HwLgxS0)#3E?vf%G=>1-mQS+Efe-ppwm$W9czVvdb#I?ytGD}7z35gK; zKi;43|JOO4(>axU@B6;r&)4($cs|C++mQzjvO{mbeEGtCW+=P5*Dzv{eeBfC<}amZ z5F*8OU}sEP+PfB`BYP4l=^8$ImNnVn{dkMak&E3(K*v)fkG$reuUaEpUG)lp~2OV}M3FKYR!xO$BAW z{q#p2=pbcU`@M|X{4Z4Q-;?+@esr8ns|W5$H(X3+mS@%HOI!rx`JW{Rhkwy z_!!JUH9-j@7zXjS#M&Qk0?`m>szU3nsA*`>Gy>wVsSnwUm%^g!(IbEGgCH(J4a>xv z1#1u20nHjV?64hSW@WXuu?ZlS^Dr=pTSMbFM%3F5-wlERxOfx3lxwTK)f3=`bFuX% z%KNgNHNU;L*W6tQt1=*0q9s?4mJD6pwSK!14Jg98*vHV4;lro2w3kaZ2aBUqb;-SH7(f*&8wD?16JHPw~eCK5moGh_oG0=^kn!X9d ztzkaAej-}XRFHhb_)2PGX@wH=-b@Y*>e@ zJL=qz!3~s>7R3J`F0CH51dI8=!0n7ZKQcl?Ls2o_rIxur;Ep+Le)g=CzvB6;J2INk zGpyj0v3S^I~d0M1mOuP z?X=SqUwk|J^i1b5WqrtFf(ss+gO>Pt^nIu9sw@nYr##M>m^2aYDfae?*PHC~%3`LY z7ZbR*^o)IfE8Zq+w^Oiv`jhsM^h%p}hef*7X8@zGjPHR_shntV@eO4>dCTj+A%ZUAf=Y!H?SN02?vtbx@s(2*w zs^eBD&3>K!9n~w--8u4ApQh5!Lh1qa3c>sk6g#gK3EoJ|P3Aa-Sl-!#K{Zsa_-zoR|&8ae-;so(o-ND-$WWTOt3tI_O-2 zL%yC^WUq!J8s=h)>>eKOK#V3t+uUd|qN4V^9kS1JU?H@f2p+d?Pn9P4g*ZyPpx(f0y#Z^b zl@B>`^)Ns1f~7gJ2*MjgJ4EdK4_bSBr_Rs2p|EYjtV*~>0qjSGQH*-WJySpC25KP= zFqlX0s24V|Qpi;mn8<7YPHiE!oGJtqbRfDMd*$CydF z#124ETiiXcn~Ldib~f6Zsc-g^H9LG;X?^Cl$}JUE!+nx!cu47*wb(NHqrlw=^wofg*F++Z;XF@`O}%b4m63>;ajN z9Y|1kYe64%rQD4yLS4Z|3t;S9a(mNUkSVFiroZnfPQ#bKB>-`6PBhLhC+X&A9p5wS zshEn!nLgO$pKc55iBz3^())p4&;MOBG&H26-X?8wtF!2Vx1Gx8rP@xano5qWDS@L2 zyYw0LkA)8m_*3{F%FEv$6BqXmfZ#iJK6N*S>2Us}hmBd>IFcA-c-v-=Od5|atO~}x zMll1A3zEW@uU|n*tjD-byH{}g@)VwOdW?jSd?XZwV!Li+6!-YF6xxrvN-E$41Rk-r zvVaZ%Ow56S6CgC@JbxaEBNUE3IkCYOp9XEsUYihb%TZVVDAKJ4U3lIOC_w^2OcCA{myz>2K3@iJ` z=NCIh$P<3Wq{~hNFR3CMowu#*AF6kkE&X^b4Me4fe$;m4hW^a#m*d&Pe}4adkdy?Q zcOC%d#L)0Y>ywL=ABVQgaIsZGaY6YN<3l>>zyBC4uxs$RnMO0C(?tE}>#Kg4m*$tN zjt}ovc0SnClut&6RU?{#O7qi+^n%OZ7zT=5N-ncXel}J=SAjDEGlMOUig?64tbB@g zwf%>w?*U``9bCm_u3jzDy9SD@R!GN{Tv@6|`ph zK{ZV}YpNkz@Wr+1Dg4`Vx`Qp5;s-MqOQO}!2Nwf-*+h`(mM)icclH6v9mm-(P1J&w zp-H($Jc(Y2PbJu`;P&#O^N4IDbYesX>=EOq7E|vZ6OLPxICfwDIH`I1v`K}hD84)F znKboXK-MAB3GUwA40}-+_oEKn-MXXguf{J5dTt@$t~g83y_yJK5*XBIoRPll=-7EJ z4N$S%e6TL?WGwBt4(xu!zY|z#P?o3caDGaQ2PUwUg-IeC2h9uy4q`!uZc9v3QWcF1 znN0q@w8R<0iKhWF1uW82^yIs9(R#tm{^{ZBr|tj81$ZimMH@5**pwrG93ox0WD=T^ zXGOj!IY67Szq<=IKnzL^o;;!p8Nbm_qq%th{r6oHf zf4F9_ZqFlep5Q*R&j%Hz|JCLF^PZ_gL*B11zDc7&P;Pd4G6>JDEc?E^y}M3qQDirk z$Eax|Q!|>RWo4DY1j4I;-AF5FqE`Tgv4y$})_T84XCDV$O*D;i-3L2#5$f*K$LOgRuKZgP!ou(9#+dwue|!Terofi3 zIT24u?7QT9dAXoK<{#C_s*4+Zo?Vz3we{5wL37Ptrr!seOI$0)sNC|hMjssf_^*;p zn5;yGI*yLqnRHe<5~g8A#oB)jMVt@qHB#vHsEvBDA`&olLo0ogf_!FC>Yn!KL{hrT znwZfZo#Xn4oXh`857$Yr3ywYSzM!WrP-|LZd)rb(POkmiH_8yagzf13@gnkF?vOBQ zny#n(Hrb?+tH+yL-*KH3N^|9JYx>rdt(tqe{MGS8Tg%6MC*H*L=dc9c6>LVc*7S`MM-K4g{~R=)faFW)@Dbs;7nF5e=r3VqF?oH% zg4|$A82o8-rO+rkk{P}bxUw)|=4LFxlJ+1&Vo(jYJ_7X!!wAnxb5%99&D}0m zt7sguLN zvnMnnJbX`NBb*;_u0PBOa^d|LVDNJ-bzYJ|dNVokKrpZT8w(11(zxZNmdliZEC0r; z2M#Z&?Z4j;YEjX1E{%R-uh#AUd1%6QIMU{+$T}${cTDs1h$~_B$L9HEKdeW%_DDTmUSm*I zmPxV#<4~O1Rs`jUR9($}|A(xUThvM4;`!@g5z3n{?9gD0y09A-F{rW2Yd#o$#l^c> zN-E7~sidK%uY3PklV~ZxXEVw_+l7iJ*s2~~M}X)AYZ!kE7RD$+8$or;fF+I|e*pGV znVEM%2rzzb{*GwW@GucRd*ub_)F6N=etOE_%o%VTfm;%Wo*Eih;)n7lyp-vYpfQbq zHdNF&Rv6@ptE5|4-9;(vrE##+?Yu|ivVyz_ z@_i9JHlTb!HH#+?V?zLxp>a~Y*#xfu?-(ro5zt@;7ZjwhVXX7SsD}%KPf8>~7UA*} z{G{TXOYDHe(@l8;@20w@V3>qU2>4m4j6Z$9_z=H03Fw$rLURku zYrz&pOd#Km-5-99$LRh7QGrMDOY+y*>u;#;`4NFJvarb{5HP};sd40izR@;}S<1DZ zvgYXRP)^ym%-s|Az6+ugo6oW(Avwm=mz2beiiKfe#zRz2GNO0v@ta2s$M*5bOYMI? zNbY>g0ovhR>&E4Y-s<*}jTy5cx5k4|I7LNA!?2LgDQ}Uq4DhV&htsc}znIyXAHT^D zjjFLEx|)k7O}Gz~1ox2-$p|VwCOJ}$2G@!jBnUaResI{bg)H)IdPaPgdNc@(9700j zND!#VufT>Y@5#5osg6{`)nq2UHuclVVitTijMMWe-XET%%{fT^X3%a|wO=Pm?_{+` zZLzjqdV$Rw(M4&V_Izb)3MGQN@TC8&fA`cWItoLTyHuY)66;KR&maPzOGs!8i96!@ z=FN1pmJH$pb{zj6E^ zA5X36pU13}SyS>^0s{EXfAm-0HxX1_9Ch4O8zq7hGJDxzZnfg~pFazTTXq|7+9RP| zxV;=RJ65#EoKMj_NQ)uAw`~R4^vCC7R_)$GFB!?B+}wN@U+uV@d&NE@&v9eh?aD$E z>V(#N+?waFHuKon*_nmrVcNs=QX3)smb?C#gan6%SjeR>4=AV=z9^b+%6szU1w9Ll zBaDumHT}bV+Tz>!7x80=2!9=t7rqdI5|OX1HS|oTaQ!)UNRWAmFnJGtsxFxNxSd8@ zW_?ICn)}CMvMn?iAeaL#G&CZQxB@Ncyhc8wEZJP&5MbRGIthF#ErVacs&?~;O$aAE zZ%s`d_9y;_TWJ8B!`gWEX78Jo{z~~n1&$uGuGZu74Xq7<7umb;X$a~=( zrttf%N8dQn2fv&0I2Z5+J#3L!aVO0|eLCzkHJ=1%0AHcg4H{ODj-{*F<91x@VO>)b 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%0ARtR~G&@)lS=stPm2up|sF=l=RCItvOkz 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%0D5hbkXeik3jo~5L!F6#o1P7k(lp3! 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 wP7p6%jX4 zrSjJ<9fI)#Ac$K^LxXs7?h;vpNvh-)h(x$vZ17y;tqY7S_?R~Oy+y$8LN+@;cjU~9u}EuRY)EaA zqVmK~)dV`AqhENZvs>xwR9Ang0H@sQ>Kf$H+l`jG?6%8+HpKpFzHq5oYM~9u{rmTo z=bT>pMM_>P?N=~z%;Lm_B=ZamLhNu|1EU<65fgvU4r?J}|Bf)g zlc`x*1~;i|YBrvYmKcKg6Z`-pWLMw>F4U!rWI)e&;ui)P($NG&(N6La*SCHA%~#Ba ze*Wy~i^T@u)2-6&Q(6?{%BgcB=_6hj(6G{m{&VB{ZRot(uOc7&o)<2#WhtKVK_^A6 zXUM%*cXrB=_q{W^lvYNJjPkf*-IOCTCbV8hvzeNfXD2oXIWm)W$@bmA%e#Gf7M!l1 zU926gQw(5V_tfH%>X6b}$zv|Lo|2cxd_1JXT(6AhfZHl)-vkgyWwz0<6xG(^=l=hPK-ZuOo+P@fV^@kPHPfoyPP|` zxPG~&e;Hjq_}GdpT9T%35-mcy4cj{JrAA~~5boS??>Wt*h9Xs4v8=%^C>m*aV&mUie{e){XCRp$UAs+TEHmoIkLmfEfIVJ_+UG0R8MfK{$+gFNkV zk(y)I)g8x-!QMk$yaOUHXcc0mLSlr9HHAtGOH7eMwc+8{iu7`yFJKsf{Oa$sv$Grg z0Yu^%%u#?rxo&S?*U-{q@{1vo8-uu5siOIhJQy>B?{C_rx9SiLjs>i@ndu7(#wU273|<>)_X_f;|XTAd62bC#48%f%k(#)Eg@diDQxVpHMVCX9> zgs)9i@_yW?gq#b;U6EaOx(+&c0QXi0M*$FCV^-gij;QQE$0ieoRH3`bn!497(*Nhr z>)fvtagZvOYgEGUiP7SbfXYuU1s2e(m$|L5k_VolM@K81&7z4oJAbO`ceD72;o?*^ zeU?wxPWKChj-5{glyNK8m+{kwC?oMeeQ?%FadGwZF1e&CK}BVyHka0YW>(hMkmo~9 z;+F9cp!S`r%Uy0G{|!yk@-Z^9#dS`fAubn2)^I_hxDFUwt$#cGvP-wN93@qXQR3p^ zR@2rGA6=_Ti!pmF^Hg@!9S(l@R}e)Z2t>fqAK77MQ12dTH;Sk_Dtij{0&ERBEO5th zSWtsH9AaQ5sz zJsIt|BjRhaU{xzk#bGpC^rgYvhy-RWa zM@Bn-Zj&c0iNJ}Ppn~9g4Xg+*F1T#D-a6u9V)1SYVU9XlFAK2QrL-cx=M=>IO%ysU zLF#wG{0E9-28lKasDG;LyHbI{$8@isC+o$$zmkT{O&usNw2b;=u5zR3UG=8%kOun? zP2<(y!BwynWHxxJY3fP|l3N9sWG!^Yy20!Y1*RV;t&0AP_jffv1dSN=Yrrf&5}}G7 zeJXW&XJSWF@kVVpfevy*Sp7x)4+pL-aA}&x>l>-FyLi7cI`PZ(B1XJqvI|Lv)yziagyZU;h-$+7Ofv=i`!eg^0 z@GLy-s<<0(Vct#6V^}*N0lHe4><1r@T>Z=AB1=$g2VR=jNtqq6l&P7gUIEHi42Sgi zB)3sdY{TPO2|%c!Z6n)uIur5_}G z9wCa6Vq{}l8I++wEEgZjKD`Ep6Tl4@A-b0hU%s>-9o3peKBK4|GaE_X|HVx<-bC^m zloc>6mRl%b00h6rY{48_$xr_Xj-=5H(e zs!yMOZ8;if0V8xQg+SlgH^DGRnB;7(M#v@U2+n_Mvq?)C7Dr(dbZ9jNgXG9Ddt%|5D{ z*vNw!4u;mSsGi#fQNe|}!n>Y1ExTkM_%~WBRL{3Sva?iVd>+>~S@Rr~%bor?OZbJ{ zf0|OeC2>eZ{=c6^Fu zNDb>MxP_}qpykmuUB~Kgg+Fh=N|&@&SW5uy)VlJG0Qt0nB?ntdO*H6E>8J!3i9|A8 zUY;Z5vB*JQS45{7cKNDf6gv;t63lbTkyQF*DP0K~P@LCJIa;n**17NCWr7OtR%w#w z%?C?KPRTe#(H+i=w<~h^j*TEJH6})>V7ZJNi}IW8d}#8(Q*Nx%nedsdmDOKGpvFoC z7GFct5N#kTxN-GjV`s+_!v%u%q1=@HkCmVP1EAV(oYg$ITWYwrGFit8BPXsl!!R^w zLXlL#q1S5To7>OK%&z+#Zqjjb;)~%#beLMFDT8ov&^jb&j>^~1@BV#qssj4KnRdRa zAZEs2uPxGU0q%*|6Tf|kRd;G+Ol&KOwbLZw0(D!zT2zovHE z3K9<#Rc0243x+T;|3Oj*=!@DH%9YkW@Lm^HNRS1E9zx~j<)y(0c8BJt2U;5_F=tQq z?F?!MD*s*$E?6sYSq6?CAVCOm$j_-r_{oxs85gtNgDPcz641u~%$q5sHhF{)5-P5J z1&HW+iBZdi7S+D->eSYXN<`wO-K9sv)Sr53pcv4w*Fi_^3j6}p!o%NLYG-XA&@4oL z7qlNjex8ut93k+_fg-vSjBBJKo*9GXsw<+;mV)NxCl5ClT5CJGX_RF3?pH8>L^mZt z(p^EN0$9?GtJH&CPsBG2@0qIe#iQ0*xfC6z(w2dzXO!Y?J3c&^c3Kz2BNVWlFmcMrgZb8@I+s9flHcFgN2_hxMmsBqQsT`k-wrui^AfkgnB04TZ8cxnc zK=Hsp%&yq>?dbnm?k^a3*OGizZ3A8gofq|QA)UB}0$vrlU$~^!*~hB)`{&w^F8$8;weH`IzMX88!4h6gg&u=dVsb8-7`rfVga=3Sx3nTzga(7BCddtlh)9 z@05lgZ@%DVWVGUs>uiJiO7F`B2ynE2limCe4{-0Aq8EO&?N>E4wRYQOgkR+qkP4mL z0wpaiN%Xs}3iZp|Ib|l9l(!Q;+=BV0V?ga!ad9p zDoc?LalkDlM%{tDM-v@!(#fDRg9)Hl)9zmLsFCp~xA4heoGVPNaPh@A zlFwW=x#Ayvo;hJT*qlNYB<8a}W}H%!cXQ+1yR!$|Tiz9nw&PS|op*bZ55d&V_Wa@w zB|7H6LxJj7c67Tu0mREfXOp+w9kwUgG5-xWO;ksRndD)MFr#oJMq9tUxeD>vx2kOT zL=x2#4H~`UM~wnwMveV4J94D}&-<^Q@XslEZf@00SekSU%9`z|EK1X;(SO(E6%zhc z81*1X`38+yqou|x!++H?1U;hgGa>!iGXsVampKUO2}eriB$c|^M@D`@V;s5gWnKSH zE}MTOJgHCB^@{~BaWiQ=X+@w-TDG$c$++PTYD#76J?v8P5bg5Yg;nO7IxPMKDT`aQUPXnXzT+_ z7$k?tCVP2tF1TNi&*waQh5Hw`B#o-O5?au`}`=7D)NL zU-SnoSAydBb!H-Bt?HdfV`O48Q}{~=HBp}!N-5by`c-|(IJ`Zn}TSh_1{&|kdpuM3cP{O&lV_ZK8CE>cJ~^%y}|xJEkG|~%#D$b zd}s>lz=s7>>lei@RbPU`7d(l7HibL;jRHa=BVD3yM|*=A;dtNpQu|F(GH8#$qy48a z%;YU&1sN0eozE+#x4rHgJIx(mshwm^PEI*$Xt@-C{M!X!)}Rl&je3HE7Z z@3%D9`TE%gFYX~|5Vg(;V)BZaXyDeA0BAeUW-=bL#wFk(-|DJSTuSmXAw+yJurWQ1 zmn|!+{hEZ*1|eo-7WKl|mHtOejed%xp$&^>Ih3>e$CSU`sOwdS{*Q=V4J*J7!=WgW zD2EafQeQHFS?3jWwk-^IRd4)}UT8Ha%3!uX6AKYo&dwWZhdoKo4aM`jx&|i6E27LK z7S`T;7IYj|ORM$O-^hP`k+rbPD#|OgpQ=v+mLV!STD|r~(uBT}8#U5!x3+0%ZH+!P zz|y#+^s#B=G!0vf3a+r&*v#S4QCv(*9doG^u+Du?Vrn84aV+3$zR!_y9uREf(f#`^ z(nALvC%EzG;v?`?XhE1jn34>CWL*^I!-%yOETNmsBcK@?8IcAs7R>23jhyO~j%rG- zC&P>-kZP>HBmM}mJe@kwW^4jg^eEy3ZmqpLjp#9fbW4xB_<|z zUKbl_7G~p(+l_K%H-S_S@Tt|@p1Vw-7}FI2iV=29(9;6@x3okDzX2A*o(8{&c*)Wudb3Zx`MQJ^T1TqRJd1QPmDZ!Q_P#xu?EH*a&Ouqq@?EmAqa>mvi zA@`hEE6>y?=W~7mu}RxMQEa$+*g+u6y~16frt`FGTF4KI3&MZtI1#tcm-mvs{68&% zY-c|e=0*yfP5ueed3qpywjG!^Ff>?t7{U&T<^{X;DU! zqP$oJ2^JV9XK_Ze5YsCerO+ybGrw;918eVdaO1V zzSeM$D9k3(2F&!kyNK`047TB&ot+6uu{rGhwOjX}fzMk>DF)sWXV@L)cWy}cboaGN zj0^}kx;>So?JneG3H6KY>A9_;xwPDy4$H8UUcaUJ4MsM$hfGX&3`b{nLTa%dW44k= zB;w-(J)j#Hka#qj-ew;VluhI|bU0I-M<7`=0$AU2xX1|=60zSl`<0TvV9%vv>D$6S zC`}?u9%ymifd;R1kgsH&fI07gGdnl0`n#GYrVQy-3Mp05vTcg1t<+h$1mzC6pG7Vb-}v?BgPq4V&mc^WzbZYu&<3C+Hb(w(fb#OM%EeGU zudMAO5bP@bI+}LtFTWJpn(H!)bAd0F)u_Jf?1$|YdQ$9Cqk&EJia^bqHnXp}Bvqa3 z&$aZj(1We9-Vqe3%U{htSi_upl;O}a3vMB}ILYpGg`M0wpcv~1QA8v|l%letD`YYf6KW^x|+~t`%B5rxmM7TKuSzeiCw5_kA+!B-WGn_RxYJsNj%-;?c*~L>K$xN zb_Uwt;>9u*ah{6j#P)t@{8)OPf=WbXsTd4wc&B+7zp07Oqu zH67yDfx7wul80J2CH3SjAORtJZEpmNEM*>e?Vn=u_2Fjow(6D|`$v>l-Gh>}v} z`67mL_7f#w#X+?MxTEW?xz!^Kt$2%6bNS$-*luO{0x|W^SX246e+8$z3)J)3l@fvV z7CwY|mMC!N68ca6{1xsuKL2G53waPjy;^^pa2Z}u_RJnG-Jojct55%>7ICt(e@$sQ z^P|Ok$~EYZ&j(=tc@%r*t=6IclXlgt6hX7m*^=?aJxxu` zqSZj%FB-F2!O;m<(yoFe?ebve0&Gg(c>x!R$jRmK5;3p!k{Ao`=%Axp5A642=4Mpt zfV@IVCZ=d-zBkuiHHNfdAc8HxAy_*0u3oF86aTYM5m)%K^*;B^!=lgxERtho@?GrX+!*y( z)e-2Q06gS?l453(wuPO>+|!y;NILq~mr3@eYJ)Of7I=M^x?V+>OF)5K}C825L|ShG+Kn1T_;-NNr;6{JPSrf%ty;Dm`d5-mWQ=x=Z9Y*Js6I zN0a6-+@6cDC|%q4iB}5@*a;5d1?nE??tnM6TRV8ek%9O?n`cfpD4=ra3L+^%rLYQ^^G!Tb&^4iR zSaE|!LHPWi8XIrvU`OUel&nprr7wZA0aC)I^<@72^2=amO6DjmerjMKuCT}RsHkw; zyD@}ju7R9Fni@C!$|0!k-+)gDC@Rt<^c`%wcR8{z+OMPC-Tgkudz5myYwWsl!VTgF z{yKi}zUMZ#J{fxgGA8(<5eu2UDTmOX|CMge+b-yN06z<9yA<(rA}1cz z%{~q6<2kjSp|h)^=}ur#h^=A9Hm9O`icT9M`tHp)mI1#z4!ZKFCMCu%xrc;!lvEDC z#nVO8%WidzFw=XQcBb2-k}bw7n8!z0719RR-Ku9Owtke;3K(_me%KJaV>=%7Z)C^#FebT*oRrquK{GU^?cFGyWej{!rxHn=FQ_Vp03+(!v;Xyb#iKcM4p;q|bbVt3C!6(VI56*J@^N(V~%Yei}%5q}F0fe{IOdKGc1v~b%=g`--n=?)YQzmu|YF%>|W(#eFdN-aea9g9ri4IJV?z!^lga4hH%a-#mb#rL%XSg zO!{JQ0l}mWO64Ci%XNp-em*CEt)M$`Ya5*IaUk;%zSxQ56cUP=*r3OY%y7Ht=QU=G z>Vee4Zb&5$_O+A?xAgGfHp(6?&%pnfCv71`_kLiKpQwFp4+PL;qovkdJ>W;FUH)wc zJ$fRdhnr2QL0_I0)3dGqsW-0}!Ygryf}6kXFJ)65ZJE>wqN(*qJ!ntu%?mAb`$B)1 z1_Y3!zQCXoB4J`KMUSfz@fN48ogFKnYDru0aMCSy0Lj@9xfBVEMJ<`yKY!&vb?Uv8 zq>Z!!HRfc5Qv|?Z@JFKERP_xem6L9s`cs93MSFAtA_ClKDb9}{S`lYQz{Otn9@4~e z+U!Ho0tOIxUY-r*Va+cODuHtLC{g4XpDRV0lG4<$65FG`1p3rK#r;1K&|uF5>pfz2 z2I3vAy3Q|(5O=}wh+l!$+^|XfJwIj}q+WomJ+$zVPG0w>ke{SMG~JDW1ggh^&l8~N z>yDbJR^}hMnu*?IqH1SUFK=a@8CFaT76cC8LQ{EHcsmUhn)a6xk*KD;ft)2DXgowY zY&FL~$$|aE|F*zsYZKAYN$JodT;za=a62T=_XA{fE^|`O9POc9LNj}pohXeaUKtnt z$i~(l&#Z%;-(^08n61>6bD4p+oZS^1@y4tKJ)k{$o7_FU*+ja|FUv(p$3^5C5*769 z1yNRD(CVr!ROu-w*fC+nV4Y2kUSbb%@e4a=SY`Vqv#{B>eo_1xRvz)^N8i;uTP9*@ zzf&DmN^xRW>zzf*2xM|I?^QxnBX!m@XJ;HuO&fb_^Ixl)@KEOUD-K=ii1_Lu2?Y~Q zEtx@PNb@@hL(A{!AJ2NX7T#=^A{hDEj@us!V=&z5Ng{Ra zq6&xqnd8MJijr$M-MqWo>omPmJfozKKCN*-XNT5kt1dX}sdcQ#(My%RADk*57;+N( zxL6d2zE)hgXruF9z8ouldsXR>)k%$m`L63Wppc{+BCC9D7B}w_QQI4p?&RbTX)xu#FA4z1OpRkKgPt0bfpq%@BRm z?K{AVTBk)=W@KkU_DDD&bsCytx;PRh6C?bwx*%aI)~kvFTM`71ypfaJK54AwA~H){ zK=dNev@01W{Xvx()x)RU+{}&q>A*NKMES-Nvl2${EhegP@bgD@F7UUAy2>qv<#cIi zYVRf2G=?&16;sA5g2XSfv%|po-_ezL*&9;voPA!U8%7>=1`q?k8|+j3SEp^DJFyOJ zGLZVlwX3i;V1&0J%o8;E+;r>j$i~-=9a-CVS(K%~^4N!hDePW4>c@s@cW5{riTLFg zxAWc=7XH@?020^7Ejr_WJT%eC)&HW%*}#s;4(5MC5da)JeQ)WpoR9xI9dhe z#grtu7dnq@Rp=An=0(nIq0Kgcs}9+*0%7JBGcuay?>`HTNzF6)@Col;k_93%@Auzy zJ6qq$9xSha2|(LJ%kJDr2KwG4yS~2vo^7gdUJ`}6TXPv1AbU|WFbL^i3Dj)W)FL=U zTm>!1=`B~kmN7%u+nQ@4kGnx(Sa)59I0Hw&cFXQPh%VT|$Ce4PR#Z1m`CV4_4jPXE ze>JzY?a^J(N%0oWDJK>#y(^{p^+kL!4h{fMDjh&+BNprdbXW z_u$Zc%!1EpF~46I?~c*NwQVE3a-Pg)+$VH6*|yTM?IZ3+W#oHIhlrFR#hQy7lCS8Y z897E$inH_<+_})@b#?n&G7(>@O|xJ&u^mL$0-~gxPzQAysHFT;_}G157h*moauxd-obcWVm;R z1_z7hKh{d7%V+Fe*ctHq1Zk8z(SO4FkUW0p4en8-i^WWz=QERjDx~Ox!sf{T!mZu; zN@5~@h`1XBYd~6UJ6L?@oX1jC*utFoGUS+^!o&H#tSkcJi$I+Em?avJs_Bb^n!VYV zf&GAiK&8jSV^qu8ZE#MI3TGeYkYIx&L698fY(r>kWwnw6;DqCJz}ke*8Bq&#lSC=V z9|c|>Ub-AkQ4nmZD$o$KCYYQ>&YTJb1BkulcPUScM@5Rguz%a*%Rzmuhc3}u1J2{N zRPo^o=2hEdL~wiTuPmwjmE!BdK14f8v*SoY818s3MrZlA93+nU=JCxd?f5QKYN<8b zC;rd3+bHHa1J7hq9XFW<2_iqpoPzV0dkHqmph~b6X95Uam!voko}(KJfdNwINpfE zi3-b@d^SmHOV%?LMz*#0+|0Na)*97X#2WrjT0%@k186f9hjR zbiEBWe|*BbYspf1EGAu+q@3PoDf=W7a`-HBe5F>JNBtd_zc8b$)4~cr(Jt)JRVIXF z;6`N8Er-(OcNGv3zD+B%sK+;+Y7%e1n`*TnM}#ASO;tymCEI5|&li6)OxZ_@A7a>G ziDMUj+!s$H!w2O+@v@SQ#+E(nkYCl{-ZB;~ljO@Qtscsp#If`6EZ0t1#4G0?|4eCaZ+yvKbU_HDzsL76$>rTfw3lUkp_EYOxp6_ zGA1T@(z-c?YzvSotcU^$Z0~QBCiejjg2(-kEP%Q+`KlEf;p! z|JEf`rARAHB91KE*fWmUp|kQ)f$_GF*%JEc{|+_YLVvME(d)sLUY{kdML??oLD8C; zNt0ePyimqk!*UYMto`iw?7nXq^8=-L*$4Ejn(tQzO#WLjxVS>{Y>2}$$GcKq)9#N_ z>jvWYsS`#~Tk(Wqf!k=~cNMZ}>*>XoL_g_V+I_cntH7KjZX!IV3(63IaQ_bIAX(0= zY3D;z*1i&d_z$_YNNI&Om$8_f90v3))(wz?opNDmgG~T8wy-ej`y+c+DX;{lc%JQe zzd}gQIvDF~r^sz>3z7dP8Cj9scYK|&NNTwo=U46h9%q}}r!UOOv6$Qm3k!qc#O&F# zD^jZeA5Y&MNaf%D-!9oJGg%?yWbZvfRzlgbDSKrr+1s&q$U2Eo_TF2PkdS1PmA!t~ z{d}M2_y6Y;&bjaR`?_8;<`Kase+NCohZh=tcy6xkSE1Z-Fc=6+fP9*_AoheTh@05q z7n0L(x%l~ez;Z}Il_sfSpc-tExbaa1TP_YNT^Nb!%SSkIp<$%v?8BIbx(=PmvT|C^ zSCimpRB7avaFM5{WH_cKlIXP5Dxb!El60W$4D}@DKizR zC*PD^oH{A&T0W2HQ-T1X*zj{|?GIs_KBmkF2Bq@3bU|+6*1@SdLD(9cX-1a+p{*Lm z3dEs#)@+oOP>#XGB2GIog|KrO4zQ6C=a@J$f@H;%NFqI=&++*z?C(npoK=|f=FJ&* zdCMY_H^#T-*8WZ_36gZ8-L(o7^e!n0AD4dKv=p>FQ3#9RP|_yS{2szo3xsRV@Qp3D(BYm%&1NMbz7*jZ2C3f$Y}KEFzr;QRyOmXDNXML z9pa$l7SICnQ^4#WYikEEVv`9ZEjaOKp+o=VkfSE9!A}~AqmOM{-Dl`4Cr)!csSdGE zyo)vY=?lpyVcXp}#S>o%fPYCMi*|QgLwP7&Wv$}k;=rWC?e0R*lNig9;v$NRO+9Hd zc}>r_W7|TwP8jAF>GF=3PZ@hWp4_MAQ4&Z7-G9J{wCEsM{6Q@XsSWW+a@?J>&ER7F z8t%C@dUumCe=!`ngzmpvESUC&eV+`Z1kv`st+Q-5FbVLnfgq&gVBFpAQs4guvWxjC zw^SaX<0mTktgWrh2U7X2yt(MM=AHt~6Z?2BQ6w4yCV#%%X!z+eGI^^Zi@8GlYx!|p z5FI5uE^%Mwje#M=g%+UA_)tgjUcOyOkfa!g;KfPpRyuY=dy&}W(wqvG4=nOK)f8*% z<|t~ny^X=D9~IhbuTT@e_B^@DuHI*8`IcgBqtm*9&+g=vXlvMU!F0>>>%7zKPR%gy zXi;EbcBqG;ukG?#)(%Bwr0oQ`8>Lu6r}C;*82$6hUM(;3&Qo`Px9*rUgx>8<8?a1O zS}iroomG8e!1z@donx#-6zXCz^yG)NW2Lf6Wu6-|QAbX}%wWdLDLHyVd9>Lu4%iB8hZsB8BVkSAFfo4%oJbwKbPKSbL$61agyTWCW;h z-+0oQpppnw!P-<)bi?t!(7p_J3IgIolKYd=zrTXMJ`OIpNG{}>`ueqLghhIh0Vb$u zwOW%@M&JuiWG^Nk(sVX>x4OfW_owY(s0N zJ3DIh{bXTD(XXXpj}zY(HLrTOph!S=Yro@_b#Ud*@p#w4_o~11(AYU2mvt1MylWHg zqRR|_%BRNaY^56)uQG4<^9;R3Wkk5hK=07$y-HA(@Cb4B$ct~s?hyDS1vQ-q`@O9$ z44FAwpJ9TUAVj}Ko?o-nfLdhI7d|z>n_^KU$~DbZeQiIH_)+59H#yn#&y3t%pROpP zZW?qDvKrJK>O!ga6Zre#uL4epi=5jLYR9)Bs+Ch*oaqLQ4&h!=QT#~H2h78uWP&p0 z3DwP%6duvd=F0%Il|yb-P;jvO?@;DPT7i1@K3+@}PeIr&g=4u{^0EOtOUBQx ztyF)NAhOann}rpK)Nf+~kJQyw4GhF!L1Z^-q=umvrUqZXSM)_+Y9JD&;<>8`5@XF$ zZ*^H#OTXQOi`mT$Km|=!Sj6wfDsYPMfV$FE))+PecVb2GXntasp1lDkXtSv!S18t{ z@mWK<#F&HCzWRO2g7F)cYs9sCzPW$?YG}jQj=%pD|EC%(FKnq#FFZ0-kFr~7H{}Au z;;m?UMI<8!IHdAg-S5RKlCg};UD{e&@;Kmd4>Bge3RGl_lQmIC_qVz1= zx%OY2fLZ~3<=t3udtFKK)}-V8_^bDS(e zVXJssy{abMJJ;Qu*Os^{ZT&(EGCe5` z)I_#!$jJrD(#JZRXb!zBuJo^viUoJ=<1iuL6#05f+E7y~slpv!41h8zc_cP*43t=7% zeFW*K&Yk^2&Plegd8Er_m8=#U)Ftk&em70N=C$|Nc&5>(b>cBZqZ8rLrF4KhR{|tt z$iIB&=u5CWwA7D(G`afB&f8*40q~%BLbQ z)vY((?jhJ$MlE z>7d!*j-+~?+ydSrm)C{n#hs6iBc5lc!*@8jxuro54q+R9s`RnXd=1TV)AB>}tw9no zyK~J+%M4HGPmBznP<_v)r(ByNzX^SUs#6>8*v^2xZ#ZnC;b%Vl(o=b?-sdxC8OUxQ z^*)jPe9U=?U_j`WcvcqJVWEay3MA&`#V}z$(%LFzXQP-+?gT0kq^yAGZI+8Gp&5Uo z$U@C7^&xq(Zy}@y)L(#|f8-dx_j7Vm$;c>+A;|g6FcC%TQs)ig4o-5HfT#J^Fw*rV zJS{Qr2qTRW8NND{Wo*$ItjI#*)b6n5enKsM;54;^3LFl30G3Cx;fV=F`7TOtal#^^ zaJiIZ@&fROL!|Vuez|6Pe9@>%8)IseaQXoFj&z#r#1ga;@UY@-ukdoj!AenE7x*Tc zo~^X!^U%6m?y5CAHpp?T?TtFN=lj6*mz-~CHbe@=N<;b* zys!EsyQx`OL!jdaDJ^t=_{-AMr6wBAA90YhnR~=)3eO9kyg)^6l{wb#hwUpBxOSy% z?YfBsbeIT6cPa5w%4v~;y&U-cC~`Y1t0i=|T_5+>VLhxvAAQ$_Sy|br3m745(eod< zSi^PTz@!Fwzngcpzqq|IVbM{%;{_lUT<&0N1x>M&fAx%mRcb0BP6vdyhcAQ~S=zt~ zBkTN0i2+c@FKae~6n|9=?%#MhTw9AQt~w315YwZ|O(Cyw|0nG;Mazc0jNL@cjU8r z&QXvpkjDF1LqiF&ct3x3r5ESRaLf5Pkyx#@3T9K$Svyk z#Wn`|bEW@fkhUmp>kQsIu6tiPfmFS#i5^}V85x0`4=5uY*z7SLUQ4A~{J$sn&t{M` zc}q9_-lJG}D2nx}GJpIq2R9UOi%<23BiPwoUT$_(c; ze&wCstE>W>S7;YQRIDbyH69#rk@a)8tH4qGP(yO&}W}(#^PQ?>3bAfK(3<5aj7_oO=KQDIUexTbLYrwsKS7c$KN}&O!bQ zT2Hk!^fmi`u2JVFa6KrWSI&8J-CzvbX}U4~5arAf=eoZE(IQL3rh_N(r0t*i1xBVD z!=PprOKbE?+&!ETM7%UopekY=twWyw8dIpMo1eo%9@NrYb`fmq9!Dt!HFHrS)$@sZ z2T6XXWG2JpuwT&6oKC-lR5p1uBg6w078hBx1?|GXjDDE6v@9eknklLNM{d`*a#-O> zds(L`7hq?qFJABfIBiC+2r=#J>+fS2Q$VefLnRzkvJ;Ij)}Baa_-k_JjDO5-x_?AX z0ty1Qut0*NuBjEWj^ZvTQet+KA(N&Ysf^{3rtTxMdjMVm7hX@D%a7GbEEX54&(DsF zFeMAfNI^kO{Rhk@#8DDq+xb(}tp>_+YS@>w1YG=IzhwwR-=%o*Ix?%fqSC<{b@L{6 z^?K!GwbOb666Oi1wALx_{_)Dlw27Yn(*P@|8}Rps(2YC<`NN0XNlpE>RZ|b7q{QP! zMnv~doEeF>B3{YMjN#J97HXu|>7y1GnKRw}|HBpR3npl?LX~(+`4!{)wJWk`_KCb| z1tUm58dTv*JcR3f%;4p1(25xhQJ31iU2WZSw6OtAnF1pkw0~uuuGb;zV^D@&>D$vM zTG>UEuU{oeaw@PBIo={eGpg%rt`Mw2{tGKBMs2{xi~>+`xSJg63_v}gp{pAPKX`77 zR*5KVVeq6%8OG73Eyr>q;^Q67I+seZS-ZEu3fr_RGcYg=hUay z9(nQ`d2u`~(UX_)5rbhXIWcf-&e*~tG35)p263F|(Hp8|`pWsbFL&2%tZQZkowkQyV5G0z7lW)k~*|2Ho!-7s0_58&me7aKrmIah92lO?+nN8(?gjejRLGq^s1tZ!5*5NCaF0On&K* zh6Y(Z6KC6QgxRSc2WEj*6HC-^qi0XcP*Vv$02cHPc=#0a9wQ~AzjHt|{k*UQ1FOXE zUH8ztb0Fp5erb_-mU}wrT9!EOTcX|QPulnNk+!D0Ve2~3)6&m`_#eP*>H68#y`BbW zl@Yi$1*vb@y+SL~N=VW-j$3H=U%UnQ^x==O#!jF8=`IAr0&ypNLlC(Hljd=4e*%5& z_glhiS0j47I@~;`- zhw?NY0roztdf>hSNhOFE`}#Rpo&U>nsW9^@UsgniLIv2AUE_8_(;wI(NiZ0c(`z5T zZb{LUg^H|GcEkb=*b7UT)hnV)Md!MBT(y}1JA!3g8E!pLoJ5hUrYj96=dtAM*h8xS z0HCx+X&JG7864v|SLuBtwx_V(DPxNfIG2U&_c6}?ntg&FbCHwI* zqyVFaXYeb%uPv;<$S_|uslrGk*Psv=IkeHns|+>|A@74t6Rw|WuX1vv<&$AJ3A3gI zRtEqd#LftaX**{CPqK&Vr?-KuZ2r|~(wp1Zh&uVSb{BeD&hBtWm5|M~OPCW&7+G638F^#t;`z;!>CPV{V|we08O&hVEn z%|AZBxW~rEfS$dlsbUTnG@$WOx5a|&mYOQbRn63I;y07cy4TiJ4U$Hs3l- z#xsV(sIwWIb@Z)Zyv+1EXcbC#Xck94ahw>yTXUy+^)jLeK=hS3xcEXt`JZBmFDxQ+ z@1K}9D%`St)X4aF^UCP$_=Kd{!FT=?L4(_*eOT853H+c)R^qfmVt&W(L`S`1$=d9& zHD9uv9eDn6aM*yAx_?tShvL~NMr-isIpj8TX?So5@`y#6^Jy5WtHKW--aPT}h*ip~ zfr0mtW?)T?j{JrAd2&>w-&e9Vvgf6WIM*Sj3GC3sUMpMU=6+e!XI|j(G}#iwu%f|Y ziog6R3d5S5Kkr~w=e7>k@hM^UH}Wgl_RIcMbT2jzTAu}yz@x73ZM@W7ZV@0K1^2uxEbN?cE(Mk330B}?3})If&$Z>@!V)GvQ$$D zuN2)|GR486W&pqdl7XRhE1?k6JKNR(HwaFfOZD6b?)w|#I4u8y?acp>Zi6Gft-BlY+S%8GhD$Nxnp0#f5 z}NKClf-ya>&F?*apO`UHo ze2D^|M!By&ulAAFsN>ROv%p=d?>kX?GcBMpD185+ZE@dNueH_(0)OQ1c*P^4h!N9V z;JwFIo#`c@M{Iqm*5R_($rh;Rcv&%+>eGfQjVHRjdr4K!@K*I-3-~Rn0Eolb)fUR| zjxA3y@}On2sBrRDWy{7%72ymfa-6V>W=qzi3O&1gYu7 z%s~N{^wgXO_{Lz^Qec_`kqCqo!^vrt`Y4;N8;6=~7&Jd0<`<Ghwx}A=emFk8ffa5N^={ z18D-z9i&gcc+2t7lwOD2fvy!i_DPe4ejK0y19SKVvQ49}tlpCVaOP&XR*lQv+cTI^>gd)^3E zQI{(1r}ZG?+}x-7a8}pMgbkqf!69DKXeHrYn!tLQj~>N z7eZyz4eH$BB%Eu%kNSXxdLa6rmaF?8K70V}g^an@T}+M>L?NnXi4Q>V8&;qU3q|&K zs>os<{U=EQxFGM0 zB6soj_6Ly0qW$VE-zNOYO2q<>Z_2?eAyFn&Ek^KRX*_w-3C0G9UuKL|Cb$_0ivBBJWPQn#7tLfd7fhK~G z>IP!fc8639sHDd$UgBT(!V~5*`c5%8?__{xS$F#Q2#1;Sw=zHw@LadHoL(}i-ia;4 zU>c5cLKtA+v;>lgr0`IHLkMbh zL4NPPoR{Q`-*Ddaku$L;afnJj-ZkPnEX%5lU+1f@rzS4*l32*eRocF>=E&@G@-nm+ zOytn(48o;?)S;`edp@ova2F*{a@e?^aZajZ;bMk-&|HFo)!h^z!pH@|!P z_HABX-Wyc`R`HUOyjOm zv_gLzxI%azu*Ic6qwPa!j?&Ypfn17ukT@WjXYv3VHxY;MWYxy6lDg^WnGN|7&CG-O z5o!rv{Uv%{$i}3_L9@qc^DZzdT6Daa0BQ%V&Zh;{A7L8jmt=DY;T#8%K_deqLq|{u zw~Zf=yV>-KWq|uV8)WJfe0&@8OiCQQSWuGu8U%?2ZagY%bK5M9YHri1)LBRa4Jaem z)^M_QV%-FJMPX-T9#pJnV`IyONgWP1m`dk)MVQf8gZ=4*>F6A^atPC(>vz0kHoO-_ zNN(NQu7kzZrqPXO!|(ii=vPwB zwRrgvR7wV-!tAONi`1AuvWGw8RM60fYh#Owh`14@rykNVcd~WoluM-2eo^WC*l(xf zzHcnD3eG?*EJ}9-vq&XLD@)M&2S98fRueLM8j^uhC|x-$1$Qpp$%0&>IX_i0NdFfbOC`AJIn3QAp z96MI5YZS3;L1Il&$BXiJT6^O|WKy(>zZ)P1z}cD36aUTwEk3}`Sx_hw2rj*f6}=!m zrV(JV0HZ7@OrDhLMlve?TU!N4!DRVbe#uV%$Pg{tO~~>DxfOd~Yq@Pb4L;B#`aT1r z`c;R*5ORif?G5#^gf#SqmDA5T6)n{+{|u=ufgtdd^wdAiXO|(Dh$ptj1GF#-?Zkz4 zq**iauuyi$$&rxU`n~H}W{Vv?#$dz2hug=Ql956uk&IZ*;XVX0cXy$E#Ud*O*>I@y zjxiJ*FGu+Jfp!cadCUAjCtoM0u+UIN%X*knoz_362?_DG$Ek_dG%pazS8GE7F2?$x z-Vg>$!%{LBI^bXBynjb)q_Fh;%i24(lQ4k^o1)l4`fmOye|`d<4PI7y!;1YO`_u3C zbc#gCQ+e2e?+Z^HBeVn4g$zc8ckHV*-+?K~>D_rqcgzzK5-mr~UUa>-!lLp?(EN=B zn@J0AlXN)UF|6<5AT=497PFj_CW~mY>U0E5>Ete=I1YVaitr6-_BAPWe?2AqPEsVG z@*-f-$UPH~OGG{rVGqkH33COsNiDyEfFyqI*G3<0HqUBMW?M zTcM5+@^u~tqRO-FKEED#$|$l3>@LhYkl!Wl6BZB&#)Jk-e*djOV8Y*>!otERA7ANk zmXeWS4inZyiVj`jKlf#cA4AaOyGY;*?JH2)4QJk~u2r4-=Fc|pvKqU%#KV6GWFNl7 zPO$fGX=Cqt)eK&_vJFIm31aGC%nN0^FT=jEHH;rDuKYdJ)}2d+44 zjS9j#ZFIU~6#Fo*8ZgF#C3y)X&}Z`H+An5_Gp;i2bok|A&4o1@I59Xn%d9H6ME+J_ zlS3p^Y=&df-6?au!FJ!C6tAiLb1R87ep?gh{rL7x)4(M=-u2JF;|`0zUp8sMSVDd$ z?H#DZkq{x!^H3??=HyGuxRJM?Y0Wk)u>v{LIASMV>o%?kDYmoBG9;bQ3Zt)^&H zia(H6A10e{{~(e#0d=8XUML-g;;fbb9|zWq~(-1iQKm< zC6cdjR|UR&8JAQKdL|AGU@-n23m70;V_!(E{T8D7p)`0tZ?h@Prx3)@?dJ9U`*(y` zg9f!SmpB*JtBHYnLSvE2QpIe1N!W6U6y)Tva$E+ULONvjQS&WV@kJ%Z*!aF|8ADPy zut7HD*>Cm}7EOIpd(P}iH#q8P%6vCgR-EW<{{$%Tk&6l`Y-Ae_rVBBw zgx}pwW)IcA)<&Wd0wWOUD%JI#uF5Xn3!|rAGasfn`5k_ro0F5aG29$Q@U0i%*fHwe zrJYcPZy=ET{-F*Hbvhuu;l#4AoqWE=qbgGKeE<$D2_pJ4>F#QYYV8Eh#Y(cq<-yEo?U8 zi_T>#oRgJXhd%W4t*dPtTXa1{p=M6A1?QeQ)oWV{rTlhhUINuU<;uLQ)I+^}Y)kr6 zQZfd&eY31M+qo}bYgEPD#nNj$xcbqSs&p(Ib5mfj?NlCdj-VBDwg0CDaC5trHMA($ zc6jQ`sOYc*xH+8YKPE*AF_@Ne+7w5&FRpPQY54wOlAJ;)uq2!>z;?1b?AQ87Ip@My zZtW+ZBXFPEy@R^f$tzReVlV2r8BbasHmy0MsHQR>=4~E&FV+4PY+0XfNQ;e)t?;6& zRAw#8?WP=mTV(g|Q%_lLmq(vo$zs~RPh8c^k=swZNHgxhv6sGQ%;Y4}&4|Bmm3)&Jclv~{yW zPF?Q9(_BB#k)~7Qbhk{KcjvsN6KdgsQHMONl0noo6qWsU4sWNcTG0LE*&nudvG^)= zJF>+gIo&W_l9H144`!-7?@hfAV(rwlG#GinlGUG5BZo`x;IXSppGiv-4f6%ES6uG8 z4mR+z#ogNZfso1>)I<7IA4pX`ul+UGbXVsW8PuqRJKuN*6g}h3CWhs!^-JV_ z`hWSBZlHnvx|rZCJYJa^5*GU&6-?UL#QTZQ8Pnq>WHvdJHVW98Srv&=G1=W=ZA#`s zY&ycLES8i^6+9LFgZ+l_rFvnYHvw1>?)U7Pn!xR^kGE1VRwo85-!8+(4|(|D?-_u# z9-^yocd`~Oqa_AmC(sR&6u@aCbTe3K!w>kXk!TJvN@N|) z05plB$kuJwk#cquAe(usc;|MG(!*zf(~JW*(})14iMG?QqzSb#m)}a!|4zlE>?5-$1YqP4xBB zJ{1_dknRssGL3knS7WPr@9J?>Mq;!At$4%iQd-s7W8F$}Z6_Itpd&J;vJy`v7M7m; zlFBF;(!Ye3YW7N2w$e^k78Mt^gOWj--mkfC$x;ilrcoB4 zrlk=1Re@)bXl_h??d6P*0HU0y#)A?GGOQ(FfNqy%nCrk71$e}b;MPHDj=GeXjJFku zSs0A)jKuM;9vXRGqIqCS*!3zSj)FXc)bK>O_{sdCL!#;Y#_6ei3}a|({iTw|h36$r zXP$qn=kR#7Od;##WaViS(uIpSLbTT3LlOz%)`rCaR9lJG9H}BGz8?&?BDq9)`{yM5 z(vNCA?P}(4f!V1~&2L-dLDvI7vj*SD>|{=sc`ELwo6q4NKzM(D|Dc1nWV@7E({qv0R!=pHQidn5$1gvM>frQv%yQpfzh$eCDZ6~%Y7Qd>9cZz z7)9=UTVcCEP?a*93@;n2r6s#)#=QuP50=nTzl%;e0k$BEQCogIt8)n*HR9v{GYBD%_uVHXmq&p^l-1L zF)#;{RPS~;6axKFLyH}}91t?1^Z7X`X$q>*#vYz6E`(C6se`*gBZ>Psx) zfhcWQfK#LR5Na0Y_Q`b%ph18=gW3$eVxa^9)mJf7`a?In19}W!bG*Ueg~f)l@w&$ z?cPAcZ})R4WEP??Fc_zWeu|@GsLruEfANR4_^N1FVZ+nUpAn-Bq-B8|y3!UHd*zu} zal|$y&ZWwo;yvm~M}kL)a}EB2ci@5R?R|LZ>{ZAcPUU*>;ZOX+!o2{R09(^1xc5Rk zDDY3acD;BjM;qt8d-t;Q@)D5x8coggB3ur59DpE+h*tXoN1B7hn_tp9dcqlQ0krUb ze=4!bE5|s!Rx(2*8GxM0uv0n*IOv#s^S!*VAIGdF9BBpEAE?(%$^?NdjN*I2i4zBs zsk=|*Pp{EaMmhrI2rdK&1q1y3mV+))zQ^nfCN}O$I{wSHlSmrkGvswzTm4&-+*Shu zJ4o4sv}*0on2gHr34jShX5i55kNbSj+0vxBd3oDmiD_LPDG2Q_S+vFL4~yvQ?L|tW z22$}B#qZxkwQ%Bs9{`Da0L^w=d4zK{PaE$?c5FHILW9Z(#8(#98-_jj1~v@(GX&Qg zzpqGyg!;l%1|cGbF4Ptt<=VWR=LdJr-<G=zRcA-F2?+&?Wwu)=D%}?;7oZ_F!^}LEq$PehpR3}+X z@d5kHCe+%314kB6H~7q9#wH4FNAEg=mtI9i=JEwEx0l#2bLDcXmE;*IX8|(##EYQR z3ihQ|7k2b>j%#xu(mN3I97cGek#Z2Ok$O2cb?!r!4^(3zS}>0qhnFI*NAbUMP{#MU z(vC?AB4_=I-9 zNZG+~WA}qUm+%HIDKS1|SFX@2G~Yf(lHAn|3~(jo%pnW%YW&mqxt(JLMzSG$U}^PT zN3{SqV?N}h33rA!p>gkX=@!ze0zW*K^rLe1&fq?eurTZ6172KM3xM!QAPNngBPM3S zg!Sc>+e~m1s=Y`d54xASV{#803Gds>~j+z z|MW5dZexK~?$-XTj{~!}ui??q6?4fYCE3P(cZK~CcIp4v18%?k*J^HoUKc8|y8mo(SUCMQ>RG-#2;Z6~G2a5KHPv2fbV;Ewz0Ht7YfZ)DE{57O;m(HF1Z zOi*P<8M1^yfCKb3QZa@@O`1jeCES7$)mYN5Bi~)j=%3@A;mW$?Wb(z8_oeV&r$BCs zncSblzteR|erMDB)P09*`}lGT>iU$RpW#x8^Yi;R18$Z5pL;Zj1<25QOU}?^p7dt; zHpsiB)ER-;Y5|})t>^YFgKfJ~0b-riypM$;VB+oV>np+(=M)!%qQMg)30P39;EsAr z%Rv+n>ORgWA9ed~f@5%a#~c`NzI?0?g?R@Q>6_P1@QTDisR(!7tV4*4?qb*iTe@?K zYPg-VoR-3>HI7FMBZHzsB6&fr-3>C4ECN#txkPL^^GaK=hX&0oGHb`&=Z+(m*0eA; zB>Q&=Iti!&S=5HPwEFmOU508u2+?B{?y8d{oU~r*6*Ihau_>hWTi|he=65dTHxNI^ zPMQ1pa{`Fl0fMFwkKC0F5{^>5g>-&AX&u%?+EljVtu3dg}UE1l{ zLI+-dT92e4GmlW*WeNq_U&`EAI4SjUSg+0eZ9m?q{8(nDSEsv@=s82SiNLD&BA}SKXZm_bo4bz zl0xXNbVT@7VEO0hS7`#= zb(V<`Uhkm1d%u2h?4Sj|5gq~@`DmJXIGhT%1XT;-YHNk3&(HQjnTU1G9|s2y^w?1< zT6f`<7f4z(L&yGk|z)-n;`A4E8 z{NE6as^TB~7cZ%{&JxtQY3;1r`vtFLB*^~eO6M2Bq&73LrCktvgJT(Y*X5awNvfLP z(Fk~oXwzgUH`;ex8m2?$b`C+iYPSD(3bdwi$}0hFWmF5a6%{-#ZiZZ;I7ip|UI`H0 zqatXUdBkP++>U-ED|EoZ)bn}j>z0dySpwY-sU-$aV^qxzTR9$=324idHsy!W!)H=9 zVH2NdSJiA)H>C7w^*xx$ zYD-|4SYBIuS63GfR-P)CYjWz+V|=_S%seA%5NdS1ziz45!VlUjC>!e`(iqWzPl1zP z+)c*38h2GEo`szqsl9{X9i`hU8j+vb6zJndG}6UhMrAe{5~W(y;EmsPyo~zi7SJ`9 zpPe0RP>0!auP=P=Z}zy$8qaobAD^v1Q4z*>jXF7mBw%x!`F#plYUmVdVn!y|Sd zK38;{b6&Z|`T{BjkY@<=SRfk#ei?$wJ07cR+MCwc{K5|M&mCIKE&O!F;MMX31>~Ox zt<&139PMpL+)vw>bL)bno426_~ z4TO!AP?QHTUlWZ!bzElDk-AY=q5Vj|#yhZaTHMsAs_#~16V2jKcQ>to0FpL{!MuD6 zD!pbVqReO2x>mIoAL_nwDv5kk4Te3=@1ank59t|%7jj@>Ud`r-hTg=&H% z3*k-2a&S>`Z*wR*wmc(`?&@F`-@?M97XJ@I0ZrWeX{|qgP(rix8m0)S{0Q_{dM79D zEz2Xwn=myuCsn_aLGpk#zbyZMO*Y>bqwfVWDN3thuDp2xaY0b846&1478SEw)uCO) zHuu@)V&!RCHu^ZXNqSWECm%+rjVcs*f;=f~$a{fDzt#myWdugf3I(ToL_M9J6SNCL z8L9xB$%)$ii?ovut4kq@mw7@?b=wpoZh`lKiCzdQ(_*zwi+_OPf~FKH;X)uXf*TIm>z7bfeNJn&T0Sx5Af*PT z59A)OP{SFPS-x&gV#D^fqGH5zubyJpqG?90rSej1HfLYH=h@`GD6i&E4mm${>6i#9 ze!e`}B(uv;YAY)raFUq8|6IJrPK|dx`&mfrFv!2_JoY9mtA1IZDN8_)qSxm}sAqxwYbw2VK7`ddk}?Z9Sl1S#ME!441FT>?>{k^7kDj`4Qf9)dKatlts<< zLJ2LcyF{VMs1X0ME>{6<1mU6`+7|s_F}svu~sBH-HfPraPmKc1-Mm?^(< zn}TBDV900|ZVyO;XGnF*MziSf`xjlW#1ys5T+@+(a9F8{LY#f3HZVAHhbvO!)tOTW zad8dKoD7^lK%0U6;RbZ((v#yro9D0quZIWoqQb~Gjmc1Xwx6zlP@sAPd;8O-orIpl#;vPM$Opn!g(0FO{xJmXMGDTOn{vs%f_iMv&kv;7dX61UastMJO(2 zf6nt9R|`vBQcDYfK5T64fE+@!CmM}jAGbkF2Ze*Occclu8~r| z?Xg(Wl$rDUO+zq(0S<6YT|*73htXD|F*n1o)k&_VnY39{WRLUni$jI8qjl_A_C!BtMPttLMk8Tw(2CqTT*#I2-adZ6-@&VUum`fIpn{ni zf>S|_y@r{VgUqwAVu;lboMfE7>VFZQU$*ybK!~%`C#yY zhLf!=t`vd2kYZN(MO785%ZyqwDXQ_ZKT!f;pax$Du%4368a%;xcK})6-ir21cNbNK z?48v7VaWTWC1{@i_jCBvxN1_d5DPNcLgF7d)TUqYzlc=7+{_y4%Dv+qzYoSi#9TOB zHayAXE}(1|Cu|o@l{6{mPOmJjqMe8pbY5lbn499(xw@e)R%B1B+&Sln$Uz|w>adlp zvAgMb|2#^<=g1mL%eBDf75&(>mq$%i^|894l#T}lNVniH$!eK*EBjR5`tKjf>FH%S zW|7opXvWwHLN8O?{K_Jyt6=jclDo(E7C6l zEiOuM6qae@fB_3oTalM*j3UfwkOIvuD5yY7@G;f!-s7JOkYWxG{-K2TEcSUQzUa}# z#=`-7hmD5)lFJX{(r(5d2xId_-WGA&{9x}BE^!zqF}n{T1s*Vu!PIOFb-D{GjOx{L-+WdnG0O`77jJvA3SIM1xZ{^}-+NX<=g<3Zuj1CPy`v?R z>3DMeY&pvpB9eTgp0SwmNz5#>$^cOJ^QS%%nrduJ=T?`IH-DE`3rgZ_=vdN)oP%D! zmNL`1#K@~MbBT6_`{k&sO;{wv3IA<8wkucRG_|#jgsuTpdJ{CL*Uf%xopj~+ZuB&% z5BNY@X69fRzTDO^ofZ`-pC6M%kNCiJLH;DtG&lE?fmJT-8+=9fj~<@MSvptIw?#%r z+tRk>tx1pRi4;E#fhx3TKq5kg6FP*s->dmi5X}9>A3i`ZaM$<}IXt7)Q$dlFX?NQU zx_GG}E7SQ;H-tie47@K$U7jaiSzY~Va=nJbc)`tB`@;hmp8ib1j%A*g2gT-uQ2~IG zK`QK4?~swPr-i4CZ6YRvU#$pEy2pANN+4XuD`>-TJ-*TgGc1HKJ%uZ$W7gr919@dE z-0@KVa?$=io!#OfE6mN^y}gXoQ3N(Y~2e{Rl4g(LDS#(cll@7xzcvLLO{K~UDsjUQjsK>}Ww>FLaA z5b)Aq5|U#tk`c?DA7d;LMPF&M*kMSSHb=^;J@JB1@#Z5dt;w@jRtx0^sejd&Y_i+ z)!VW%LMZ}m9i5iBy|>J+`Ih<1D{H@h9y)h6{&vc-4#ge1tHKjM?d0rS^r0xPre=cv zu1Gq+!p#L;-j6I|MQJy0v?ekoz|f+sqWgX1UY^JWgOTs%$v?UM3X6*wdD!Co4ubuD z%?96rW9T6NU9~p*>#n(S-|4bk^kSA@ro`!p#608~LZJKMPoQ|$erU-EQq!lz7Zn!1 zefu#6lyOkJr=zXS>3l(KiuQkj&U4oUU*}_3$|Fiv0W&1RYD+=IK7!WXhy2cV;H5`rWT*&Icg{L+3JZs|%{GJUch^(k#FusG z;cgAa&5%q(QRj21#MxvAOgf&Aku0cVkaWUI_z^Dit^~FVRUfLJK7ESRtbBIGM&fHg0h=Pc6yCU_&nXjhDRXtehq z2CLMT7YdA;Fya$l0db5ifNMYP$P_Dr^foHv_?N+@rQl%)qJ zgr-5;;toTIf1r}3rA0ZBcH6uQ5uS}^H8FREa~##3)~btq=-*EW=JBwXc3x`bvGLCO*&|C8pss;0B^dk#%JRHB<(uR zt_fux4?Dv(^d=%PB+bd|2v;C$psPYI&zjgh-8(KZU*H9vws`x3-yM%Xgb?fS=8X&- zSFlg8Q{l+Pei-YV!=jJ<$fxMt$0((tt~EeUlXok*Y#Ti$7Ag1oWz(?~{M5)PJ7&nV z{_QU&|$7edPP&i8hpOBpMf`CP3gvCSS(Vt|w$OG;a)j`gQ_wx@>IW+Wmqw zIsy0n4)K>aR^BXFmbF?98NNJz3-+m>!3x;4`9 zzKynDYJP6#-1xd1^s5$5Xvsir08(|e*@_JoWjN$5Dq>R-6oF=$pP%d*7%&HYCgM7c zi>ny^I=apTi40K>9Bb1LpbK$fq1s`KK1oDaTNk*c&X{j-+25s!%x2*Z%c1SN>2Dnx z^H@nqMY+&|r+faR|L5iKq%TBJW3jf5`t+%a%Gw|KFV1^A)IO ze${NnYoa48NR0<51>~)rM4xX-SlQToyhhKj=NtA4V_Fo`O&>syb@mJY>{Zj*YSZ-N zvD3cDG`7}zVK(DN59oOXs=j=Agcxx6(;`8Gz2+wJpK=utUb>6g!ElDGV({cptqgIv zijusk`kxkHBYy|!=n*owkt4}V)UodJ_1jP7)xT39V$Bs?W9L8(yOl+b6sYNO|EqN{ zmE3oGSFKl6X5)KDi!XH^HYOO}qd~No(@6wJ8PW6KL9bL+L?%em)YJ6S5Jx3gXDP$R zn2KbYtaa`;=B*}SdM>1<>9Jp;YVPfYC$b_j<3rmlW9=Xsgn>l3@|&LZA!w_Zc}7zX zz>zCn4jDdFdZ^Hj8zG}^_8Svc+zs@#(^;#>(eaUes8LAOY-iruil`kvm_lsju7V^K zRDPh~GU50bq{3z68XOcXRh(T#b=Vued` z+iQy))YFNl1%1muHYf0c-@rZ4w_OI{B1}^Hs$@!iO1DCoCvDhKsLi8QWN@q90yaKq4%sDJXZET=gD2U%bgDT zpl_GQyOUj?L(P}{d&dHzqnDPKv+L^8%0ff+4DnC-Hxo;!P&g18`qO9M0N9&NP_;nK zT%@k`$d|7RI|bIP@RWc+I0+b)oM9F$zSooU55{m;ziAYx8dZt^*!K3b9MkZRktK*b z@DYdCQWn~sRSUx3KV?2BfOy%!iO9=sP-E-r4m(J+&n6eIfvK@E#3)5WXW_@?qp+9% zs5MAZAm{aO)A>a}JZc>-dRoaMA0!$_gS|BVHnG`p(cE}CQ7ypFrb z@eN7Srpv8v0C0wH0vc!cxlC$EM%t zl%l~rWFvT17|L){8VylBU31y>;8TRb7e+4?M{P{zJrT{muTvH>T60uE3|AD}mtC@- zvxZ}1*ZXcW&Y7A9Fc1=psLaa~WtaXF!@=A; z2NzOHvRRm>UtIh}wSyXXSci^?jNB6N+c}@zIR?QET-t)^c-P?(ghSPLJ1z^_dF*2s z^EY1q4}3Wvb_HNxj+TH^D*~4gD`|27So>DLvxXT40fDiVv3p+^PMuAMG$o&zd!$I5 z^gfL+9L2pNj+Deapz&OygT*_fBSJj3Z@#>E@~Twx{5CYafEf zrnn~6_Efq%i>*2dVWqTJrKj8c=eY#r+lCwT%{>=ED1mX~FgYHUy*h5&;8 zF=no=39_xfh;91%7;c5frleSp219N(tODPBY6q7!3Or^lyOuUKn31?T&#eP)92%t{ zE?MXqP=n%5{9kTfLSB39rS;ok>da@(1i$Te?fq%rc5|oNT_{Cx=xltS?mx|ozwmGE0J$jwq$+^)qG^w zltB42--!Uh%b#B5=RW|Wt2B4YpMT35`SX!jzNt7v@uvd=(;|6;3FWfTObg#uE0ah6 z>MlB@1L)PDjt8d1(cZs&V4tE7qld++n4N=|o6Km%*-Va(2#ZHZ2r?DS0eiS1*P0mF z>ZxtZL#O)X3U>uJRORFqm4yO|26#oZ&yqUCZgfH{d%ty?Agpdb0-)oxuXp>VD{ds* zXTC?R*f2a(;NL5N-5Am{gMLuy^*pu>RqtT0>YNDhaqbk^TZ|w`Xoa4z+I&59oj}}(GNCsw|0V7;Bj&LDuXVr2Ih^Da`RMl_x4w6j>9DI$P`Os%Ko(^ zZS$XlD=^O?HK*%8_?SAG+0n_257%sMfusv8-*y6)T9TXTu?DLP$O<6$o2G7RFgIGf z7wS*JP)P?kC;Sqb=UZy9fyk;928orYayIjH1of?#$DaTP4dL9n?(3stf<6np&!y$i zcQ0iVgwfBrdBJ*!C@Zdj%l2JWRWKqw?jJA!Ig1a>mBcZVg64!+fsh@B1dGC+1n%EH zHKPMCjj~a(YkXL($NHFP!=1yTleP#nVB7ZgO?cj+PpwW{Tl?4Un9&?8$Sh%zvaOG5 zl$qj?^8vqp&gYc$i ziwbpp{cd^jBf_woN+o2ddwTEm_~u=11V#pQ%sIv?ScUjYc}I2t4NlQMSX``JqQCqH zsxRokYDGtmqmAY9Foz#kJD=e;0^*!~4w|yV`PW@;Hp-Ejztf}U>kpZN|Bt8l4#aZ* z|Hm6DMD_@ox0RJWQnEMMn~3baDI&>8W@Kka_TI|KPUfARmF$&le$VTCzVF}P=NyOo zzOL8n`FzaJ!MN|)Goqy=erf-GBgg)=?=L%z|2!7t9I)@NdJ=y0&7$B$dLytwQvt#h zee+s5RDA%;ZzuBIUHIETqB=M@=sbMPt3`?3P5H8+oIAp@W-|YCJ`~P{0g;N*W1@(3 zUYTc{xIdw1XjnNihQ3Pgc|~FRE?LDF(pYvB<`qAGrW<(F+0D(=dBfsD`1OppZ+&s# z)hs7XAce~k9)*NQv`_f9G_I<(&`P8fFgexr(Um?ZvYXU?Ns9^fDxjs2P*vpu)(ZN& zV35dP^n740&XcrNuL2s%4Hpf_(gXtve3>E79>$#bfTfoQsn-?|P*+n6=(K0aVK(Ci5gEvd_~1)H@omH(%yK2+=dFGFV&uNh z31%-@q*^7&hV|l&ggB?66-36pd~(n2)qxz*yg=hQnNkR>_rZkz7K{h8{xs0?j0`(F z^U^R)vfFLQT>X}R!NtL`1O=^{+S)wA55L-$w0r|gmO!$7`22Y)!Tiwv{_nNiHHz}W z$I#;fANPBUB^H6#Qle!6rBz2q=^|SN1r!5%m)UAugi_?n+y9Ob-$|HQfjfp6ThI1s zo1dwE!Ef+?fl9>4=xQbl6s+U$3+IKu?zjeD(x2KXaX!MDce75d_w3s-Uaf0GsTw4d zjgAHrvda(Bx9J^;_ngZT5(KT0=g?xx30yN8Ca0vy%gcK+7)=n4WBKbrD+k&@lu)qy z^}}~l?qoTP($LVJ{2{6fU~%~AUsrqX&R%>yP`-JB5=eeq96;+p)mmA&7@L2_`E`w1 zb;x7x3Kl4J1=y#7gO z{!6g1hZvO=4X_AW{$es_q&zuUr-I=s9Z71H@gJ|QYJS^c263cd&47}|u`z8BAK>)e zB@~ah2q#V$xz-kZkID=j+wi=CI9Sd7EJ81hsVrsf^r6_vzpX4AOA_jmPM1yW>#x|0 ziglZmq21Kj_@S`yICPi%a;t}OBhU}L$;ik^j+t}NDFN|fsp9~3!RLaaht0IuxfGg# zPiVXTbYa@s+JZ}kNY_9ziV>CqC~yH*Bq=!wW|g2oy5k$i)(t;ATzOK|wjB<+l|xR@ zcUtTuQcx&oA*%J+n)K@=L{_sNYBn~{k{xzW@8lQP*KsMy+cI`BVB%K*|))SA0JEEuCzK7pEnQTS;WR<-j!K?h1Tm6V}M zpd?`_$Kv?-1h^Y^fM>x12@8!t>^?^*eG*m=4Dq>A5*F~nDkgAp3vinr9u>#-qOU~> zuvN;-NC2#eD1&eO+mMYW;i-6jI#F^)0o{bW@T~N+e!-yjyk1{iQD5Kly85P@yJzfU zBGL211))?|*9hpz}t8}nrvp(MZX@@c3V;O+DMg2P zr`*6mQ|U>da3NF`7+Xxvyl}Quom!V8?18gC!t~K087x)>6vr?8kO8K^Q){pFCYKWw zJ6%e-#as_;nfcWtO*H@SWis}AkJ0WP>!0{yXCtsG*u#RWH1-kQYN!k@)-rs78Hvix zxRk%1ebFa`s?}s4vE!t zho9m7_f;gc19Yuaf%G|S#2=OM(jWIzi4(GIl_4LCWxo z87#i<-y^gq*p;D6XBY;yfSerZ*5B=(VP9CohOV0#st?WkxVdBLJ1-3Ik}b<SAK+WijiwS+!MQS z1?CVgx#xcwXmSc{$dX6}L%&jT1PRL0o4))u_c#vV0tgrqh7e>36l=VAv1Pejdn`z;pffxwY(Cw=2o-{@XDR(PZ7(Hn`YwF(I?*Ujbz`+N@i1;Cq{K zOPo0B=L8?dkIFdpsBZ@?7gzlb!cFLjZ#}ITcgR0H<|6qqeOl3<`_YDigM&j;M@vn; ze44&(r9K)@I!opidc_TdBf|dYR8aV8YH#0Pp5m1iB&2qa;=4ma@~Y8jr9jQ&$GVtb zAa5#*=qW5~rIocowAk7Ya_q0fJ6?~nyY4m9wLi>90*lx)ZKj3-&%voFDH)ky?t2+F zHK?|n5i?|7+*rveY3aP865EZMux~n^LD8wm5mcK0+nkgI?9@1ttYI3;xy!G~MMgvz zV7ml7`l7z1XCju}{HFg|))RvO{zmXS%G+H3Di>oxxFb~Y>{YYBQy-2~i?NMZQST z2Q+(xcWiq%!u#d=Z(UD>(-Q;&91`sj?CK;H|Lm;nKGqjds1b4m224A2=KlNuWh?5k z_g}qwh0$t?8l-Jo=|;^nJu#kjqY3rwirn*gfP_Z^LIj_H^uNkU+=ev3laZadBb*HP z+WsW?+pD^qSV?k-Z*vmg;vRAQ#S3AvUFGE+NxKQkAw(FLwUlAGgk#1OBuNNpEQjhl z9;ba`3@x&t*^}_p<{(oZxwv@bpG|_G9Wb&tb}CQRaVNe5JPo~ z-R&UPx~bq%3wsW5D40Ujk?Znz=%s(cx_z^T?oSSuvuC_mNTwX{lgi5bBO_z;mE$0L zkIz|ocC%oTU|wB?lC8Jb&9J%ekz@Kw2yKQnMM1q9!PjRMdgirY%Z!o#+Nb=Mt{={B z_~3qwj!WMomWtk>d?%Ku6!Vx!h)MvWqCS-fjyUo1@L*nl^=;31HpD_-^5WcO@u-{Wff3kkt*0p*1rP>>dJ`&qW}YAKam{12xQ z*eJ}uETOCej$0&0HLqo#W3%amnxRF$psUrV@Ch3o=liF~C#_M^^!?|d5LkTv9_&v) zrh^3_Mvh$48xCYE~u9>Spfd!5jEyhW`x9Xxlf;d@6oU`8z+Ae!EL(A@j!b<`Y(U211zvPv>-+ zp`-*+ACh886ElL6Es&M~hg0u$IZNoL0tHdR&N-(jVw~57g1&91LpAP1RPQZHq6PE&D%)c<1QUut7i;P?0p~(HjX;5F!+? z4<$y)X96#2&eL67a92uAV%VKei$7;tD;&$fSX)Jim?^^=g86lwTKgRg+dhka9U3Y( zUCv@2Z}Jr^r{@t6kbyA<0;D8H=V|3IB;i79-*6uO`6GlDshHiZ@jt1tO8O2^MTk7k z>cV2ahTucI-ROH%{(hXmttPvm=Fm^nv4@+i=QnJCE(k0<`Uk79r za>fu^`?UlDA`}-xKC2KCoLWvle{jOe!t!P70Fgv;a{g{U*@W|?P2pus=F92L_TQzD zrPQ89b4(lX=)({FmsM5#uo``UaM||@omg)qKtTZDgc_>5eEU6PVk#7^KV81{Z(~|k z*&cUt*9D-;#>VGxM)kY!ma}IuhTT{Bk4!5;uM6E$)g2x&MP-|}s&DrqO8l=TOhUQ6-%GKR3bCw;if}|E zy9hIGJV!zAl7L)$W>;Sy``(_|LZW3FKe|$!os(@+#deJvI8kLaHM$$O)|WHhfH@B5 z%Aeg`!iox{NQy^LP*z7r5Hj=92i{C>NT^zAXWb0L75&O%2|;TmT43o#fsio^%C=zyGgM)Q?H&T>T{owMv*yy1|nnj2^TcGSsZ{f;UwAk(1KRJZ_LXO8~Gl(nl2!X`b_5 z8sEq)E>8Ovd>x+2OcWIK+TCs2zsJpu*cpf4Ch=G-&=*oVgmp%&E$fjoT^=0QQQCwnFbf2?;Qyf&7<1dAQDHiKn38tY^VvYwC6MCR|bSzeHYg60OWQCJ+MNu`E)6x%jD3~+xKNMo-l%qhX$J6~rwHT*w3(f3;ck)5g1JLhe=HJbfPeITA+LMYwNxsf0 z2m`JxbFlRF1Ke9UJffoTCrJ(S0YYwa+De9;N=Q08IHRYS_%FW=cHVzy(*rRh7pEJu zL$l~kKo-i`qvQ%1jzX_En%XM=zqa&+JCrdf%1zmr_66{<()gdP)uyNrCUFZ{jy$>~ z9~ezbooCs$m1k4DoaX!8$%v2<`zAKfQS!ufL(^3`q*tAUsN!wMe*B2iVpv{YhJnBE zz+H$6C^WM&a)-!d$WK~ub$_3@vXX2@pDe~Dt&iXXfTF<3U7g^-%q(~#uPyX`+p7Vc zM@UjJ5j>0c{xf?JgT$bH0qZl3U*6n-<nUo7dA~MAVJokz2!l)A%E(h zohGwn*~*` zJ8BIcSv(s|;A3{(%-N>C~pkxtU_4PM&us?XSm^cs3-pt_U^t2ag$f@b zV_FD9C?Omwb+5fSQ^Zs)b;!bR-mEn=#!&m1*%;`%)s$ex*IF^~KvsyjoM{<7Hn#2a z7A?)N!=cTYjP6S{Z0UDym?bM*X;+RNiI+&Ro5t-nClptmCd)rjnRHrTV-`gV(yOoi zt(Ue_z*4PgwuH2qE$=^cHXfrtW@a4pv~zP`M08(wZu3O{4H}P%i+Gm%3GfQ9!={#R zo6`;QRwBSlgKF|ISSTGFAU7@nZrDa+JUu^}OqQe`bHcBq{F0YB2~EAN6LnD%aH+?z zXW3HN2514JqpN2OcMPGb6wtn@TKBuVyTAT+!^e_k@2Gu?BL+8a&7{3b79wqf8Cp+I zkB;yitbg6J@sXfcdsb0a-YCIN3L}KcdNij3tNlS7enAB9mo_9 zO)l2_>B92&az1EmVu4+9yv33RRApT;efm$J?fEM-p>s8EUx5bK_)!OTQU>bCg#!zM z@D3JM*0~wqt);w9V{_QOpYZk)2C{1yYk&JHd1L2<*ZZsrEd*yvJ(lKbLAB|fY+@{p zHI58xkk~kh@rokBW&3o9JB-$J+EG+LuX>K`C7~F8n1bzQ4CO3w(~s zXs@H31Yw`QEW8!GRs}K=${z-3v-A*=3~TfGeo3qx`P)4pdRms4#g0Nv%QCD19N+yr ztO}Y@g1sZxg~g}5zdk(H($>*QBu}R$z7;)pFwcY52CC=Q8}8eU)z#l1RtM-?QDk=m z>qk%V=m} z%!fWS0_YEN)xkl~x@+VKrc5TYw&|tY#JrLkv`Pz?2a%2$uy0TXMidHhBF2b_qqtb* zN=8&hT8@36g#fz4Q3hEWZw9K-{P7`FBkt<%w@|fZTOuJbVCU{YQC?!{E;Im21F`KV z>Tw#|E$os=at~})+80_@v$ThLY7W>p`vET+D&^#B$S25OVYx+JUQw=WKoSuUU<#s4 zfUWq}i0mad>gujX$Yz4-%wu%j4A21xLx;*C%xfUzyal@%2#s{|^8ReBRN1-AvZ$0D z`E-TZDH-2ITtCnUmj&h`Ao5Xa5@i5#f_(bP6S$N8&UfQ|g)L&YWmXsB^pjDcV=q!W{DUT?8S{n~1gOMwRA?(;30jhc)uc7J3p|{BQ?@jd|`zMjI0W3LdDa z*R0`EQ zM1{ccDg68wEyOO!#e9J(YU6~Hc(i|ogdv}eE}!r7+g=Zhzsbn_fmGtGtgFhCt1y@Z z#YabfHG;Mo&_1i=5ou{TH#C7`0SJk@Dd$ACTtbOe&np4=0v*BqoCg1%0#*PGPY}@e zbl#oowvGgW`Fu2*=iNLNHqaw=sK^K061FJl&HNV2i@a zO_x@acdZGc(W))qq07Y@wk>BN!#_zLMkGf?0<=S6F8@ykZz6vx*O)b{%H$4RWziv5 zMQ*(bx1Yp5JVv*CYoK|Kj#pL8JDQ%*2xT}y=c7Np_rG@Kviabr1&yYQ#1-q~lN%r~|GIU+ zFli4%)aUQvGMS#G)PE}_4E5SU z*tjJ#Ay$kHp?nNT<>{FP4|EjiHlN`^>AO6TofWRGq@hootwVL*(J+&~LmE>c;RVkb zG!0NxPaMONkuNj2?j-WIn_F3SR8xcg@oCP?BgcgIkr^o#b~4ZwWPP_g+ZhY`Na`T+ zIVsm=_Qk;-R3?%}b}F-zN^0@LdGg=zd$ws}pZKzcgq0x&Baev?RtbbTy#%5QSbBma zZ2xp;mqi0!$iCp*0G>q@F?KZZHBeDhvsg^CgNL4sGliKnvJ@2M2vjPG_dp6jTOi}W zuciB_ZFTi7ocg)HpP}?}v$9?-Ko5Efw_G0cDa9*J61fZpy zhc^@p%l5&P+^v5J|DNy@5j^m=tY9K=dedcP!x<*Dh zAht@?5dk9*qND&bgr-)`r>-ZMTT^93;Kwl)2g}H`fP-Mg^ZLGiYZz_YSi1?+f{D&pi)|XaXY#V4lb~2ZPAUJ-^?bKzUCXdc8VpaS>T$)P10SfZgIZV);@KSip;j6jUi}Lb@x3)^a``IaGzw?NdRZqhH7BkQ|2aPV z_pMh@nORVfvZS-u|LE+ZwWj67o>;^F>ztEW&3))U%>&8}h*wIaiLDmm$B|J;4C>M0 zb;OpAm;V%;xj1%(`9F0D_>n!YKgwVU+h3NX@reUvi7iW*k`QT!h36C@i^9^cvY;LS zw@A)+xmsQ&$q;&q{JT)o3A~;-KI(i$sBt>N`SWXm{jaK6p63IMl$UXd68jAD=*ga=v+cbK_bK z&LjS4IT#TTckeSDTyWUc8amh>d$k=H2u9S+c$fn1*H(iJ>L7s#!^vH@%v?XdCotjfUJC5I}o{mSPTjkU~9LnZ3h?6 zzglo|t*qQe-r_G`z8ExLhxEacPFvjUDR;CH7_75cWN_gZiZTxccjh}9|D|g8KO6Kp zhp|aiMFjuARn;oL&0>v@pc}fW$99662GsnsUOE9VY%WbmyIVo9!l7+YAk}nV-H_0Z* zZ*z0({$1n{|GRJNF+1}DNR~NgU#B`F6n`q4jtC-!g~wO$&Z+m>tfGJ0T}8n*UCmM2 zpMMYVboUp5WUcksfEby#U@6l*aDjs=EHg?ehWhTYC63nUpY_Jp!$WeA?gAsL1W9bK zUrPgN$3k%ex{hq|q&wv1&dy)el@n0HF9>J9{n$rwCd5JvDAeviIso6ODudims#qJU zn_QICJQVc20#S2gTgv%S7PpPi-EdN6WPDX0Ml00>#wB+H4ZK40NATdmcQv} z8c%~HO+i>?WoHG}{hX`JC^9bN?1sEILDszt@;vpz zKRB>kwNKXE2mD_m-kXNHj#6XX*U{#o01f3RCO{^9Q^u&S%{_nN>ORNktAdAuG#4yL zw+Ny=C`NB=mSp$9rdH>2#A9+ePj=z|Z{~jA_lCy3bJ2~zyiHbNxmKFF)=4rQG3=&J zEZ;_q8h<^aE#=aQnPwl4a%wsmDzEdP3&Qt_VPv-@nqb11CnuW3oRrfp>-ozR!N<`5 zHaCGcFMY4_AaXec(rmxQ+@W1=F0Qj1&(iQ4D49AqIB04yL8SXn|7Z^f<`#rx#w7kt z?2=;Qi4IkI5`Ac)2j~-07`Ht>aDH1QPXa{>xRRq`OLmY82FmS0C`#CCv+k)|%GQ@3 zxB#Xm6=W8~2NprTISGmL_Al}8sbT|N@7X9@icR%f*>;4W*~qHk8>00qENI_wnLG{V zV}fTIfdE040Yj>fPXj=Xw27JojLvsFTpK3zf$NCAH>k_^o<{$mGT53Hn_eW@7E}JS ztAQDV9+i;OOQQxGFpC`m}@bu!Tl1M%Vb(JwCVS^Ye#N@@5WRjeMJVf7Y*!H2_25oQ>l!Q25~v%g|*2PAtc7DrDlOk=Iz4@&Ba^b4x0Q z;Br|g40+`vN5)iVNd+Dsa@9?np{U??lW zkPrU6r3^u__8OWC0qU9?jQcQcQ;Em3u#U$}MDh9foah-FSEKAL5+4h-&-yJ;!XL3I z<`VQ~<}Z`a35;OBabV}s^EjuR?JH^qFfg?9sgjEF(D-=wV3zDSU^==v7Ovp~C zzMntI%Yw;|>goVdk5OV8bh}fEnG|eFi+P2*1h|6mVoHE9vBR*fZEdrxJ&C;Qyg%eV z(fjDr1WGD)1KOk{&Crggum!=`Q77Pm8#yWICyoFp5M}@qLs5TaaeS6+qzgRaN|%%0 z7FdgfN(DLz1?8?lm=fWwH%L{)vuD9+X~xf<<&M`^1p?|d=i&Q9v!AKb`+;$0*}Xv8 z?ZHUDIPhkt`K+?8m1|UT3etd_{rZjT5PVJU*E0K%ecAyJQcWs1t+TQ#<92qqIZdd) z@!^8y0P<+E3k%;4aTvgiczE{EkW;WuZ#+K6q(@&tlii}Za>>!>?EClc(8&t$<5hHt zDp(J~K^l>1eRs|&2qq@5fy0gTslcKpS^H@PX5<)o4wpdT_ZxH;9;zRd4 zpP=CIj~|aVilMZy_o#pNRJrjXS6Jb_`}cd*pM-)o3YyYjwO!(B-X;TW;ydaGJ@;pK zRQ$FM{3638$&St;`UF~85m8~RJn~P=o^~Fl&Yn3UQPqf(7};Zx2n8_mo%hO~-&7Ub zlV}cyNFx+$EL#pxXVsM8wcQ)LT>ro0>{KKm)}cmP4ylyxJ3F9hr(?4U4$!FM zb%6qR=9UBB7Vu5#$T9JYvW9cE@kKA1Y~9>9SMS(5fT}Cyrwa}M46#d3na8B081nU( zb~`=Em%bzBmr`8(J(+M*C-4*7W$j@;eCgXp!#iFNKrS*oF(sj;#UF!mJv-jlG8g*% z@VSMS1G30#q2#k+Swm7?U_gKV(7)j3>DZi$9-y_E*J4RrT!I1$BG07$Q1 zJV4|G#VC1HwA?S3ItV_^ZF&JTe9lXY%PFa;pd-aW@TLb3nm&cL-{qN__$?`p53EC8 zS=k_y`}O}kd`li+C%qYd^Z&fsmp@;}XABxSh}zO<%vO+i+1z&7A~jHq7*5!dTX1N1;gw;Vc}57xA5-RW?k6)7x33L zT!z80`T1>D_sg2#>jP(H+}YVfP^;oSGBKI8rxfAc=`qI8-IJ#y#vYuVMNT?+rh(3$ z^fCq{kq`^yD{7;tOe;N!JR>?D=dIQiH+5rU6%7qukShzBCt9Jxa+ys?XMhR0rySe8 zhDIurYChi|jVc-+5NmSaKobVQ{B~3Db5YfXT43(?@TOXHHR>pmpenWY9tZ7SObn?A!HA=p#{B7rk+3vBsv8Z>iSp^v>_RxCJ1*bzBJ)u_s?Gk>NgtQp+dP8UR%&!bY#!18pq~`MI9O|0R`m3XEQu0#7(h%ZjTmqhZeM8P0sYU>L z``zjOIc3^1w4$V3ASi^Nf0375Uo?f9F>Om2SO!B$OuEUJ&FKh`i!Zp;g&^A2;NCf@ zQB9>bm>6PH=dBGJeBOWm&I$BEVQ^sFm4-B%K!w?c#9VK*yEzljPKg%Y{Zy6Wcg7Y_ zWdN&@P4#GLl^GkHr0`M4)YGV<2*I7e4MF=kit!&tWe!KV3_h?XTxsKTV4eAEBdxFH z>g}C~R7gMeN}MpN($vy{nO1Tz-VCAFSOLD6ll<%9P81=7Z1zyiRGUhjO)RUVHEM$U zTIe3U3d`$tu3(S^7>FAu6{K;qYl`l-45Z3BTh4^SG9g(+&G_Vtt+4N=oq}+``dilv zwolmETogkO=RL3ff>Lac^{KDtFXGRvL0kmGGJL0CoH`AHTl^&Rks8$}o1to@v+Xw* zH1OF%;I)ZGhjYab+&k*+4AN?Lv}SPefZ6C$l0niX0^S^p51O$U3*pP<<3vx$j`KbtE|%=d33OsdD@TO>jhG+6R{ z4>ly7YXO@py&Uf)Dx>1SIVcxI)ET)qA4;_DU^6dCbBx?4r+Y+Vbqn5yYu_i7dH1=D z>ZRbnMWp`%0^m8BelQ(RV$D;H?Iv-9s_E#++8c4eHNW_Ki7;GmHR#rxw%xh|A4vY9 z2Si0j_X%^9N?u=UE9}!1`QavH4W5GKzMe#oVbsUf7aN-zktq~q0hS8|9tZbk8Hi8m zM)C4$H0~EULIlHh4%drNq=up7#RfwE&OrUF%f_luiSM@i>6qggDNu?jjiTmyKuCe+ z|H|YyEqtk&{bJ9#z2gswWp*;lzkg$L+`xLxetYmSixfK{oLCkADbdVae3IY^GX2w4 z4oS9^qbq#M((xqVdsBv*W?LX-=8|VmnTCfo;0871tZ7QmIjD5I;V8l`=47hXnyMYA zcv1p3X5_AbE{S_MZPl%E26feym5=rG|OoGSng!wY|#iehnUyh18dt@jwkv5{WjXp;Z4sUdo7j1(Jt zm!nEV&D@4ZIhYcr~$elTi9$r4U3KMVMA%m12_*Kjf zex2d8WoKu{L9H;Po!OW6@F|m$St1^fwzdR2QE5U($`m5BTOS!Q@eimM`fhYTnlTZG zES4}(IRWVss{sb(zeA(buQMoFNj$z9`|7iMs4lk^8&$#U{8&>{ijRVhB0M_XvOl7` zdkwkj2M0e(Wf3GdRwwc^gXAOmXIBZvVD7?>u#(kCywX zT?c_5J{W;EL&k3s3y4KZQ$X0m`3 zP(oHGp=vodZtha!%szGzD5rCCnE*N1IXPpkA|0>(vAVhXdp;)|K!C=4SH~g|IX;S< zO1qmyMe)j@Pm&mpfh42iHM#sfgBX-SnT17mw^JqyyyRN2Wg>&WNpm>H7J~|nU;C`qa0yDahu5dDN17D!JwAYd6R9y zi#10p*nO(1NVJsaonU>*vV!c3cNAEf$`wWduxJIa=tmgpbao1Sf3J}(q!$e^JlN1( zfSXk4Rp8*pQtqG=vSZHHWq&uklI`rtAkQxkF`(Ag&TY?^wU6qOH0@uz3R}3>S6`p9 zd!enSChzJ>)Zn2fY|KIo>3X8nTs{ijCeb8Q4uZK35PzrwW~LXi%$Qfg+5$|IfPMQs zR+LKQsZC=+Pt+m`b&EUR9B=I)d@*t5_LPwW$TTrvX&-{Q#EH9*$r}x3eX)<`CtY&V;iq8*c{*!wjj<>?>XUoeg`ZqkFa^{Eo z)r4MXGBmNE1b1AALD=}@47C2T2@BU@Tv3Gb$D!F-2+R9(hmmRp6i!qA7X+XO{*ab7 zfAn-fueyNs<=ttuG&vML546bEg{%bz8s?Nd2wy@u_BXcS3>_3lYJxBk86z$b5McQP5}zA^*U^hYYVE>OVsv{{VnNSg2s0 zRjGM(8hFKHW2zgrmrKyEF$aT`;hj6uF@<$@*zx|AR>e#~GW2vVF6GgvL@D|J^hR!7 ze&X4Ue+wRU=*tdeaT6(%7OZ2+D$0n}9vYF^hm3gSVFp2}L7?pfc2opjg_RVPE}!b3 zm8jNCLdQrR(^2WCcaaF!JnB*C6ut>u_iP!HVz*Iis) zoPDSMB&nF1n%Ynptm4K8CMD4?FggpF!;Wb8xTLa@II{DpyFxbS9wey(jsy~UURaue z^@Lp*uIeiRw8+n1Tm%6ddCSAE;aq8zMQ?{6xl;5sCQ@{z27_;dBH|;E(jry)@a`wjGnxz~AwtfT>@^*fO9GyZnzZ=j6zZ zhR3HXlO4s*?cs^T$54MA8A{KVop9b`s$^nFk^2>vWG}d`fm%2793C)MnNe23bGGt?D9kziZDTxj`R!l;}^ptrB)Z=>5^ui#qYJFS9Eax@a}WS%Pgz#`zD6O_9IXq)(+UMVjbM%m=uP0NC@p=-67qSq zG}(QcX*BzqVGy=-CX7vQ=);0)n*^Q=+c7RA;d zuCrNaJ6OuoV-9hkCF?`mm-oPM*$oYQESxienO&a>WN1s3Eu&+ifRa{!>crE?iL};KRBRtuM+O|^_U+42@s4B7X z94){2;@3#cCC_jD`HIJZ8+?Zyt*!ID#y8k5(oD(8gTF&3w=gicP&^L@7N2rW`UxTy zM)I#&h+FUBq_7b$cZ^KQdnTWp`N68%*4%UgxPG6~0BvquJ}e8sr^iB1?aq8u#Bes3 z`4D-;v_<;yhgPOJI$?gAX$L{z%8;826pG_Lf2@J0XPJjLSRd7_N-QkpVY^26c z@(RXZB!Qqh&JKyvb+sHAj|lf{yzZDaQRUJ6hm{1RGt*QLpNm1}5^@=~o2i-W>B;KO ztcwovy@z3DV)7s+J-tRELIDLkFBqxdPl!?1i`({MpVYgFS00j+l$)#BlgSchC-|bn z%$d03Nb$w@T&)@xms2WHuPDG#rX27V7M_ak52y18^4B;#kF_C`Eim@)ygwUYN)E5; z-s#?e>&kr2r!ymX7t^2;2lN;4>i#QOK^<`(F^ERZndeKLhOOc?>{XdhvMD=u8 z7a9}8Yrgzru5EF734BO9M`z$LG#2rVhXUY_a-T2G_19%aHHpW|$)FnnI_{!d* zE3kd8-hJoU_=??s%zhe6yQ#Q<2O{%NW)2>L^WVncXF-9()5B;h45Q(V1JDsx$4dH` zkfInR<@)~*ENCn^3SS~cJt5ECs9p4Eu+xE>FVO#kG;bc6xER8;i!%yHe@AQk@(&_K zp5Z2^^uCjm&e^MX?+{%Ma7&`a`e>U^C84mOf)oWDsa~vzIdAqUc7L6!uLIy#skK$fJX zWq(ldSIAqG8a#k!udae!v7)ioe3}SrH_6pt>XItAqG8x#|~A+#kXGS zy6vA8PA*hqIbVWZGNYsvjaAl!HJK>5+gj2AHcM8l6c0`DdS~D zq45A@-dt2-0p8)crh|PWwuxRA%Xutet_-F_8<~R?OZuigQ zk&;$DGvQSNE2FiIeMWBXx8IsrfiF8ZOks+!EBdLRXAKlfEF4$>7`j7$^tkZ2oI~W6 z>R4Pm7v7O?qH_axCH9kO2HDMJ@NyJ(U^xE6AIc7a=L#NbV8h{CW0MY!=|=_~K1M{HQWnHoZg1jr0LqUS4T6$ehWf zoLF71{k?{o$71@{saAzTvRABamwVo`{j1e~>Us4q*n{Cjq3`7ZADR`bgyKXX&so-* z2&|-l|GQW$VwZUL+Y0$CvgBIx+`q5LPTHoFPgFY{U)WOEwZ<9W=c^RbaPsbnYsLK; zic9*Egp8A!=FX-B5R0p&MS@7Xp4$o|kr6<^Bk?$bTS$eN`SK#{BP;8F7DrYz0I`~` z|5@QksP3_4+nkPGt6mO8uVoZfMSxxaj%lVfju%>5Rp|%o>+H(|=}#d$?JxEZEaE{7+_?i)OA^{v)xjde znMg~H!|h`c)O`L>C0)250nNcw+=gyG=l9!bOt%Vi!Gpx2Us3)^?n#j!&hxj{P3YPpc_t-?NY{kngKqD^rPTTGA9wTi>lSm{4(+L1d8sOo}c?EUbel;Gu2OlOQrG#_j$b`=jz&O z-9^_Ku_G%qJeSwj%7M23#n}sOW~T!2#b@rz(|`A}xzO%L4AFAH-T)4dafg@UGZU%fS5PUUOqI_&!kh#a4E6od2_4C7Z2Qz$@DCvV`DCWJA!*@ z)j;RL|H{Qe-Le07|w=6k3SfVlmHH(Xh3 z$G=yH`TbQsV^h=zOfKYtr=;zG=G%sg!Iv1T{yG@?oHkE|uk`k=eRJc5-15q*-|5y# zkbt^3fo_gpUA2dM)xg8K96C?fxthHKKLa3_`Fd2;tO>2aV_46f|3dZt37+o1BzRQD zJ}A%|M?!AL7exL=MPVo#Jh^>zldD7|!QvX2Wg)r&()1a{TE46*jq-!^#kp<@GMaXf zVL(Wz^!w1?YUQN-<32uRFwI3YP!?H|gik6z`OHOCC>(uGAb{0nU#ZVN??3?dAQ;9u zO`6~4=7(guDPH-T3g=}zDHJfVv$v(c)E`xM!eS8?mRA2a< z%%D64ypX9dbt`_oN6J7Ekz*J7e2uuzZ~QxCE5`L&Y+MD#fhA1hUTq(c0)tL&(}%0U zIhk63o{Ou&9 zYiPI#N@}GdOT~S^4Qfa7>#)}Wyp712&kklIQS$$VPoWSl9d=vL9yQ1xK@xsDA5c}9 zsF;N0&a{7Eu|+fV@+9Rtd|;TmOG6|boxfrYXG~kypHDfc6m>?!hR$%?-whBuM-d9? zh}QPDPiN21V8qaSM_k_5dMcWylAc>qGSDMgdv?wgN@&1V?E*?}1TRR^gpf*7?*0)_ zS%Q$X6dos(yaNCC+2cC-7z7BWIs9@1DyJYZFUy*u+$uhb5b8dGr z14D|}PHQgyUF^Q+@=pYV0#&&LkNdeErsC>vwM)vQ+)7vF2{+W2Pi8M3!WGv5ZJ-@X zZui*%(GBVrf0Kt($`RMj8ueJV#VB zB(n{W1_n)*kF~TcT55`KuWjQc^uD(KfDqrK;})@VQr){(4Yd4|Y0ELL4g0B0zqc8Akc27yASO%}F&vC>@8dI=ibQw_LlKoBX#NrtQ%x0jNNuXok0A_( zy}RXZkdWzcP%R~8rGq1nPKj|&i~q~%21?i+9!{z-7WFX6?}|J+TB4%07HBA7g7mGB z%%Eah_yRJ!Sij{Y-c`UwcGltKnRbJj-Fq!Nlr7=_Z80!pi5@MA?JdTt?t+zr8$3*+ z4$(|}%8Hj)l52L{>I_-&8N{KoB(EV^gIQHgP4BCuqfZFpg|&;>V5NvSQH3N*+H*z36y-*5l{7>iQy)(gk8zCU_?F^V3t@pSeNV_{V8)8 za||h(gP@Kjy7I$s%6#_IdV=}BxVQHD`F4JOX%K4nY?<8vfaXMcQP%2-8SwhQXlg=Y zJDSh^=;ulqLqD&PE}}368QX=a;wdCx9KglhhlZlZAaew=b9BW0P6B7mO(XPe8k)SC zyoB?BhXy-bXV0b8Q23aDi+x85tET7TrSsi0p7vi>)&gzb^7^=IikN>|S(z=ym0p&x z(ZR%Oqf+Ag>^BE1^>uxyKNr|c-neto;fw_CZLbfcbpWvmAs1u2MN&`IddFOyUcyUQ z23s+EFVedM+7Wob2X#kg3g29R^Ji^q0Zc#fB-=Cp<Q`Swl42k&ZEp;2%r`S`7y==e=5*asEGr`;4bN{|a($vIJe-UR z3M(Muj5SAOE{!QW*P2x>B(qYYTU-fbxFIqO0Euo7DOw&b`}@Tp6X+>u4ftg@Thdp< z6xgr?3tzoZoupn}UBg7$QgF75{VzDrx3m1^K&b);ES%vGUj(9vZ_5X?c@3WZ5d)>~ zJEpGUQNefUdmr`(_%~u$GtKm|peKEBbXpoR&-(lO*C$&drRc>`gyQIZ<>+~ypjst! z39HG2*qN-eC^PrGTyO;oktf zorspR>+<|{Ju-8%*mSqPuHHo?{`uqO)Ui^bR_tNLD*^!=xa!DlbIWLPs?Jp^Guj|# zPTS8|yfHc%I6qhtVSxt0MFq@>IMYu&9O8it_BrvAZ8Qxe{`lz8ghGfQe`4}b8+TFM{ zC2O3fwUtXLByzu@)@4aS!N{O2d2XyZJ=YpD@a4d=#o8D)Fm9hdeZnX$yH+zP%}#3R z&H4otq$?X6(u6q;OznyJDPj;L4=?7eDbGtay~-?9umICx)02sCI_)mXhkvO2ZT56; ztyK!mL1+r!51#1urK6*3tQ}nA4mRr`rq9b`-aiY{Y>N!}P{2L31?0uGqiewS4uaAI zL^c6AFLNGl?n5;!s5e1wQ{PaJl@s@G2vw+uJ#l&GmI^%2D*~bh@kOFarvRZ}xPNfNaV^m}ZlNt{4Ky!@`P!B<6e- zLKKM}NoL%Gn(duh=Z0z4lT8`03HNNr3p1jA`?hNJ!+&ZbDVuvQp( zz$EJC>1iOvrZ=-aMJ62$>IVSotnKYP?m6%U_%@O5)WYrwAr&CA0=5gfadJax!vt;@ zLoos@cWaFYK9DZqQPKYFUnDexh=|+=ZK0$fyQnm8<;XIbcF|E)kWkyb9iJx1dHpdq zp&;(}P`!ZL!^dYrl`M z?$8bkW4Gfc$IIWW4+2Q{N#8K|E9O z!ouSGlR}?zOH}P6Yri|uzF<%z}0$&J=YDxsxC+B+a8n> z6NkQBl3_iq+~etr#B*Sffi(s>Q|4 z4f2yK9G5wcR=yHpiw!`plmw9i63v9T!MMj`)tAGwgN&8|SE)CkoBhkntWU*~s_FEh}_ zl5k@oD>jTe&tU8dI9O?-4<~}qSL#}P7K&`#cI(=9!~`uN7*SYivJ|bcvEmAB(jCjI zx2ne_f%5^F#$|~QnX&KZ5V~VT`+q~lzk`ttZt$vf6P>P} zHTUti;n3)de-G8M&8t;GqGFEgVK(D}NLQ*9#Ur{Fgk!9%mmfcZf5P zMU4iP8ZOE9oaxXPUPlilzfFO1_9@N#+easW&qDvpkkIUt&cwXRH~&aX_WfxF^ds900YUmx$2D01oSbkaJOKLWq@N&osX-h&Q zy05tluA2i&yySmM16X~WszR21$L_5^`oC2y~{iC1-~v0I+A5mBj*E zGPYZRD56DanTf(nD=JL$->~u`bz;Evz*gmQ+(r&tFEQCB+fKvA!ju)OJ4F?mRLdQ` zvUva+!|&oyf?DpeAtnae`*>N@fBZy%D!$P5$#&3G`Nq&>m8hC#MHJNz4t4n#H9Fn2 zGRimas9E0$X@}N>#|CGI*zGzHEx(G2fgthketVNLAZcypgytD$#C{lS86*hmR|qkr z3-}Y$)!Vgjb~ZQq-h}eNP-WjO;){tFs_Ltk z34wzJ+SUJGjQBS`G_udMIQS=%D>rtwwqCSWZR3eTkLH>G|2kkT{hwllCr_Sy1>Ynq z?ZJ&R+PoI4>nRFXWZ`pOh0~zkey{c(@r;c4>CMc;eP%5XqlS^B5)iCRPk26lufl!? z#Ajh49(t(o5{@L~x@epOjvFDnG2@afBnw6RrklMr}xw7dQuZVpG3 zA`6M}vuDo%=LZYwYf_N<2^PtoZfz-@2L>0eSfrm))E*ofkQ%1RQ>URssdbG`LC zEq5MX;Bo#;jw^v4E(8K9wQSIdu#Zs0$|lF>DM6pRW4~Ac{8%u=!}DbzE%hDjOhD8+ zEi(YBlsNP!RrGYBbwKr8({w)w@S!!;bal8$iUBw)?5YX)J(1NN+}J+rdD{W{g3s_D z4J>UVtvIlt!p;E1=tUJ!{a#M$X*>QV3V$WMQAAPFPltqU64uwH0gWg(=^%j99eyAv z)sd59JqOS|-VMX-k`h4;7l%Us3hhWsH1@UWiiY+l_NA}voBkn2v-+^TW@Old2^YAz z?04^8gL)Rb3X#t-ux1-Dv@sp+b;FOr zO%G)ku)X6*tAJ!eU{i?X8p7Q`bSc!9fMiI!n~mMTf|0VgpgbZmkxWWXap6T;hZtm( z0YLb^x`|F7`}*}yw_azV(TDn6lh0BJ_%o+6du!YLT~UJ#wt?3jHnW!l z_SQDG#7~#bfFmc6R{48$LbhqB@Y?y)gE5+RWWUujZ)zT9{_AE8$Hb#s8J$y=Y2m8N835Z;RP)kCCQ`lP{tE%}@ zv+zxP17^dePD{|g-Mb4@Vf+wknIJAz9IiE})&`{OE-|bK4D(l#Mgh&XncNW&pMaGWK&ne~w>CVI|RS=7B0*dfJV{>lY-kckyskNLX2? zz8Rhj8P0BcdY&FE*}ZFDa4xH{9Q7%_s0X7kr2Z2D*#Q~9IzeyV_!WTlvp%=QeQh61 z8%Pku9HfCnLUAYwW#^VGIjV<12IE?{dbCcy-+co$Wv=fW@8%u4IxmozxGJ)Ub+x4m zEIYhkvR|*6UDIg7I~kR=Dw5Nti%5b2REOPCoztklD4`^cDGRNr_yaT9GO|wregU*X zaavP#`q{TAQ{M&8>6Ka{EM5}WH{>7>&r0Fi(!!FqK23NKdPKgzC_DQCTpo~?9%dJi zV?_mAz@O=+>BeV?W+{$BirU(g$d&}JCVTAa=}MbP+WH8B|otEV(IB7P#v2`P= z<-v%!t%dI7N=(OFRo^Fs(#?${in`*Hy{DDC<(76GXJZ>Pt|AA=OK0hzQ9BcK@ZWB! zUp&2&F5(tZwt3gxcKVT;3o-0C5E;9T2nCx?#+w+)qL3`~zdI!XZ;MFHSkq!iGn-{g z@Q1Yvs6uk|4nR!zW5_N)p*8z1gNj0#qp$A-Tm2$A1i}58sEh|eFy`maX7Fc7OAX@J ziD`ha_?$Pf09kTc6CD315N()i?C-B=n-qYWc#`{p0${Bj$J~C_f3Yf0i6F#8(zT zmq40uCGa7N>XAyJo}z|^Zi+Ak-T-{AUuVt%FH>dqYi%nB%F8=!V!tuWUWt%2@|d?L zxFse9qa?I4LgqRA@Q*x{1wqJFh2?dfH+z-oG=2!`YXG?63j{@Q0PT!Uj>y`*mF|>h zif6sf^Ru`OGtK^>F&l-%l&E3grgYgHkiMYsVw_EVW#U!_2r1y)h7AA%SC@-RWD%EL z>ZO*JmVY}t_XNy`*lo5otfU((l0$N~%$L_7-po7SrR)vJYY&LvzK#SS56B{lw3FS(WYe2|5_o#yv_+j@;|THVTAS z9fd$_fG}%6f2u&6jp|NaMXo`Ek7|<9GHCctL4Z7d^p)C>|Ty8qdhFZY?vJ!qvy}M(C=m zFBuZcA06)TwR~OLE(60bQ0YAU{Jo$+086rTVuIVw{^178RPK~6S`*?J`2^M>un1AO z<4Ib${$qpWMm^A~45&WaIUME(<_khVVmcIH#|L?E+tSWms4-2sXOU9xKdIWF%=+%k zImjp`iT=v3U;D@w1pxuTGXm%9`8!YC4EkUv_j6xN!5KHT+2`?$;u1)05p^8gm{z@~ zy}213i<=)6Cwg9+HBaS1d@1x!Jl4=iXs}4FHJ{fDq#s!_ITU7(8#1-~P)fKeq0>HF z#TAjq#0-3a@%{jk1FIu{@RUr-wdJ9j1`0_}U}I++nVgV^*%cCx8L&R}pwWiV9Z%RM z^lBXKCyxjD6pDIRT#YH(@y%*#YsZPEurZ;wnKAGfA>vAK3+oU%&Jq!tf;3lDHLK<6QtX5lS>tpE^W@Y?w&!uxW6qYeX~^CF_~1y%%Rl2L(mfHeF1 z?BTZg4i3-M0z3Z`i~mi=PUK!|-M&mv&jiPVnt?%IRcflnS%BqV1|&cwT#6$hV7VTw zezTw@KVxBM)mLkxPPQT7(^kyvAj+l(jpR2O@k14ee*}Utxi$n9(HRl=h9SQMPovU$ zj<4(lR?FmEs|9p~gsQ@bTdGE=_iL$eS-x*D$Sn04JTo;7vg8P1=-Cx+RK)|N^{CPB z>_r3IDMqP>Y;z68x)DvFx&%_^#|&d_ZC$d$Xl-i9v+>CiDm%5hJ2d8Y+mC7&p`jLl z!xylK03a3_nWzR3rEDBXO{)t>Nhw=+0L0C1YRUw25g43T)przCYS4b{_Sckkd*~qQ zZ1(SL3vf=O44h5h%WjG#*e8O#{eMJ#sy^Sn105!V(SsDSx8AF|)AA-J?}KmGO@i8P zD?Try{%Y}d`OR(JdHhxX@ez_K-@4Zm_Gg*4ua1i+KMn*mR#Sgp>rig@xhqDJ$hsW}%UwH(RQ`iDO7|Q%!)rODgc5Mc-ej*3E2dlg?JT&T`}81t8pu zKfi+VE$}|QFJOZ+og&1@<05s)i{~}bjx}2{SU1Q%hK3J|v&IwfOI~d1?}v7AH*HfY z)-6Jzx5af;6Z%b!LFmAkwECI5f?xc<4~Z|q}md$v9A>$LZE#P za^7P)Zk7)2#90TzCGB*)?*!FtkB$N@0ic1b6bOLHFDQUz2+EXzLjkq7%b$_E8GgIk zv_5~F8h3|EHX&~3-rc*+1J38b#Kg*)m1|CYL;RS`|7n1z`xL-q&o5mi>!yo4Z5R|j{WYZjoo`qdk?67Q+xL4PJIKOFmu0^ z8EIk#)Bq6lm!gNu@A(AyAhfPC;0$x7WN%N)$yp?D+kW9Bm%h-@Kil+0soPE+5B~nd zl32&}CeIh(%!7*;lBu8riHeGPq}qWFrY3Qpg-R>r!>?b__ih*U&?umv9iS7{SYu@PaX&{IX+)H4*OvCfI z-=?o1{8VB{JuVzon}r!1Y=z7fvi)gr*XG<5YVbkTvzAeTdE9Io+whsu(OPrU2j4gJ20%^Suv8N|cS_!9ZZ!af= zTF<%Hsqr`Tfp-mQYV!4^(a;bqR31pQd)zJ7&Vvu9&M3S`0Ki+;LV!Gf0x1c}yZ?wx z^y-CL!IGdKJA3ZKn>O1qwhcH12Zyv1-B#KGZ$;$v@RGjw_v)GoUA(9=@^3$flM{1m zQA0zcqI$y&1SS+A(N!~_4OYh@j`H)XmLE|O`*SkA7Z##c2?tI z%t1Ic9*PN)EXO;?Om?4^oP1#2tj>6w`m1|^9Xg38?#?6@?-iP};!4K?VP2!B>g`=B_1`N2op z!UG_p>Deg`7@dR17pmS$|EkchEj{#=6SqKDrV27@1Dr}m@Zp}|eHlnh0INOfwW_7A z&-(T3hrkS$etf;#;FDkC@Q|>ONe1#hp~}qOzK>zh!()73)w^lf&Bi|WObNCsz-zOs zs@(POZNCl5X0c2~aMlgX@x2#`vj(Z2ec)QE&6Y_IZ(+^HWDtHLwW_^c(iqMhLkR9<(QZA-$^z!8cx0Vm zMZpTgM@daRUpIZi1v@XmB2&X6JME_w)kAJJ*47}umBbV_^ozJ~jhWUYRiFOviEd--T4?{O3FvY>8KO~LyBiRJawZ#>eCS~{6kvD+PiY)#bRL)zG$^YeGaDMm zXh0Pt#UP-R)X1$)5}KeaPXu$!e_#>lg$Kh;%S!2H{r!CLjgPeTXusq#MGzUTpQP(q zq!h4#`MT*^Vt(4^CsU%?bt1pqP-%t|?N)%-LaSy;GH#II&|SJHXc1YSIX>8inv}oA z9u3#g7$hHl*71r4I-7-nhTvz_O%7I8v+2eLI0b;llm-9;Mp>{SQ6SaDgcolDt_6pz z9{^Y|pu%@nnnXGSY)$R$#kb|khl&z^x9T4}Fhq}E?;#qx#)^wt4vBtu9U*uDtiSkZ zW(^2NfTWPMHj>$}mG!<|aDB=sB}`F2)T8t(>ugIWe{kxmse#=c_G-9}n5ZJ*H}?+y zhNsTXM4GJ z{r8_Um)!fS)>W5!;!!>2h0Spbo{AUb=wC?Cj1A%1#YeOLh?96>?n!+iIEa-IpPLoG zqD0|{D2_L{(e#`JeSDthfT&KQC=~g0Q5CQI=1$WsO_<0fa@=>naO}OOqf>4ww>NRm zx5)>oY`~!TsNCvD$y*F*+%C4vFpHmDrF?;>`LuAc@BRje-Q&(q5BjeLOML!1_KEls zy@8u_O?9IZ<Sd<6vrz{w-E)5w1ZFs<}M;#>`2 zsBli+fQifm4%!Ll9!?M;AUfRjbwEcjiEfFMBKKOA!OWJ5&c(H%Y6Q=9YN`$!JGRtr z+}*xr_7V~(0M&%CvOysG1esei2zxxYdj)}*lOze&E;u**z+vQ9&1fP~WRXmW(TF?+ z)AaG8U^p}Jg!_2t{_&D{Kh)Sjink$Esjq$VYb(FMXE#yu6(vYO=;(O41 z+3RoCWkiyPT&*iViS6%t)%d~nU$+J?rg zX3*8f+E~53ixB|NimD3dnVIvS!bL*ylDdDAsiwu5UVV@s4{4cTzrpIc;D6FAW`K_r z{K6hj1);|j(h_v4l5_cQ?YrxRsmG65U(!V-!2=VDmsil`)#Z4vWqxNyRWF@dykk}} z6arg3Ivs1X?z86gvwn zZZK}J?LeJD2 z-kaIsl9D^(;?o)H*uS2l9}C*|YjOkzCntgMF!;f=gT0x}B8>S8*cOLwRXQoVrqE6n z{goP1C@VrPp6`DtYkhoFGI09XM0 zO{>8h>Sii6uV;VxI4=LYP}WIX2<;KjTe>82%~j!-^-ugJu&`OTP$3O-DL z?{mjrqLh8!>rvPBa26lCYm(V~DzKa=1-DRGvDI=&b4u22owPJSh~Y%labGH^T0X3> z9pxQX*FiNs7oYj_6k;R6S!8HPCljrOgMUdRq9?d#{xQal2R&g>QZ!cJbat}0-9mTz zI+V^o88oy|jGn!(33uJFD~Wkyf6(%kNX70}()77#bnZfi5voZQ_;RUFm(SI=%{#ir%%J zr*Gb^48QyKb@M#m&_h8y)Oe%5j0ey270a-UMk|sSYN`0S9EDi3(Jpqp7Dt4pSoqWf z!2@7t66UfZ7h=h|VwIF!t=o5l3J6Bn%43s~LOFV((ZBT~hhIH}aJ9f@%uCk_51|un zGo@RLGu%&8aj(0O?qY(F{_nLLlc%NZvdx|rrO(?8=7~0S=ZTW89tfWB0ul(y2!I&o zG|t8~=jo-H?$WH1!9DEuo5Z3I&xAsxdSXiqVlH6<0~Wf}Yunt~W);H3p&A}=|8IS7 z@5AHkLXxSj;qn!#*Sqbi{lY?NyKj$D(v!c2Z2b7_f=Z_6; zXxMyu!asDFRvV4okR+6Hos8=($uF)VqS5!TRWzsV_eBSR7#KwRhzSk);XgoD1lOOi-8uepD=8yA>@fJGuC3FvQBLL%Et;A$Kg7~_q^%cB;VV;qhOv4?CGt;&IN0;nLA5p;z( z0qAOdms1%WzIing?{ZSn$d)ExmJtzKA3ti{i^NM(Wa5?&!MU=J1G0b6_X|7zJy(tv z#o*f%jBji=6?GV>sr7*W0&>onQ`GOGU*59_v2t(#gKw0h&>yX-zNh2;s21FpkBUc4 zSzEf|zVEjRm1h&;>BxIYN?L#w7%IYGsg$QDtZ`26`Jo~e3;;@%-E@dTne81$6?mF| z42*qS7j%cj34N?7MEsugt>G1w_OT0-NEM^5t*b4UVl5gTR1o!c0LR{g4O{w4}T8uahK{FEPrV{ zmW|i-$J_zHwY?pmgOl|U39ig-brR_w0Sydyfpc=X9Qs6;@FLhykx<*}ywJ_?tEO__ z_!RjhLxuNKJLYo$>9iZKz8TX7+Ae@aE}SGth5C^N z1)?XIv&O=Pg*B~~|5doJ{NTrr!M+qJVo=~s6-z7hTXVy1&Pd*fg+Pstc}Akh**))A zH3q`Sf8q$h)VP&UB2@4g${R;tbE@FWJys@?iPZpzQXc$A^Thvl`sDR-|seD_llyU@57-rUriCIDuU-TtO(xLujyE#lD?txpTU$-|`>H?;M zVwTmss$>2(6>zX)(s_N{2gelGbw3+KEWEN`hCtZTGN(Im`6wzXmBQ5o6*O9v&ZMyR z7P9Ft5W2wJ@K6m6Gyk=aEX?F&OQYWr1+Cb8=g{@Q=Rq?cE3~nS9s(v1(QvO{v<10k zmsVMIe~T~Z7mw0I%aLqc>lc@$<=?-vVfQK*ZMY~Zg3Cpn`vN=fmP(NeI5ZPn`Usxd zv9yi2+ou|Q0K;!Jc7jCuF4KW3%h?>ejeWmyi>{s zyIZe$?6RWM>E4%z7bs&o;OB$@Gd4E1k0sMzyGhyK+7zse6;?vEwg!QP&Hrlw-r0x% z7Wl{CWDoa4|CbVQsT~{~Kuik`AW+p{Wdi;T{uaEJud9{nH;U^{y)~1PpqLOM0O17u z9B}3@ljFGPEx7GZBz<1HD%BP~^w}|+>d)S8xJbB!#BHExu3S6@D>4U}nXhjk$U#8E zd9=5&G?V7gCl7x8LX$5Al%3^4EIobOpwYRDYf~#sL!hRm^>wXU*S#2&Hj8khmNq|H zb&!qwLjw`uiC$=vI{~|S0qxAuLckh}V1`H&h(N@AiWMEcU|=#HDOEx4zyyiT5}zmQ;+Od%n!EmdQA zYtHxVnpzM$<6N)rNs1}y(%Dk_nTA;oa@~V@T_o!JV5_tI5DSEzUkiq=T%$c|AMX0> z+}Y>RF8vB@dGV&<@W70(vl=EJYbd{mMoxW}jGI*yL49BlIH z^3r65cpdbeS@(K#Ld>X(QBV|*H zH`$Bu=^_l$G+?r0m$^Sw1q&qbjCj|uB*-Ppr9F(U6_j_~F&sQ`SV z&^yjY2_n$ZxP-3DAK4|F?|rX6iGQh^!(gr^2v621GhGXDO(fY z#YjTt>z_$ii$^QM;bKbU(wB#1fQ?Or7>>OYy8P!)dYK``=PeCpI-ZB+N0(tfnSzm^ zyug*T+%&%+EDo*ChgQlE>dH7d67t%*2w6NpdtA2A$MaBb%WaSH-T7pg1L?!fm1;sx zZ2jr^>G$@I*QOehkfM~vMzPh(i!{LotChG*C%M+=g-R;CXx|U7-PU77CoBB7^+!+O z)O9@6-fXhgEs^x&oWxM!i=6Ci37cmH^;>}tdcUdIvU@7ZFe(nYNnyrf#>d8Lp#8_v zVFNPLq31UIarVbldGMh{{HJ8vU5N<-;vwDx{BRL-=FY}(WiBSICQc%CA}Oiq#@5!| zRATBHkc|k3c%inMT(5T|If%`y^W#^47oPB>48m;e#i1z{F z%ot)F4?o{?sz?!1Eua&zqG$N=cv6rW$KvN z%lw^}n%f1jS)MyPf;`;3=WeI2cyruxm=<}f6N4wYG_30YMe6NTul{*K>f+p}MP?nF z(6DZsZYypG&NN#w^O^FO`ut!S4bF2vc@+6Las9v8UI^*SMW;cDW)4VXRY=z6_OJAd z9nk=9wOsqi$ml%Qz~>goToFe+eBU8-QBo`pm14?kMLKdisy2aOq40t>D@**MF4OMU zuUSpCVU*9nov&S8oGN}0FW$E1j)<35OPZol+Ec#@Qc*Cju$0? z2!T4;(Ynw{A9qM#9R&$4=z>5(p`)YAqxh2FW_V`PGdVfgage@n_1zuzYo9c=skK}b z?m-&gGT@bRsJJdK!Qa4noPMR2bCUNN%R>{D(*FgD4sk zYp&?luVX32wKA0|9rhVePR=yda~i)_!D`CJ&dL273?3*B-hBFN6t>Qg!zBN)uj; zzCp9}qgj$h+=)gX!^vyO;eFZ=P84V0coxZ* z{4+D*FLRY-1_AH$j44_IIx&dG9m(#03y&VaO-Qu3?RZsG-PyW580`+Wo;HGZ0YqnU z){y?@`9iFEr2?%=2lB5*gvx%Tfb za0ke-kYqzRtw+PEKG@z7`=XIn6_}&rlae}ornYHMXKsiEa>#y6?f%t@nkSwI`9*oa zSsKVypTh%H7j93Adp_W~<*(x%c@z=I_dwxr0QPqZL=0{suV1k;;5kKJpa0=MWv|^)3$MMp>0TsB z&cJt5IwRoJt8u@LdkYccmBskII@)NWQz48sy{e(Hq*0hoJzixG4%i3B<4xmzUk{zLRwzw=rYM$>r?r2ify79Ef`|o zy?ggVQ$1fQjzjlHaHr$BSXq*$>CoI2gzeg`atF~4urn|}XEilMxU(vBRoY<7jan{& zt`~x-+SlBn9vAd2mxaByesSpb&$P8X{KU*ws6%YF7YWJO}?d?W%KIDW>ODN-64}5*ApqZrP4igzv1b!YAZz?VgE^1cKSp zG7O^o!0k4jXu-x`DmdMdeeN9xaZH=GYH1K$;XiB2Zb}MTT3Z_fd=k&BoNevy$Jy0) za39c5NISKis0at7ex|2dmM%6d2UY#rZad*IkRgqH`3{GG<=Wt<$#O?-n9gl^wo>&gkoBb9pRo5Vb^A5^KWe-H0q|?$?8R(;X81($tKp(Cx4=Z@zMU>%H*F>2c)O%4n;f}raOO;s*M2U6HXnsj+bS`=ibwuP(Y+2 z^6PpiD1r3l9}^R=I_80mj*jvF#|;}1@c2Ct3^%jGhKm2Kp%zw`jjsk#Kz^3Bi~G6C zN=jR;#L5WB`NfzKYu}UzqrJL@G}aYP3z~zc8XB>Bagq|+Pa6m@6`f`lA)!V16p?q| zZnifbIw&?2EzyAX?Gl>0+ftNk#P52 z<#)wt%Yii$^t_htk{vcLCu^^n|5E&8PL0o_M z`xEkFA&XLouFR8$KSfkLoca6f6G1edex@W}n&AsOd&|^_Ip-`Jk!+SNfW0D~8u}#+ zlL(biZsV|g(<@()P@LHAKRXT*Iuf$`(UDUF`#D8!xYch6C^Z(0QpNlZq(>sQ)YRhN z<1u#;$?=DyU`MpvT5*G9@DIE{!ZrhV-IrND&24jU=E?t=vSQ(PX!~I#o zL7)is6j+@fk^HT#2YqsgOo)}e{o=3i_@sY|Im5Z26oRrs;lGQw;Z{9+9x#2df%vWS zPFGo>MM3{7-80)`8WWSHkvb1<*tVPpxq7<0YgTfp?KBi(iJ7A@V`J?QFB3M3uN|pn z%}*ioIOL%DhW~T=D-e}8T$n!tFq1`Zs{F-A?}~~N;E~aZ=2O#BM|{_$pV&u6YGQBr z&fp-P*x4&DnU%9vsq`N_pb>R_on+{pf`s8xTtJYp&T`PBcksA^ZAtv>p#K2!+?9Y9 zKol6^ZG{_alXao8sN?8Dr_dOhTu1~CrS%Q-*{H+bUX6~4f%)9x zHs+fz)BRe>6pO+xRWjNCF_wyB1ar(tsS!kUYrvrKI7FtiuV)VSBiQUfa{4Gv@ALW* z-(9Z%o+D*i5OTmm70v&R?rf6|K{0QBzY;gdg?@W~hZy>4VB!1rU~d8f&*-yRZbuB@ zMvSr^|EP%LNh8crd;K{G?t!@2o5|!_b=E;O!Y^+;mA^x{L^D0n&!z3ORZ?HC=e*?t zjqR4!TNmI;=pBc98~{rYS0w2>067d)Hhdv%N6Ul1e^-pGCyM$pY#kfY-uISnm=O1; z@Qu%x41%tc?oVB#qVGx6Fon^;&8@OfUssNY0!0(eF-Dk#x(RHB2*{P?L3{sGmc;62 zx!G^O@91srrz$^Icgo;K5pb9?WtaX0P#%D*B@Me&%t|yKVUD%Mz4^fxQKJ_+rR7lf z*y9-$5}#BzM#DGB=8EwpN+omwpi=~NB8t-wo9ra>^_#ajwT3w{m|qLH`GtBtu(ZTV zg~Rm*U@qud40zK`nmtp(e7kqmRY*YE{bhG-jl;0oiRRf=05 zo@6E%t;;2hjA)_T2L{Txo1M>$oddxn)4vK#Eic^YkmQO8iZe3YbH|BwE@;=+-g^fj zB*=@OZ-4Au?t=WU(sTM)Xzm8zNapVDuHoufBcYW5RMW?&wYXsoWI(g@Q|nEG&z|%0 z%wz<`XI0%?g@~AFuHF+9?po|k)2^!`l6DfVfuaH5v|X0-C0L6aSL7%j&&72) zKHpZP3hDdx>*DNRz6gf7oiBIsdh;{=)g&;kkfaZM#6x$jp zR4(g&P6P%8Kz=Gr9#RzyYXF`PPtfF#x98hPDA(cUfRz>+Qot(SD7D|iNdSnj)M92KI! zM-N6M{0Z#+Z*Ph;(0=$YK1c>p4YU84tL;a>xnT`$gvG8B6~v~i99`XB=O&nXqxcuT zfR1|>Vm9+=P4v6YYa!#mNy$jb%A6C1;+3u{|D#(La*J=XS6)24WKd$31?R7{ zof|)3Dj-A%#jY-R28eHZPTX#Db9aZ*ko^3j=A0UHjU_UbzHcsb;Vk7GYU+Bjev-GY zT*5gyLAeq0KxFYG-$SCGXyTT^t1|DECbiV`(MtB~(%l;#=I59a`tb<}0HzTG-fv|r zkY9%F>`k#dKSS>20Jzet#qm}pOT|?Uo9>kOEI8%&ac`Yf^wa`D-qY?fBo7hQ@V+9? zYX@Dx#HG=Tu9J=&+|rx%!LSMuJj}5Y;Y#`jO79%*}cqia6FCeg( zx_)=e=HEY8@MEuje08EjdvlVWEJ|3-WHVXX)@Af6)FTjs-ss$aeA}rJ{GNUWOzq6j z{%7WFO%(ITi6qCl{PQhVPc)WN#E+_^V-+O`E0XJqDhxKZAjH1sH5*L656UG4_-DPm zyny$Dk$_Mdim_j#x)Rrt-pXAB*uf^fX4yya?s2^J0K?z#LtzYB0vz@_!&4Ea6M2odKx#61x4?#MZLwNYjM!DPOoyHpk!?F&)&Kj3=95y9^$Q;X9t;^bCKMe^DxS>J@39A55^3} zd-viIp`)p}nKL;2x7Pwr1>!gm4b%hj)V@vPjxQTiM=aW!-=Xuf4gSq;V45U3$Pht7 zPGwF4m|-y!{zq#QzT3UN^K?y*-ae}fhGBUP_?v9uo?--u(dz?*9R#a4tB)VMt zBK!r+AS&A0D}4OttL!JcK{U9$y88apCjiG+SRUp6_hdOequ!QV=dL0*c!errxdxw| z?{?Z*nhh0oc&qWp)Clat;~{d38&;R_@bSU4mpKnjbd0IF;{u^hMB!~Q5F`kK7E9ZS z87;QHy+$%rtG-dQUnR+$`9jORzCFDQiGLEI_$P%|3Du`-4>E5M6G8Y4gh+uXrp$7# zJet`I$52NHF(yd|O9Off@bP1~qS3wRXx?;=p6iQw4sG%R2^PAUb`J+>9bv{*hm_5% ztn+el+~IhaXZ9{5E*D4y00Z=-wVpz@T1?}l3OIlOp$Cx{w)x&bq3@IK(V-q(V*ef; zr{DL8hF(%|u0<9wE$OG36Cukc1T*F2<|fX~G4v6{yvwJ8N%}$h$>#^0x+uU zim8^Qh0eFzIC{Mwi;EY53Y*`%9M)kHjV>s*kutgK-c*)0-*MSo>$_Z2RfF-Oo7~W0 zM4?bY>^UFzjjYNdQb0(+q)5bwhk1zMSL}6tL#V1*4HaZySwYf&%@(MxT}ynOlG4@M zS|h1bml`XJf=Quj{dU?1KjBvHUQKh7wdUGqJTE~^Kt#}Aj(d#0idKWPQxZ~gAl2R| zd7g$!!!nNXsNJEFa1 z7S45(AP`r5`V|g3Nc4j*$z7vj;}qAP0%*2krfKWu0kCtALn9Wi-VaVU~Z=7=3C%D z<+*$J5h$HN%ue3sck$6f!e+jQDkx;{5n=AO|IVDhY?wib!5H!K`jT+# zcXyNKAfI?v7Uoq{)QQgCXV?GS;2jS393g^TYWN;l&aQ~PQb1SpTD5|P;;-v0-~AWq(OKP(}Ux?3UR;cJs57DV)+Ct;3SFs(&uL%lNzRDI3`{`Qh6RQ{t+T7!yQ5fN-b;Z0V@kn^ zYQ$GqqNK_>G5mE7C+@5-^N<6iBiN^FNZ%&t&&08C36BS{w-57$VClydp9%_)-2w_U zg61ta<+6(i&7V;$*(omScy-3L?rhX1;!{&~l?%pIRcQhs1!bAHAryOapIrFcC~^0_ zvs2$CXo-OJo(#S%K!q6_8-Gvvjs%lygp0KVs?8zjJ_Lkt`_5j69>z^%Z_CI)>dhab zNWj$MYe1Kcf*tta>t(TrU+EBO$#JnEFF*fE=VZsclgx=+`J+H}oH+~eBZu|64KetG z&rw}ayUClO#S>fhH3166QnXVbi~7RpInYwRdWA=lH20AWG(;q$r(>{fUwTbC%FxZq z1wv02Ha4iW!jm-dHGTzin$`oI-Rx_i*MQ80xy>4rfYkEQ6faQ_{Iv7nA;%1ybx8ON zSgvk^L>w4Xh*Y$BxkXj$?>{FjU7ogT5imC}-xL?yqq-QL zQigyO&4cL}80(NMhA}qNVXxi!ZST8_uDQPUH-1{afo+2!HZ1-}uV^F53k4OD_1aY~ zNawG$e<4s?z;KNLKta4rN^?N%Ud-cAgoNZ;5oGo8xrP2q&`HK?c_`>~F8_d>gUr+Z zPab>z`*E~dz*l9kb?U#>r&+r%kD_s6qQ!mmP|#J1`kZp?vZw*MhQ?0?SG@n%0%#y* z6soEcLNtx_xb9g5AD?kJ=2#G)Q`=LO@9N>h4ShHSZFjJGFFsEoHxyqI$Xv|m=O?wP zS(@@mNv2p@H9Qls=y+^5emnC4BbCdrgtjJ^WhYfgbb)oDPGuZEwZIb{oe26XPyk49 zOQaJt%C-vZ_|j#zA*Q-RD8j$*nK%M9?a-XaP>|aG7~l^mcA*h*4I?-7jdc|IPx^R! z=-J;p$J^ook+K}kgM%dT@x;;iHlnnUV+nl=lvEEG{>)WOq%2=?;E7l_-rQt>*t@A4*XvHxZ#v4SwOMF#kq{54se~3SEEy3>Qg?A}baSiR6_XVL& zLJ-!No4RXUFAoF zU432VM^$#Vt4yM zJP%4uXcfxhc(?B+Rz%M2tsgAiX#gnzk!?U^4i2g#Y8fM=n{g-xIbL|@;EoJ}BrxGh zE4F?CH1W;zU795~FP@K?Gd6aPgT>z-!f;vH*dD8x_PwPBMbDgbU941W)~pc$jp&SG z81?lF66E6UDkSDZwz*b->8F7itz&-kx&6$xZiH^bgNAyq88qDTKlys|HSjQweba4J zGsDw@;Klw2c!#G)UWux1F6`_D`nI{2*s0Jm?Mrs_jPaYEwkhUrP=N zx7X^|gL{9&tKa9No|>G3&2@2~LyPU<_kG*qOAnT7-FhJc?8|J3$7ffos}A*>B6S`c zkHAl2(^J1c%dk3nATn|2i$M!+fn_N&$?%jE8ujMP;zv|h<+^uf{Wj`?sqO1uEM@vc zFJ%PKYO5~l(QVqbiF4Ovq@Lhix%AWW6-3JY{yqHJtA~HzPmGC)8FU+24GnM4_NLEb z{tg~{hUVHp5L_uF^We2SgOH!6242Ba8I8EZUBXzCN5?Nc{`np&M@lh-^yC0W+xh*w z>GonTl*Y|&*1&sb`u(=_^?R3$)KEeygirLiP%5U*B0(HIEcSwN9C!WKY4r6c!86Ar z%+DVwWlvH2xv{5Q${xrl(uBeiLuGK(z=If;8&=5ju?q#k39fW&X3oY$Xe^KGOG}Oy z4A7pv%qI`NV$feYzggp+nn`Y8vQC|S_6=m{Oa7bJnV8yB($mWwxvX}_a{K99DRaYv zhPa<-kjll4Hk#cBGb`YAku}jsj5WkN!b}wVs?B0@V<0^U_N%yp;Od2?rO)=0BE!g! z6B69PtPx2_apj`Wn9pF9+ygljS=wd>{&@7@R}ykf@AT1ixi1c~fkQZmnFNkZMvw-D zOF=9UY?WeS?;F-ll_KRoCcP|CejVJS1HI%4BcHNo-i`>d*|% zdT0>ird(^fl@@KREg?f>H@P=|)RGb~IRdnsjiW=&(blnjrkSI-J$7Ouo5jpp>9@)9 zg5u%~Anl`GUHUyVyj}UeW(0vnJ{Q3w%3VNQV?U~Ktx;8jsC;4fPdEI|!|x;%ad5Lf z8ze;Pcu5zvpizv*{H<|kV>h&2bQ;ADq!#@AXH@$SnpN(=oY9a_I}42Yzk~osi&IruTl6c&6Lv@*M{so3aDF8wD8=1=n3$DoZ?>XKJ0S zR{N9I9rXQgR?JSPMoo-}Ku1M+%OzGm6GwFI2Rcfpjt0l{;L^_W=Ub(eh-~J)6-BnxNadw_XxonvyaW*=R{Ao-{)5_LQ>$FXxK348ZZ50iq34J#s*T52WlT6t-}+PLZo*q z^C#5kKc`JnOI_lF6inm=66&1ob07=dY#?NNtio0y7$-A$N`BLzwK(Hewpa+WxGqcz z(B=cR@OedK&CR0lc&aN(5n{l@yQ+%EfGROLii@s-hsQ8eX0Ft3`AZnmACT1DM`A5P z0coiJ4&QN$iVhtgzcJIXOJ~$bN=i&gQPX}Fnr|nQYd*u)1^#DCptIo;a{0Gi@qyG> zfIjP`c;cEvyWz(=et&f8yNXMa+ExF0ChT>$^8$R3|0(EL4+}Fs5N@8s4LEYys=r&dg`m9?BPcYwys3 z@4ujW8ut~-nxeY#q)=PM0`dzFmnm)O0C)5`+nU7^GYqg6)k? z`nCE729WFvjbcp|O-(sVOJeBfi!ODiCjiQx5Cygze}6F;ny<1M#T;`UDO6@5r&@nR0CyVO#;y8cArd`!VepK0G-HQJDYl#A6*s zXFf&q`hK1fPMt2}am#)u1kJBCrg66=1cbz(EYgTUo(Jy1Wwm$dr z$aO^Yg=>iuipKa?K6x5uJnX@YqapQspUJYhySn73>nh`*WgSAm)AQlz)YAxU)EA$f zP!DZPoD^7J>4VP#)&Quq1b&{DAZ+j=DB@C7ak8XAb$k>z>zDgPiD7g4!Nlsy+KTWE zUG^b%@EL~io5k8c+WRAi?V>qPZ<@-OZ!=dgJ*`t>V24`)uMK`wH!*$32NV-2mv>As zqTS&Ys0Bk3Gq@8*d41asU)Er|1ixDbtMA8;#?brArc>2Iq>i+S6CPFcfzFJ{;BvI1;&oKz<9)N8M@?$No>u8dalYb~I4Ez3_UtZP^m3wwVFna*Pu3N3{ z@Uv=a?OiT-iGe8RpxiLOpwVjH+l@wCzo;diJ`Rkyjx8sarj<;`B> zGxO<|+61V=mS=Z2qkB|75gShw1U2q(FCu;7-ecO%R5Ev#{KyZ5?Mj*0Sl)lmPll5# zAt@;+pCME-?|3#_D5mG(%g;8sc4X;gd36R*okAT3`@`t$tT=#ian7FesBPbP;xkg7 zD!TLWZ54sn?q0(mf<23`NEhh~0kAh>$FIaLx=HkWZ3C>QP!`VM0WG$I=ZXwTc0lj+ z)qhELcg{Vm^75h5h^~_MVdTdCx>B_KYd@$u6e$hqscU!s3g?CcmqI1|CI&OcR;ISOYZ8w{2Mi74lU6(L z3^Qi=?_7sJyGkKk&*I~C$AXtP04yaZV6CDKd(RAn!Pk*sf9rp5p=<~t7k_J zuH*JQhrhRM#Ao&T{m0(axt%kXZWT75<2(XFS|1-uYvaL8NR77#=ODE15vQf;fbPI9 zp#NTO7VN*E*9WPKpk1g98Oa_q{o1-kvxa!)xu)_r5zJ6RLN*g9fC|mEp!>)~j5@G> z2-rdUKZi-EqmG_jr@I$3{y(RrkjuH?y_joHctLE20L7xB4l``nGV%5~4;PDwEkNi6 z5lr;5FtSjMe*;Wr4cTRr8T|Gmj0DXeb$ku$;R7%URFeM*Jy!0EErJvcWOCQQoY}PA zO+F11?8w7IoaOay7iNwSdpFAs98h%92b+MqDqZX}PYjZr)6>(v!1|{`IFJpMCHv!0 z@&#otCT<3+)j1a>5{aCA%efKm;V67sT#mmLnL-13M6+l!b#U>!Xx{aOE5OSHV{gua zGHu+KWtTYhWmr2@R8-oI>s_#vZ$luePK%FFhJe%BgqD$eDD$ZGA2iiWXt<`hbr|%( z=M}{3Wjs9Ft_JA|N(EpD&s|+9^Djl3pXf>wqIPgX6J%&^=gJD<*-@)3^-rsbB30N{ zpXz|IDxy|_N2~zg~kC$^}>Gh$-I1|ui7C<3}YSkUdYZWe`GGiZ< zuQ$v&Nwlj0;rJupf`l}}yGoOP z0ge4u?abG)djz6(#Ckl{Y$cF$`lsN(zylyZ?)V*dPysX(XEC5U#p(7`mZ#?3doqDQ z#TJFQWjIJdr(06ZQLoRzZ*RTwZ^r4xw#Dh`=~S)N?eroYYHPVlwPf%ftp9w4UN=YV zd<7C++<+LL=XaBc@f{Qvg&9UvH?tzbT=9$brLCclGz5rX?rwFrlNiM9VS^^C`7`vp4V0h^$GWt zCFH!9+!wB7AhB>5uuW75!=*>f6(B&7{S)2xXU5NeHfc_BbWkiQAC*vyaVG+`S4+33ubwp ze!pgRA$+3ShV?%#^6iB28B8w+A)@i@eDdnFhmdH6{PMjqifUjS=fC%sX{4k|qmKz9 zjS311AaUXFIm_+$^Fi(7H09D^|q8);2dcHy%P738m^;NN+`A2?oG?1P>Zm zzj#p%i6boj1}qp?Pn+U=!-Z6av@Lf_%k;dbF$@8Vkt=bYUB352(SWe~Ccyj5P&1eb zQszwg-vb+FX=Meak?&u;y`3}iV(zdtnK@ieSC&c!6ancPuXiG+%3DX7g=6j z#tw}AVqH-9!@U$&mH_;d@ZZA2~{QNuyr~bB9+weJIg>gx93(2E`%WD8XJ zY#GuK#uN?>T|lWy!GXZa$~vmOm6Gx)+W*LtxkLN4GF-xNaf6SGhoApna*G5ZZejbr zi-dG}RaGF!x~pCOO80Ltg||6pCnpEb?C2y>8(it&I>%6l*5$DvynPap(H|lI6HF`} z6+mO&H#Gb(9;x{8Ont(5JkbIOxXoRv$H_!*2&s3(lBVtXpYz+lwd}bC!awKwS*GyF z+#*ZIRqumTkH$F^Ne;HuqxG=^ZvG71#<`ZFtw;B8v{ZC#xI4PC9ZY>P57$RrfBmsp z7W%5lnHi^71=Z}i^s3tCE9;Q)AS3TuuJcx3UX}f_sY06#lC8#PW(L0ee9Rj|XHqTo zq-E=vqlyjYTcG6l)A=Yh)itCOCDGdOpiS)0Z5$+?9OYWMi2?%d6qbH~44~Scj{g4e zK6P7sb_GS{yW4N`NFsA9r5=Z(jk#T%{=(fi77Q7GBBdh)s177zW%Q#1TMvyP2jKXB zzB$GKm_!>C9F0H&nF4S}x%9a#MP3E2K{ui;Q8OmmsV*0H5BFoldf^=fEt?Z`V=241 zRK{5mMEV?lTOov8b(~wbAX(J0_NGqqWTL*JPQPk$RpLdfRi&`PHpf--!Wl-)WnbQk z!<1)`PjYr_5I!FE0L^=A3LnUWZaJMO-@BkX{}L-wD>GX6xO?Xx-i6Q}#K@CL*H)&TaH(x(z{K1>-QR>jfSEGxg=>_C-!8)@CYF z5hyJzY_qLN=j%J3%`9SKs){tPfsPh&dRj0%gi5aPT>vpJ3wY-9-?KvW#gd$aojV?M z166(DtevR0mwT=n)>xTMR-MUkNqNS3aAI(H1Uaqyo8)ud6fy4ocfyG7NUuw5dx((p z+ed!?8&NT{19_M9D&bY0H&sfs@N!0!Z8j~ju7%Wj?$cKJq_O|b;@-@<_q8?yXJBwJ zk};T}zu&eFj8fB0UOXO+S!ro^yx365yO(a_Of!>f{UT}UU{ zrO^PfNCJmt^tQVCHP!jg5DLG)oE)_gjlUZrWa!&(`|n9WDMH)huZgr$6^OG6^6YEj z(S#{^{~9C~)JB!ch#dW4NDU`_JIoW842G?In$)IsgxFpm?JY(v#D{l^F z8?byu?Wfp9ufSp0gitNV2Pv(CA&>sh@G2s?Sg=FT%QD8UlI-G?_dE4zpxM6#;d}DlH+72|k-lE{(*Ug|@ew!kx1BLUTi{YZxP=N|*&H zl-vx=Y;3~1x-j)QYIW*D-?UpkrvRIFTw0v0rU#aY$2K)PJJ{t?v(qfSywZ4;$sqU` z+!J^K7CAYEeX>x61F;vKRM`5H$91BPplU?a0eK|SQKsP&!MQBG;r1S4sk;>HMIb&_ zRnwDzNN6-yIJBqsaDbzq9Z;LLo2>uq*>&zRcUBNdhvi1&9tIJ|j0Xm$B!#;G+6 zN&!dUIL_ZrZVB!n!yzMy7~c%{OO~Xk&9kZMyJc0$L?L?0h)6wg>&-HfO7&_FGFneE zActoZn?PE6W9OG8bV(3h-3X+HP^{z9g;Vy+fBu)s90pC2Oazv|Q_r54=>a3U*mlhy zm^HAI(ZjriD3Q;X#r&Yx_xNt0ahqi|m$3J%(b1dd$30@w$#gQRIJ5UF?6huz5M}l2 zyBRp5kN{gf$NHcLzMGIE3JLQTE-tTLy?O#d7tg;F9S{kLk3;rq%p0?tbZeD_>WbFr z^dKeGC>8DwsHqGAUXVq4iML_Cirdv$&>m5}>~-8m!c`Fx43w!E@&bpDr~1apcS{e! zjL4C!)tHCp_s`p?&RIbcr__h-$@?-hKc=#5JB#s>cj415pj};TP_P(n=@%ahs%(0 zP+*`B5_SlvPat)=*gEJNwH3`;2BVS`YUsN}om?Hume2TZYRAui$jf^T{gyBxKu|_8 zsYY2BuR-41ih$%bV*V7z?o~G~E}^zBUyRX6e|sn7C;y%Ly%gV4X~OqKg&#VwnK(G$ zJ%ZR2oa#1a&F!eJ(ii(3J41wUENOGnx%i9&O%x6Q#d&V zWt@y2xZXVUjGt;*ussKhur!iO{BPR?CNQww#+$D^<%rUMn^*lB`rvtfx5hX9s7XcD zj-Rgjkhr!+{Ml*2(IZGMz7tY)VcgG$x`1cB#wo;7ZRR?9qL&|#9Yse4BI$*pTHW*E zJ*d72lrna)LBL1vmoL*YQzPXLI{B>Te!ek;IC4eBA?P_Ghsz%n!$KdN1qZ>T0tbSL zm)A5#-Z_iTIjJ54tIo8}M#J#=>_b%lpX~l+)Yu=3OowY`cIqAXhHFwE^xG#TuhEEz zMD+C)Zk?Wh0fC-2A=wga{~^HtLOUNsNCB*6oV4A#cM?jK^O#cxem{6mc=-g6QOzXF%g?8(rx!vhdIx%>v+=6&9*DjKeyz3*c2B3=7hI&P8TxX)*VHT#I1pNWld18G`OLk+^MOp zzyAi*`WbWfzGyk5Y=J1`10-oV#&_EczAPiXM`{A+FAK)Iv|3O3*4C^9J^nDEzrF}1 zzRBMh1&ONg^B~as$z&8oBa__6qCmES8!N~~3&X^FpK-bv=+6r#Yd$1Wln6b=Ir+kM z_y4p2TH*NW>Uq;f8pn;`W^Xwex`O^#DK(8RAH%R-OApQM9?|F$Y>Ds}N42-35$Y^1 zbw&I+`g@np6{jM@rPXlSKXlbd(}xuXit&ZXr-}}^8S?V=oF3O1KBn&b3Q}15`DH_$ z8>D`Kfm}J3HHO*lu7Vd?c#&zfI5a!`{fjFT&-YH2?a=~B2Rj=FyL1?J{#0yr+cT>O zmbUs#4s(W4v2Qh77@Z7VKa29y&BgQR@)$Qb_&EZlWL_=7Uw74+zeN_9DkDx5RaSOZ z{n@GfExg;nHq(UD!ncZ(BR10Bo?Ga=?o3*#1YPQo@eaV|*J+zh@>c;@Sgi&M>x`$4 zIznCzG;uVYeLUgV?G_D65(iwt#7+O6gyQP6*-#{O;9;QZ@EgwOl2c=7XuzWb1*)8Q zl6aW5c6KL&R*yP9M5I(q+hZA6y}0dQ^<(c0_hQ?#FO5_pd4IL9D?uBD5*^=K8w1rq zJ{eX!zekt0O2=2l#80=;530Ke^p}v~UB?Xr4PCX`~7#oJ8EnU(9>m zM?&;qolBQ!pqfLC!D8t$NeZ$9?N z9mzx0>S_C4m9-|%wJ`1H4{3~ROMG1nvF7y+mU?qHtsA1p7mdgB6+dm;=2pDLi!e5^ zun5Y`WFzc~O;(hbH-qRx2!|N)`^VD)u;=n$?>qu|tW(2e3qWavgoHpF>t?VHw%t`| z{#-G-`fCI%0>VYZPzeg~JJ|-4?q44mZ8SK#iF6Z4bqd)zF;tc@5bZ5d(k7(QoQhWF zuECoCWu~;Ge=_X74H4(P1xixxEhVtS4ag4^lV0y6<%}GlmI9jz7XjP;AwgL0#^|ux z7jt_VODaeviRtekMB{w;5b13N4hxt8_`#JkJ1Toon9v6TkDrT692}`2?S}yOl9CdL z3AOwELWK~jG6JvfK}u5!154i9ywp#xsIe^r3qODUo`?ep*m7RRy_?+JyH=_Z8gIE=#dgN-j^K@^6N%Y2yHNF|JT z&tj_*Kd@QsDsUFvKYmv!Nb6zb0I`W61Q&mY2Q)`OaQ+qs`jdzEYF)J6h+`AqtYUNB z`}qXw+CcG9XQM$+@*qoccGv8vj-C{=TFb~Qsue`u=CE!){_1aVonInw%;YrZgxs~T zxIC}yb9Bje3E%21C{2YW^$DIrg+4d=e7TeAFv<#%xe4wHoEaxXasoe7U-6Pe!cr1xf8{;jc`li|74H_!q}6J~j* zB;c0|3l4^U@J20rc5OHI{#^Fd%LcXqplQd($C1)>@cSSZx_bZpJIAk` z!M9MZ22`>S!(^F_jI!3@Xv?4;*>le8!D9%g%&X?%O2IFwUP!BoXj zFksJEJ+lo_9m&Zl8-g=!d%c|SVqoPp&@*sSl<{fx9pc{#acPJoWgx{~au%Lywi94) z)a~sXHtDJj6zP{15ajKJb}q;u;5N0*AQHM!Co^2E&wL5bDI5v`eS+$w7K|mOr5%m} z^U5lakA(gViWiJer}pD}p#ru)CF3oWb<|QeL=An&aB0MG{@CI8RL!j9`;#BS!_YK~ zv^YURHXF*vSwT)sPSP*S`_I(WIxa7+DPXxH$2b**<~Wc_T!H|L$J#M-%0jGLPRF+#tc zo%hBG2)Y;j4S(Fj+Hyw3AcD)!Rg@Svf1RX~sDO2Nad!Lb)D*}&`R|UP0>1|XB{-i= zhpeKG?x<_L`(Qx=I!$CiJUltxRQ88V^9f9A%^vqxM;7G3LyPsv~KKq5kZQ4xW1 zI(h4eRS|pVK#bAm_M|&y<3un;m~osWtj?fffiHUu0Fdo%`}PZFZ1KRvNNQ|~rcF!G z5SW}M5=R6m!1-4dks?T1q@=s0XkruKvyJzO{Uc3lNYxy^OMQ&!!tU zm(Y`~K23O0_M|SBv>y!(-e;t|pUk($nLoVfCajWMUk*p=JhZfDsM_aR_o^Rx9PJ(E zT+L##|FP-UtrNj=-7{S-9U1O(V_LUOtJ!iJ(qiw#{Q>cjLg(m zf7iL_{I)Pf=t3)63FO9*O=|`pVY+pymk=!*u$8$BfgEe^`tNM8@u) zG=B^?{Z6Rov9lC&wGmUd<@>^Lxo4{w<#$gE)q1PwIbI4!blw(O+;Kh%d*$y;`wV`f z{kE5nLi3qHqSmQ?>t*p#2fU>9TV;(KR2%CHFxOeLt8w{a7EeH!-TSxHIq26Mb6Z+& z<&4CX^uG5R3&prYbVq!&A(iRI;K&2SHUu<^B1q^UCB!gqKJ{2%SNztJ+_JMpV@q_p zr@vGMcI%r{<#-G;f&!<}{J=zW+kRCK^rJMS^|<$J{>3$R_D1+(Wa5+5N(;PBlC-|h znZ?Oq)Xubln_tLngP)D~CWM)r8^6tgT@{Z01Pi@*9JFc};$u@%o~o(Q5fLT9{|s3> z?bFpejB8KhOBnC19bDp14jQGoXdU>C-Wd@aSgJAtLFzAZG8|1Fco%rh87Phz(1_av z_uO|*nOYtAS&0W$m5NA>so^SukkmO_9(2H8Ez>j7`+9r7?6~j*c$QMIW8~~e*rV<<8{)3ZC zox4fqRqq7`y+yZaAc5#+{jV;ptK=XSN#w=vmA&F}Zt%*5J7E@^OI67+`WAUDN;g(i zyH+6uFi?S{FrskS9Vd{Qme#iF0XYh>blhc3J6`8OFY-`b8j8{=os~i$KM5D+C6j?< z_R-49blE#81D>D3^LXRN4fy{d?i?rovl*uFzzJK(>i)*`QGT2k;!csB-!25NT(O)NoY=P4gFLuI4YaTS3qhy|VsT3$1EQ=?uVq*rKsB39JSl0#m z1)!a8KeFg122QTJy|ewr5)gsM+N-^kkjG*h8Aj7LO_&$oCcUJg%U8?QT{E=+ezqvk zaY8X2{6J_V0yk|xjPUXFDv+b^;J{vAUk|^Aw1~hte7kUXlSn_HX5|hyCF};dAre9C z=?OlB0bpctzT`8dvsp=B%jFsYy&UK$5;8I(7Iuv=JqLz|EddS+3c?I*``J(uFnJ?1 zA_Xb+|nyrwitS+=m35h|)pGT)okemrY&zdv@>7nw`IJM+4TWvUeGaDXo6VS9VK z4`FBtBwh_FoqhPg04277I?K?T3LjOz*H_Thh(Y^;Grjb-?{i@>K&2T){Vca&;Ei)# zhv~5s3{l&&Yz4|$`OVF9u|&_wx}*!nWxr5;S>#=tSasX~Dsg+iMP%VAHQw8T#*pu7 zrP8Rz#&|mQ3O9FT5Am=uBGF`cuW$XUv$3^bf>wqG>K=BC0aBa@IwRnY7iQ4|3Z3XCsZK&J41ulCkSRbc&<`2vzvd7+$U+n zRN>U=M!!UX7n8Tm85ZB5E=<^Ap~>08(y}{J;Cn)}KWjkUvC^*g>`&(@YwM5eUtVQE ze5UE68=jG(ukj4TxN?N?u#IbUAteA37?pA!DS`wEkbOJu{#onCnMGtR`d%j<9y_)) zVy!3|eDu~m;2U)klZSfkHe;0988Z*IZtdR~7pGsGQL0_5Ap{}tT^r3gYU}l2`Pqb1 zzVd4kU8eotcWkGn416g8sOI!NHU46qZynL!(;FVCQAHaX$QQ~ zRHX7O7Rd6K&`XhVa*IDB2}W#PJ!L3Nunt^gvs)pF3>JzyZ}NeBauD8yv~dz9eW=kZ z1z?q!cnuh)pY~SwSzCy{p#1Ls;#S%8bw)At+H2H=%HsO^An3aCd6YBy)2td9p)t-W zL_8vghdBtPT5fU9&KQ+XqKBgAErZ9eB%UZ`rVD5Z<;^u!q)`T%x`%=v?+Aw|;$f6% zvOQhoN4HD7TAC691eepyGnGh+Y%6eoPgmdXAKZPCOf>6A5}y0~^bfPQ zw|8oeQ5`MmuwW}8uOdjSE1VV{>FTEAOND*-AQesFWfm1^%;I-uK}5D><`vV^0UzDR zqN2`Cw|5`$52KTF-wN)Kp^OqM3j9`;g@_dhejf%4J2JCsi^^7hp}ira$r{fz2K~(0 z28{|8l@qoMu!#WWhdd9E^_Er}o#hn%{GhU_DDw4k{Dmeoc~AnK%P+;_#f$^ z*aBoi%Rnoyw{Kt`D)BykB^z-39u*HW3%N?`tj5R2>g|=``E_TgG1oq|NazJt#10Nrc;fuI{qy$m(79bzYr{S2VN))3 z0yx{+jPXJ`o`6+#Xh;!K=iV}LYZl|`M1Nfn`?8<+6yQT{3%dmJS|W`$79AD7q!+Dc zb3V&k3&yTC`$@ZZ9CogayC*^F>Wdc-5Lc|+%a@I5FKQ(-9AIf{`)Hm;ifO*KvI6Ee zNVXY#>KeO`yY_#F!-e`0Z7=u-z*+R#O*&Z%Rj|DX|0M`f)ioB! zKFELioV^5184zfpSj8CC61%7G{pUh0K(IqKpf2&lcK2@{But6*#q7Qz_!)DLS?@bI zI5ZtEMQr`%`mfs591`<^@^}5EUi`{EJ&W(qyV4hG_Y|65G07nj`w&D8CvNZTEXC94 zrYCR)yb4&bUQ*ON_Q?nkWEO>7q_)lR0wl|+1B!SIva&wqh<5ackIZJK7wIdRGJY*F z@|Dmn)r5nzih}DwxG=t4TzM?{Z&OEkm4Dx&87@;YS}CE_3G`XII3uj+=pWnaJI zNnE^!oWBQq2Lt8L^t5_@`@THczq;VM86lm^cDI*7j<$*xsXTshb9g0Mm6YbV!f}5|rmGoP}JKIp-_) z5q-_5_>%zGdO$%q4QU$?(f@5?k_HP_W*we=>PiMSa3I$Ub7E7 z)-JmVgYrQ<*#fHU2hn-wky(e7)Y#dXlcmPKIiJsFIKkN~+jQ5TFBk(?qQTh3rEfd@ z#3GZm$aZj7{y{SW!2|a7QTWfFKYKv4IH^n*;W9E5_AGNvN%E%{*Zgo6rqnLwKcqB` zw1}rqw<@LA8Cq!6S3ST-Wh5aTIadvKy-ASK_qapsT!Nd2TPth9 zE{mZkHyv{lHq?jrV*1`z+l(`Ua0%&i0`lr=IOrycb3IPs+LUJj+y6u(NS~ zi@(FZ+Va160A=9ibg~}Rg?+Tx*iJN5|0UsKLN}|Lj!xK+EoXK&ipc(D727~$bR<#& z_h;}^-%tFJpH0a||5(Y<8AbEywFy#V-7ij8SlkWn6LQl_z>H1s#TjM@sD})L!aR7W z6pTDY;Zok0FjL@M-1q`KM|2OiI(a-T;b3$Eu1E3;>9UqFhi?pua|U^Kb*q&5=GSclSWk zS3+?dsCRI6#r;pA6Fk28W%o8UHk!PA1n`NFnPyB(U-q3eF(*aY!GIm6HAw z+@C3B)fJp0KYv0J=mjHBCR2Fviiu;VH(;vpSt6lcj*cAfp5ZBu<9udRG&3>DZfWro z7LIf$6KVBJa#h`5&Mjhr!c@83w$4l9n-tPGw!GB!`ensvw{NRKr@VtAE<5`W z=w{&qEtk!mv8|~zdnyEkG8}hM=T#5d09a*H22O6~)TVwjhT9BMiNSS>pD`pyPn$7h zwLX$l0GBn419{hXSVowz(R6gu?B^PSfFD@gfB(*g%+KF=&ayf2Vo6bh2+^zBY$9x1 zbdOo)L^v&I0)~Xf%Ule?<3qb>IR(U=xI5S(5r3E8W~hcPj25;!B!?18njrbrO{_Q{ zL)*%#pf8imKRPtf8m(yj`Pj#z5>v>2Gq;b6I{<=RunYhqsbP>K>jpWB zyu9BaJJhtjo#F+^L%wPk7Q7q zBBbM$7^xB^+J9u!KRau8xGKjt>3QhJpOxt9@{;GzpPpd>+zE;$A29)v2#cCGz_ieTU%>?m z4(VmzgOTHO-aCGmA?>eYM3*?|auzGvmi!@K(`d7P(hXPj4K}m{}72#-r}8V%qb}^&x4Em z7p9xLQBBWRx?6WsT2J3xF5dP}y>`zt;I{9EL?R&xxiNMIO%PmUX{n?It*tTpVJ?uF zG=wrE^SJCJkq91i<8OO3Ue}H-A$TtNpV|O2s?Nu+ zj+Bozec(V3e8mZ_k$iPiGy=}M7b#yYym4_{oEF#b5WnG|H~dEIpxCF5-elbSkSW~$ z*Xz8^sU45cj?;3m!n6=kl@{opY_(q635y7yEQ6X)hPW+p6ema=2TU^~>v^r^NSw>V z{b`Jw{KdG;EOrFwCo;Kjitf%C09=5`I8w$f0+$umSFm_GHyduH-LfL*$)t zD7;jaS6}@4`#+}-8dW-WYrlE`3$TU;6eFzEOd93^ZVFk2#3Uq03mS~@D1bu)S%7d1 zp3s~nCsQM+4NCX<`KS1=Tlws*Hni5bZK*y1P9Qw@t1IOo) zhy_R5$zjB6x;)*2Qo}TyfLtcveg`1tY+ALU%lt`bC0e&043}{Csx)r~Ft5ATtf-xP zH>aE19+Y>J%8v@ELAxPF-t|gWBTj*A8pppuANC<|EE|Ryq`E`RgT`aDlVsQQ>H*_x zGXJ} zmtF;=<{^~|;PL}Z1L^#w2hk*GrVhFu_{G8OCZwY3H6c`dzsbJ}JOHi;9FtdHKb;u% zdv|vop&LQzWQittqVTdf=q;hd|3f}NqH1g91h@-3dlZm;OcA{Zje=xpLoWQ_$jCdU zB3Zk8H!v%var*ZW2564%@T!32>v+N1#5NRA+znj>QsI68KWM`GkU~Z(KLX z;mW^$IMQDJh>2rfk4Op?RkUB1kln}C{ihZ;U1Tl`Q>!vDw+#D7xTz=3*JJkcs&S zPdT@MKo5B4AQ}sj$I{v8x%x`q?6$VyxJ*nWZU2}MfAYj6u~6R_I9{Yh4ZhIx%g5rT z5j3Gk|EC3D%3dAJWe8lPxD~>@yYajsHm}742Ztm96|if8i-r|XX#=aWGWs-KBQ2yL z0VzaXKYG`DLo*{Ox|$LZQ1FRb@V9;}N~bpSs5w!NmN4Z`Vqjo^+YC`iZ zo(W!!@d-nXr*6j!Ub;ZIrRGhv4D@`=b#=5&zopzNL0rtKrXZ=M!5@ z5D`57zJI0?$#1Hqp#cX&&p8-hQf>l$8C(x(eQu9llzUMfi!kaA+Ycv6hE?u!Ddh+c{rviN zGY@`x9a@0DXt1E7nhIeOaJV;a93Vsl;4mPwNErxQpn3}m@Xw!luy`^{7$jxuB&i zdo9_rT7~Dogmqk$gP@4W$Y@eKwW+B=Ii7TV2sv_#oKpr zjXXrsi|$6r>1+1Kmwlhg??@X5x%NLc*Xn8+4{}k_VEW_pB~{*Tyu6w<>nt6udNNjB zH8VQo=oFgv&V+?^xaq2_Mu+9Zk7@36(2SG+16ZIDh_SM=(%M%oqPv42*E6k4G1)>+ zjvxFpgWpSMs0%mQy3NaMApbkt1ZfQ-r-WNY7L~mP@Ob_ z-=3)T!*+TLW;kle@Wj7>c&igm3?7&H(I#laFr*%#8lH zQgUAIJED&aRS46Pl9HG<6A)R}(frvHWcsz+Vg{Zk5VQ#^^nK&CtZC_KSs4{{QYz+G zExtf|bemRw{ox%C^R&nB5~Sxluw8uYp-pf2;Q1`Y>(}ddA%7cC9GHtT+Cb;b1+T{T zOfwSB0xaal_Am3d{sHnS9BJG+flP0iZWI-fk$j|Ia(St}U+N4rVtia25(H;W?@g&h zi_c*5;|(jl=co6b=^lSEW*=;mTk~$03O5w!a|M^s`KQHF; zI*24>a(e+ffe$+|(cTioEpC53fXV9!yL11z?a2QzWb;H+jnx}Co~wkVXuGt7$XP+Z zQP)F7Pb-2c6vpi5FhZh#B#o>5Q33*o_U9O&t{<|LQu&5qMeQNQz*aGpW48R3QLbMu zH#DMZs83n}Qfw6$?TgM$n!~X{bzK7s2f= zIHmq6Y{sz>H)o`0K`#9{^+p zp!2?sN2v?U1Kfa)Hy!k|K0H}T0O~mXdU5KuX(Xn6Jbj5~F|#ij^jyiy!{q@XS{+bK zCJTx3K}_KkVt(N2@Xv;T<-uCXO@=veaXaj_Yi0%i3rNai3zYvfR%QrkWf&1B^9BXN`76YacO*w!a$Ry|6@(}5*1%{jSvv@yhc)>@;iU%;&M#JSA@&Tpvh>4!NCt1Gl~{c3?M_Y zG)p+yl|pSC8V+{~0we?gNTAjpPkh5D{9rW0`x+uMMhdGUdv=~oy8HN1f#TmmueQ?Z z>JiL$ijN0Q4%fYwhXi6R?zWEjr)ABw3-7xg&>D#5q+Aft)l=Ag`sz+uI}OU5j7v$zf1_riU`{Z(pwIV9KyA%|>A57wV=;o=arKd{-R#sKj)FgZzDB<=X$nX$Z zbS4eyXbT!ufq!+AeEU8rwxQ!^oonBiH?;m8^36?M5zVk#+dAgf)lHdKkE%zF-poTT z3D9N&FM23Px22?~`1G>kco={ZAR85o z9#Gep@wW0!HB&zhU>)QFj_)0xvP06Y`RWRAtJqQuZl(O>emPLjq6FPRX_@Kb+Ge{S zwY1kOeZp7Cel5T_1>pCuE%MxhB&_OJ6D(^Jp&EA*>_ z2UqR&t`d`9;@vKmq1HlE*3{L8Sy54h84fH`9BxqZ9UsGL=n8*Go{exky=jdu{3oRA z2$oAg`w#&(97p^6VeZ3A}^Ox}A0#cwszY1JRUuE6DL0VMGD zTyu}Pn+6e4MC^NMYVEQcp@%QEDs+LYi^i~=fTt8NWP+*c)v)gcayO^12LO;kc;jx>fM&7R_g$!r00N-2xEBxR)Ggsn zn=}lG?u+%K6Cv+yK~TDSHp`Dn-_jeKCyYNRu>E$VfiD?1lp)}{@m(*@o;I*6aLy6* zLgSMQJ%!&jeIEI@U*gNMZOCc%ng1N=AIvSR4+AYGROH~u)`dn=-+%`O#z5Fo@=NSY z4e9%OTH7zoqWFt@hOrcRQuzl4YF#&CRjxu;=gf81zA;O9_&k5!f4p6X)|hXn^*4sk zfX7uPPzvG-`v>}wHjcqYN3WFqBU(w?8}an?nHMSKMw+Zy@OL5!eS3(56K@JCuwl-C z^(5C$cu|J*2_A^a5W)w(##w9aTUZsL-;JzWe49O){+q^BiJNar;cM_bSKuf}aPFkm zgozoFt!H+Az6-gx^y=C@>bV3<7Q@msxi3}yGv73DBbc0B{-BjNd!(MEO}{y-E-nax z)TBEq-`=m0b;NL@s%V8C9_=i2G#|~&KeZBposJDahLS`50RuWYTECoyKYceN1oksp zy&k|-j4(=oBN+ryU{!NyYimn_P9OaAmXXXiOyhsdTM)nwjlhmi7asPvFQJ8(;9+BF zqV{Ud8BN}dt02(AGU*L|gh(Lxd-= zw&pzZP9o8sV{NK3ujyoM^o={ji#bG9y#~c6gfXnGy%wnc^r=(X|3Iy~r$@`To8@sP zhd$q>Zp~FZNMNXYmt6>Ou#h*4mwrEyQ|x>+rjAoMykima)zow}q$GUl03(M)MZljx zBlwh%fkU5kb$j}j-{~^d_}qj;pqy!ldP(m+v4DoM3^p<1w)PPJvkpdy$B~sxX+-Cf zxOlbmm}bLfY(HZ>RwxCX@4%G}nTak-o!5(sijLO=T4god`O3>7|XI?7^@lxj6u8yg$UW0`S(&wn0AqiInBK0^)VHXSrg$CSU5YYr|6hicX z?gmIBIAW;rI2#_j%_&58y`XV|EH%V#jDGDFs2C8C%;<8}2(pTyPbaYL?e*bL)AlO1 z=GUcEAQM01cy8gs07`$mK{Aco_f*jg`t4yw;NjwWHM3(0OFb}n@H100GI&sBxUSEw zn0o^d0&a}4F;&p|L9Z8NCHg#CC_1U<^bUjV4JL9xfr`zq(`QUPoV*2d41A=pJ1JPE zXoDiqjFLX^WL>+bwz7=RhxP`1gt z-i#6bM;gck%{rpJh?ja?Sxiw&iv&SrKw|{$1qj~<8D3RB^>`HMu`J<%OyNGOtVWBM zXS+}1=|Ml&gY>8gQsn3624*-mgn{i?EnY5p6{9bnwe*@!GCmvHJkbOHqZj@?kV+~> zGr$cGZbO4Gf;IqW1l}cRIo@9z6%acAwK(u1o{9dUYty!?!WbW8c@kPDD4qePc3*oJ zKkT3q`YITwe=qRA9Nd1$5$)|CW*k~>qs7L#^$&R`$NeKD;a9l@1JOz6{YP!Pe%qjj zzU>%7E~ORAHr8+%kc;oYQNjJyKf2uaV(WY(M2z=0g_O>rS2+>hdc}`eBJ}g@gshHB z^fLs?v^Lc?)YbS>{i6h6D!?_I?)lzX2)`{AHTLo9ex2R?Ef6zQrmEH!<FmS^FVRmr+1f!_GQE7)u^8E{hKkhlIXaq5mJ##YPd)xh z@>tV6Z_25%#B@Jll{1&gv{ne}Bp2;_bnf81P`uon!RQR5)pp>ACtn)U;z3_Yi!I&u z65cWJf5A8Kl=@dOBf6UDGQOEjWf(z_l+?DpJrqLSC}v9EPbb8@IjAt={CSxTMDS+Q zTLye$lO1@Z(fBNfYBB>unLk)$S6_L(z>6QN20))iBG4i#n1$Cq|-vv+w;vC z=|y0JaK#RmkRGKz^#KwG=XT83xw$ToAhf-WyDw)*1A@y`g-fM^ zn_y-i*{lUg{v?_|WW!XIF-vSjocrd{O1GhgU4%vX1U`X6JoaT3mon~>H0>E6* zWtm@Ta$l)nys02zKW_{5{r^YPcL!qGzJE&;vZ*9l-S)^H*(-bRJ+k+nA(EMdkX;H< zw(OA=vO@OC&Q7w|dtA@={XKs^i|+fn&ht1vGs(5Rw*vrnWVQ^Qw-7813#M`s9T*sZ zF*|f+#TewUFX#6MGc0*x zJlc@J)A5Gd*Ffz6qy|eW94wX+C(rXbz)~i!^zAFz z%O!QuKOqEAKPIDu%?7c^6_Yu5`DKM+ue6@lO@FMdsp*Ql+)=&L$YI|rK`kf!(yW3! zp&0&@l~v@M!8i79IIP6|Cyap;;&h~2vmn~yB)2e+IvO2tV&S7-JAVVR&jetEt=W9k zw`%{iM(>Q=0qu)Hk&>#?(8P$0jckO(XXx)3q<8K_oqiE_TwE+;k``O)gNEHv7)^Z9O3E}GlU$IEy);Wl+q znoh-?)mI}O9PNMoYI%l%&hq4RYL1>z+f}cqF25+%l(_5-4nL?AkrSrjOxVECP!Qzp z%rdEW@gw(6&n>MjpUN!mb~bk*9M13GSWx*&wK^&l(bdy){}%y=Fqe`w|wreJVz`Tk8me`iiS>xT#gvUbhminaf@|zeEXee^*P_)RGsV)C% zw+=fq0|c)=?MonL_;yHfugv^=*#`}Y!LTmK-WCD zcvvv?pMHiFAuAGuD#x*NM|c;jmuK1D=)9M)zNb&m2Fz0ZFU5jaF)CgYGCb_XZqYJm zu{9nsm=u~E)Jg)pgGiD7ztPM_mI3atjt&_U=#lHs5{fBC3^ItY2=0z?V1eK^?a^fi zUw&8An93i>!k?@vOs0!v?dFTz@vis#S0)RDE)50#UaR5*_%-DiNx8J2ORx3gxG9nh zah~Z-t zj=#Hc!4xv;$j^pW0T93aaUe|C)bpE0kks(@{qSVEgn-!u`wIOpyA+M2t5 zfha%>4S_?>oD#BgwEa-|`85)OqoH9z;#_1mReO8~_|{tgeP%!h5X%*$rc7B>TF+cd zGfcCanfwl^d4s%}17drAAWKrAjTa}qSLJT$;lT~TO0SDB%)T+)De3I_*UOW@$SKI% zEq;k+l6|{*PL;z}Mbgj#{95qoK~V0nrRs5VtMa7%Nw<%PJOr}`pD_f#K&9g3BWUOG zWbU; z3qD6^H6V)V7>5rW`k^1G@DsC1PAVK~j(OpVw3#p$o$)a)$@fpM9V3W!To$mj#?fPFTsIg$vDYfdc1|63I`0rrZwh4ducdMy+c+E0M zRQ#~R`C7y^CoZFvpvJ=upWuC1s*wN!FkwW;L^Cq>GQ`Vqz&xWmKv!(E#t|=fN0vb$jO!}u zfE)b~6F@+Jeg=BAqBqp?rC}Tv%2St>VFF+S0Me?c$PjdZU()ZW=Nwod2WRnTLtQC|UUnG$+ybG~yS{{BhL%6g zIKILX0gn>suKGdwsgnPMVAWxst?x1|58|v7P~|>5q7Yl=I5iIe2mwF#7CM}PYOG+* zbE$?29_T})1Qqs7(2l_ds+i*cduxmCR?Os~d+qZ2`teqFUCXaMKk)EB@Y?tCHSV7p zk4ShvHRJ4O?Cfc5lec?Nj}3e`Z*8yFY>fW-=b-5sx=a*rgwapMZR@p@kUDRIH;=t9O{93xCFOf_qz zp_xwX8jPw?k6&5Us^Kp;tpR!UZ4Y{$?&#%b2CTdGjmPCd(X5#vp9rrXrhY zLjXi*;$&d z-4nh%+hfVfhF11j2^?`b7Ypeh712Q-dX+92M4P)ZiNh)+ZrIW#mzo(dK<3T4J|G97UU- zOLx{3N zV#d_7(^PCT{kP56C8tEr8qBA2IX%Y?o4LO>!svsI4l$Uv%qDTSmDNGb+|cmEduJk+ zQSpV*-TA-EJx?|lsTN^Fq5@?F969V>rVFjlZ#0}Grqn(;=7M-yK$CZm7URGZr2q(@ z%0zcxcRB)Y!C@bCHWUYU6G&k9&WCiEVNQazp3?v5-qO+$Fh;9i##Bm634IkIf;EIV zP8QrJNHZ(Kd8?_JsiF*?hvqUaAD#|+&0Gt0o~|)Bv`Aa`vUb}AO*5d3$LZj> zF|Cd=&a-;qhD<%hYA7YBc-!CiLIS`{=ft7O`liEor`ofxt?0wUi5Q_0&M#wOCU5VE zxh+qh__6S1TGlTpK7e=RwWR?0d~S+~g}XbkIw{exg7qyzb7BJ?inS;_by6s7qW=;2 z?>*Hr%q(Eo58AyQ93MdyMAkevu(X6KX*yv>5YaNd7smD82z~{X*)0&n$u9X$&HrI* zWn6D}w|plS9vHqm7v~G|vnFcRv z;sqXMBt-;?Qsna+h<>&bR#%Wk6#GaXMGTB=&L9??L?CD-At6yxdNB;1iScnfI4^g` zpB}BE+9!s&LL-Nn?qkt9PjtiF0=OGeW<*(1gl?hlY%ov-OYhE}ript0LH`zz6+lL0x`q}_h+onR%BpP((zEw_Er$Z_Qq$Lp0Z|9T zx^Ii}=@>J$jfsGZM#BFRAi*-*7u^N&kPoxAwMLhuz$q;3NK7>RK|uR*?O+B5qfZWA z=ME+lc<+<0=H?XugR7~dgUrJa^xLtx`(Z2b^FtkT%cX}<`}4x6Ir>%A=cBHY%ZI9B z=RD=8``G9Y-`*`ubt&7_)5o8*$}s2o^`8Oq@@!Qumy|f_XA!xgHqj98psHe|rY2M2 zC*_g#Z{HqyDpzAq73Q!zpuD}jAoaO(bMv!cW`<~RWI_R9(X^A~fz3@5-x!E7&ZEJh zh5HWl%#-`i3JZ+ty<@ra2V6b=<`sNo@9v?matSbLlKtvQhxU*%4*I4fV5o(n8j$`k z?2;v*?z2u1D5if*mi*HZv!c&?E4D~as=+v{Cj7)7)=LRL8O$i(jMf}<&|?V%UkF1d zF0dztci2gBCTzIwe&uuyB+yUx`@72khhQtAQma1TD%4_B>d9Lb>Z&dTdmej7XQDsp z)>RJ`BZocv=-YVtcoIxsxg-)(;9u7*FVFhrD1f5$0pV3aPpMF)R$3C z;`!`#LTKgtrwMZI@Yu2g^en>dG&(BKyAt`#s_>ahGNG=iX(xbY`W1P^K&f{uKr;^w z7XGbU=tecJ^OQ;RL3QW8bAl_%#0w~iw*XXh&K{F_rLPMFuJ9m7#f=s-gD=KSi+-eU zVGDz@3w3Sn4iM@Kz%&Hlgo_XjK6NTj61p+_ZIhA+=&e@K>GyAb2y?>+0qesPnWIDh(Jo9LfEkK{I03Nk>A3u`m zC&QDT_i2MRFtBmuhs}wgDt#i0-gq&e)&W`t)1Oy6*UR-Mj!6=OrgQE`wcLLp6kQfBx zt`*qL`Yz(Jn>INnVil2l(>)(a!g5RHeZ`2=zK9L~4n$zPE_D(8-BY%3`ZKp3TcJ(N_myL)6F6|ZvnQ5H8ii$_} zJ&aR7Y<<&hby2e6i#j_)7d@N5Y?l=~*;pYo^cOb;kY*>3@HT$<5mFO>c`4g{rS_=I1V~$Lz&#G<#k{SB-v$2FJ3c2I3&_qx@Y~PRHK>7seo2dhx8}8EdyBE0& zP=M{h{m;AWL_<FYN+_&!c7NDrfWQVg48e?*6YyF<@DGlAiB9^|= z_5zzGL+(krlqchlD9lR!2=*3wqn2Ij+8g)*%e7O7K3k? zuB^MygRmPj^r*pvR7Pf4OIVZ&$;0B|gW0v?WPbye6sVwP9@YA@m=e?r=sAOlkc1hH zS;EsHo$PYWN3SwIuE`tkwa#eNbGf|qd-t5D)QpaU`;R~}9qz`em$DQ;t`WN?O;@?7 z5q{1Lo?3l?6wStJ%C+9y;ARYJFlPL8Dtx>(`31SxK!J#8h}aPYc$Vz&ajE zJ-%*ybNMEP{~yAj>}UU*It+VLf zvoJg72>tp(!hk#oIjDC9%+Wau?zM!{Ey)~w*+eZ_D?Q!aNL&b1YV9pQ2)?7AjJS9q zDv~-jHWnPGZd;SQCjM)5hz)lth=HF!1qv)cVD)Tn2YgHMFh{tbpLn&-mpYx=8ep`; zw*)wYJA~KF?!NSSm7T2$Ax7@*Trm{Z@f%8ndJy%@0o@pb?`74sN2)?!S)~H{M)~BA z1h~fS`Egxl8|(}>vjp7GIi0Lf@(F=+y-fIto+%pImipx*xVRC1GqH5>I?8k$xS8-8 zQ~Lkr*xI^xc6fPl3J&x-FJ2^0{qJ8$C?AC!!Eb52Nnovp9_l~GN+Uv$Q9=Di=RrB^ z#3>DVY`hXZjKhf65OiozHCpTK6!uBC1euDKdp*knZ>TlO98_HNzc3HKcin5IE81an z?ryk*iAh$Viq#UVBZ)yK1R&M_Xdewl9`nFaKzuNaT!=^t z*izg!J-+!J_gY7~XRWQ0Fk(XK2eeB5Iy_a^PJ#`>4QfcxAlv~d{RT%ZpoUXADmoS2 z(GTjJ(KE9umyR+=;TN2Pg4?5*=A#?vR}!UdmzC5BnOK>ZV3uA05j%*w=iO_`8b!aC zEp{FqR5wG05b5#paeEGD4)*Y0B_)#TqUp67Wuj(<7l!|hWWp4Tcv97i6*4QT@EEJh zxvHtD$=TU4!3_cDhzvj{aG%JvSK9Of0DddR9iG4bERjx#^cT%epF1gBHrD;4p>0}gKP$72a~QZ-KR z_f@hTo(m-hHmMR2NiWIX(b@FZqSxAZi?au z@R%!KL#~1#uC%7ccFcp{Wp=53mqbZLIfvOgFrfL=RGDSi(5snR;N$1dIdJdqZ#ew% zZK&>7EkH5M33PvP(AC$&`urAmRa}~yJO&}9C4#O1-c#vQsi~zW&6O&xtDXLpo1b6S z$AthgykLR*S^1Fm%~elw|K!PO)q5nKc+k88VIFYSd^RKG1zD zBTTvaEmj=>M;l+?ac3^;Abj&wnc;Q6%`Im}Jt=>1IypMqTf_PKIw^$+7o%dGsf}av z#EI$Mckcwb#TVtn@))H3Z;Okw zqNCkG&bsEg08zvMP~CozHrk!6d{h)*kI!?%M{R9@Vxh7r4p3X*Tr!2cHNdYrumc&t z(2|FRDFw_U7msjQg2qw%&LuyhGc6Gie!{Rkm+LzWk&T&jF88a;FU}vFP5IamEhJlLH>R8(b+eSbW&Y0PHRdQe z{oPNB@LgS98dOB9K{`JOCj~uLaHFJKQ2`%{*4Y~D^)EaFAb}rF800QXgMNjfT<5Id zi&I7g`#Uu3iR0#Eb$vHWO$-$d^~Q8ctl(w+$^Y~H2jlmwW4t6AT#ip9KrC2>mGZz; zrT(4r6uV8grF(a(v>s7#`A(;C|AW!}hOL3i7h7}MlGDgg+t|3On@GqoN87%3C#+^$ zQ9s^%ZO{7%xksIHA!8-@D1wUZegm7=TSL3Ao$DT-(!Mt}o+3QNGpT2YXT66)ZQJLq z+r*x(j)~O=Qf}&iX=kWAJA_-i;TcHAKwr4%nTC3&#Vlj9>YXzv=TANy(X*WM@grf$ zm@K5Qf&|CWX##<|K_LasO|Wp56O3Lv2vHd3SwX)6wUWTxM0GBFcuiWM6%DzdC4om{ zuxY(1VqD$zbu8F{YZnGJ*MH;KU`&gYQD!03Y^294bRfrXDNWR*|KoVi6H}rpu{1Z@ zj9!B?5KU_+%D^c3U+-P&ndR_?FJU#gJsQ`+Fb15EN@Sf$eD6Yc71;Q6reDeBprW}r#91zwB zZCF4K!u-MhX%LN`sef_zm*+zO;sEv-8X4(;)Nkbsa7Uwvv4KcA`qX^Ff;d#C-X6e| zZtG}EPl3G`cljp{+Qllc;(P5R<(uekvf@~zz4&M&B6lkaGJK)wlN>R*yScd;$d^I5 zkwfA!$OYb{8=EbiV2Pyo*NFOOs`+vT1dpHgYLN|l-cu)ZWLn5=M?vNTr9Is_t5BxO zaF)8JA6VTPnV0}+WXTXd4sWd1meH3e+qw0dS)Le-VTc-O1?fnIBb!g~4-zSanBw6O zdkkr)2#LO5v|%#Uf4&641h7pYdR#bKp)a%VfBo734teaa z|L3VidLw>=QzCZI?P5D1Se8db-^tXlr82dn%lW4~y1ufDjQUXGzKYPRso~T+W^bq? zz31=C)52hZc#%QtkEAKUTU=hQ0avrr&|3y&ixDrph&Gf7vqCgvZGeQFILdWz1r_oY zq8KzW&~F&k{cP*%g237pM~*&-dkR}}#nR_g8~eh#knT6295W_|g3i8ILnM-q9@1D5 z&u?RJ-3gaha{@dOqO<^bHH>9T?8-PMPs@u>Oq2qk4iS_7*X)5*?!rLfwgq+H0L`5G z`!$+a>RX$eheTl~Vr9sofRlh6t~@(f%#pH1`2C&Ujw~LGA2^ozLJe>WaD7PhgT4K? zN_t*g;$4i(mEF!7?=5nG{($x<1%CqoZzYWfY058*nfUeQN+4JkrcqE20M`wlD+v|` zBS?ZkQviS(Ff}A3)@=dK&M)DWhwA~*e=aA75cmVm?KDTMWUHVoR{p?`9cwzkYl0+r z4iVm1^Jxt?;|gm$%D4jOkIc-N&oLpJw$yve05*OAE}pCmh_(Gb0`GyL{i);c6E2JY z&MxGb-gAB1TU9YSq|iW&iFpjr;lx#OooTJtq(Q;>Oms3Jd4NX-3Zf9>rbYoN)ya>D zqpu|w*Poa?P?3Lh{Y5?DLUJH8-o=VbQ{QU#u`qymfNwibnBIMeHIxv>#`I04RqjILhh>Th?e+IWRJKD#LK8uBK&a5PkRt$9&#(oW6~%=;~}j{oe;K z2yHU^;0PGeLaAb;2YZUC6;J*a4@1YGx)~R^)wwuqgwRCVj~atK-#ue>H9B z%9v;hybdo)+v;9987@r}aRRF)u7zbovNQhP(UaORNr}3;`r4u3=WzIW{P{{7IbCt{ z^qgoxOGbiFCXM{RSY_UgF{q(YCw(r5>V-&`VK2*{6s3k1cbI6WTe*g8R-wpv9L_Gb zbVClFdvsRl%ixle(FJ1kQe3RXjIUe8(B94`<=l#?0Xyd@Yd7M22Lgp8uCq;y*UK|!0!l!VQR*&vm5 zqTc2KWl03UO3=r>faN;^+iXG$(1 zFmBb>>Zc1(;YaK+1s4-9%+7{~KJSRi`3iYX6GPLXD8-M_3Mg_KhR&3IM?ipVCUWnF zx4o?nCD`d^!(>eBSKR#;)ClK2SnE#1Xh1GsDV?K_pGo zVs5!CIK#16yFB}2VnQB-6y+h!^&RGY9GQ>cs6pZ`LGHkJr~ie#;_koA^NrUSh6P{X zx4n9u3I;N&e9cD*R(bi>$~OmC8iBCVkmubHG**aA#0Y_R*Ia@Io{jOc!0Ye{LY-aV zN4^U_H;+)H>(R;#ss^))$42Uz7uY(U{PSFdkYiGrmW};E2ws5P{2}HFjma!y8^FaO zsU51AhEOpZb+J7&ij9y)RL&vzUwky_&D*Jh4c3iLQ+WlDh3)z;={;->lU~uRF|ZKs z?#2aX9GDgpd_#&4%JZ+-<2i>hG-VPyn2@hFn-)N@eKjPL;5o_%kd-Va59XQ13|Ys z3gC>F2lyb)4Cn9coI9U61cpa?_#f*=v!lt^@2i@enPOJ*d2sbUyG~HHC^|QBs%cx|Hs14{`2s*k(|b^s}HE4ZBq!VIXJ+F zd3+b*C+_zQ-J9E2i5{zaSK%{Yf=?kJ4lnK;#Duy<`nY{)FqJftUn76q10{VM#ybmt z=G!o?=CQQ{4WbB+MAP$)X6T5#m}x%6ymmd}kKg$n?62bdJksjo>RQlJC1@fBjg!BB z(NtAAgKEhGz8M&-A*DnxzHki$ISIGUf*M3!ZtcFOZhi_`2^l#Hvfq)bgs(^7$`)Ski5)^VBb3f*Pkn5g@b1oJjxiJtUwkk8dnQdU7;ctq|6 zm38rQC;+uLr|RRXs`%iBkd33XGIK@KPjDKVEmy8Ve``B)HAVpTw@08V*J}<6OvCtK z8E?ZHgQh&}*h3dX3Lvf$FOS5pvQElH-JoUNBY42Xg()G7_?LIU?&+EE$@qH!kC1%n z-AU~JEWsZ5!8A-|?hvW_nc8yz&YHZ%xBm<{L~fN%ub6lpf&cb+!0 zu%HbrQEH82?9yirj@Khqf9=@8Fr$-OpL>lF2R+9!;bBpZTIt~g+lT;K+>|m0DJ?($ z7%MF=o;D}l0|y5Ocz&ti3xI^F*YGMU*5zX5=r7T$S6+eV8}O5P{-8zv-~Y=LfOxry zx37yggwOvCBdsssS|@_4v*YEIdvvmC&&Q)5R~aQDP$>Eu8Bpc5A`~uyp~7jQXJeJupfd9mZZz zP9jq@WMcp;05i&Pv?Vbzh{rW=VDC)~XjQwuNk~sU)g>(}QiiYTf(M%=xr&Y}%Cd*; z8khE%rG8Zi`whnmxrS7?Zx2}!Et+n16lnep4EP`oOA3Z0s4@)=m7Eg&7VVV7_|A@b zx5jRQJVs{tyB+7s>gt_rG8+*=;vTLk)*9&GA*+40gx;&Ct8BW}1Jt+_NAX}ug$yy})eA)&~db%&0TGMzPu)?lL=@Xv3Y^*&(nNxIJdYl80;CEm zkAJ4MlFUg9^RkrlDYK`FU5fa@@^n@N3VL3@6rf$zMD*l4=fyu&u?~3llqYq+ymlHu zvu@*Jah_wKQMuJ;P}1-@<7GcSh%f)th%nk|yJb&F(Z+KmnFfjy7oZ@g#M5-s+TVIo zr@l1J&;Q!*qvYwNV0y`nqCXbXf>g!-PHw5y=egs7Aq*5ocr7%pf&U)D@QYBXuxX_0 zy*>^~&2B3+-8nknF3)BwkI5|@0g5X?RtWR>So%HZPc7zj!iePDbsOTW-j**=i#0Se ztVm5*vwz2_r-v@KXG%Yh{BVvMen2iv$*^b|=30UImqoYu2Y~OOwalo}F@$_n+;Ybt zsG}Zl4B&@=b(k)1S+D-^ni2Kr?;YR-Nq&;Vu%zeOIp207;dSb6Vg&_rhYg*B?FmJ| zJ!9r&>b;vp-7`H_2Ow)aGQ+LO0}DSOW4ZG7teJput?H)BD(t=So1-VdhR!W<<&Do$)DJ8_sv1gVv zcsE1wsFv3+yCB1IJK}We#%OKL`}dik-6xLei0pjaRX#j>7v6W}sl|`_(P)RK7)7M2 zmjzgE2Yc^rNETQ(`#E|=3{4F?X9EL3sSou8gY7)dD&>SYw9&NiyTZl;uHYdX&gX-J zcM-kj#+dBTRlkLE>7V=)YDW|F?RUaMSQR4^#BF4+7fn^gXQ!ml4|jbmG_Su43*rd< z`1JOjFIY%8k*BwFKG>I^7E}&do0?`Thc8lQ?F0HTWq6tTEEmbHGH(mtC%t`ZVqH%q zf3Iry(mPB*o6~I%%ue7|{oVNUaebLIZTySy^`bKbn}pXLzQ~#x6CUM?^zta_&~3$; z3^AW9;DCgkv(JxZTIIQB;q>;HXkVa9N``LU1yhnD~?Vu_#(sZm>efHxzgak!=88{ z?8Syt;Ub`xgLOqo@HAPJkwy8UOOP@$vs%E-QL))5$sxbFvEM^pN+-|Kv z6B4AiR*pF2tc5trr~`_h2kGDt#Na7vd`Gj^L5wCgS6_J)_JZHjv)##khMOVL4Z_3T z)&G;mX)q0UND$K{6x4{28SCqJ!;vlz(Si{u`2!PfPYzri)VH;|=vS2GgI+h;W^|8d zeX>_o;kAA9CPQiLb}^lOKWH`%OR z^s_lVP@(kwbp=r7V~}~xmJ8H+!oOpa8Hg|D`36#N{QU!tE)JW63BqdXMS>Mc+f=i+ zxT0}xtTlN?L0WA+a)0}>0(7LH7*)u}*^08n(yy`&Mavmc8uWY}Cf}u@)sgY^udkr% zFSLEUeL$;B&N^?C-K`IS?m-ec4u)dxC>F#(?|WFEjY`rG3_RgM6wddAS(EGD-35%z zx#W68TO}1U7?0n-Peh`uoM#MB@>NMbAQvfk4ME6WaQW~0hFUV$ZlcTFM>_1||6SVH z*hF{2=6Os|a1w)b-MO3bT}14jmP>gDP$9blla08mA3emUk|o6FaH%zlDAS z36DfV0Im~=bir^2)6&N@1s-CM31vS9O&mZ(@CK4Ka@wojHb~eAwWa+2sjv_Xclov; z*@piBr1|E~&ix0rVnGW6kNLm(f?OZ28CvqFzrZ|xWf$GXR5MbDHf#?@wQK+nvj+=G@V?kHH?)ou3v8ZY{SEWHv_5f@0p_m&z}S}*HZClYAX?9!reb! zZ$kj0J6)3tY#3npCYZrHu08igc{Bds1#Tl!y)*{MF>{~VrC(uk>{`Q%gc z_xZL6CPv0z01F{PEt@RAa0n9rWCd)Hw0dPy9ej%bZX#|HP(FiyUb`>U&DU2zM1Cz7 zUL$}A0Yox0d-`A87KHKe34U*IUIBS&V%M_g!;0-Vx_y`Pfa<9}8;YweM z(ls>^73bO9&IKDtm#fKf3=W==#j=BH)M4tK-;A@?h+`;(gldhTaAR^TZ$H$z-+GoY zS>7g3|0fCC(XgFIu?$F6h}=)H@~Nx*FV(x zqSugE*hUJ3USH=odi=Gpr;Q0BzjCJ$x$4TxZc+HHW8 zam)ADt}lpz+ZTvHcLyqN>jt?_0lHj5)%FQ3Ll>4Wsi!>{hZ*HcwDHpFiGanS-W*We6hY_Pk~t6{}bnSINR#07>#Y|1##+DKy&x zVia}IQyu>)2^_D~CZe;fj$p|04TX6U{w~}k!o!*?UyQo>y#BxN|HMyF4ags6=I;}w z@4^ArvmY&CNL9)yNSndnVN1oJz`r8HTQmYs%e}2FWE}uibIyn4cqQt@x84Dg)6jzQ zU-Q%2u#FpanpZ_$!r}l81$O#+@!F%u_EEH>Ggxkl>7Lt7SzTAGH2I6m7x}GSSK*FrIwl>^vf?yDgcKi(A3ZX6ix~F5gN>vE+Yly_NR~f~cr1 zRRhz*xSm1A8PbKSNYtJ)r8Aq$OG%%B6(hUKwga zp2Pg%RGEhFj6;1p^Bit540HP^fJI!ttF*>*l$91Vu|(2#TPEB94;{fjZYr$l;jdi^ zr#&f7R>S0k&qZ>nxaq`rzz86Y>go#!=SH+(P}2ZB$Dnp!RZI$sX-Z|9W9ZhKms7+G ztSK)5ae>&Zj^3XMuZs)ddC7MBI1Vgn9(lA zlO+g6%z5f)#za_EUA<=$d|(5=j-XKTZ=J^S%4hR>e;w|%aqJu)W(8*r1Z`K~5*Qnn z`#ir{#uBmEM?8*zObFMR9rxv|H`TZVP64>fLFzXT(E(mrzGKZ2n%dIxlA6l#cd|P@ z{WQG-p9dZO{q4Wm?r?UT9UKmQcK5OH4bNICt@=cRn`XiUl*cxM6yO}&_u5A^P=z_j zf`J@o&`SYPRJMiTg#|#TNtj;&`l71w2`lBI#h6ULS0)3+OH1RaBsof!U3AP$cixOg)#w%c-{A_&C-dxclT~j(+NC6Fv^2S*JaS7>NR2Y zmoFna49&MCr$ON0w-Chu{XJ;fgg~7*UOLJp@YL`?S{qz5n!Gt>jKFA3 z9Q%c~paCs`@r(w>oATL#jeRq+NB%f9iLfrf&6dLmnj-9LSD~x~XbV3W7I%*ue1%P5 zS?=oY21kvCo*u^2xt;qU55MY2IBb@4zX;8m*Z|JxLEA7(E_tZQiI;^EF}pBZ?b~ zk>Z~?0U!nVsB({0mC?`o&)Vio*$9j5p7iXAg2^1ZL^#MQNBTdvCuV04xLh8%?7gQt zhjfdAV!l*xWgpwth3DBLQ6KKLe|(KGZuO3(Wu<~Wod~OUYN^UsSOqj>z>C2Zd-r!a z>rL*t!_jP^@@V>v>eSi2ytF%fYEEPi3-jJ2OQbq(QTWS2M`$}GxI_>L-taVu8Fy&B{ZcvX-meSu0v#D zJ0gOBonyhWiipnuaqC9l2}3 zLmXUi3@GHK73CFvOnapHm;{NgDsIA$8-AWl8Rf=$B`EA412;#x_&ZAt2^Id4`ntNK zf7yZ2V0x zT3fA(Q&vQqUOpeBds@Kw;kqjd8Pk4!y#l4RgI@QIJ@N$H7I=|->apE}3D#%6R_A^% z2Rfms7oq>Bn&V=5HwK3WUNAyoZ#b(WWAt~h*b4fcygo1B+R}C=z_N0o(B{_Oyaz1- zpO@Sb&AO}&gUs{iy=<)GZ`wyb>8`D>FP!||XHEaf`sac@xnS3q)oIse)JnsEDF}o& zj+0sua~pIN_(lr%uAeSb)cqLn2iRdLC-@}xbOpw;nh8V$8pFhWkuTk`UBoa?WvTo2?RYu_0F zUX26PZ@ObLFqEEaX6AE={)#>wz1YYNX>|+U-RvV=;M#lhWk9C)l)8t@fq7I-Pb(5C zfH!t&g{&+F$#PI!V*CRDS=>-$eHuKuw>lM{J(n=xQ61jqM1lX+5&h&m2-42Rt6lg( zw?Q9NumO1&UmWfu(f4456{a*)Y3h4;xB-_CY@8Dfwa>qQXHL{BvC9D8`1UpoNiD3; zO9RS^0sCm|7|AIf-yPmL9E2bwSy_g1);E3@@{P2g2}@Wr`X^_QFxF(HdKZZ$7-Qfk zz-6bdSzr~QN-6_eVcj-NNL5u;xYH)@fiD9|Yk#Il=ZJ%DYIb(@Vkt^co(U(xvgu`l z#w$ytHRQ+OUmoysG{@p}E|M^=$f$oTD3~9VrJ^f&`_xxB9MuhM4_H)I zHYYql&SaxsHOJ1!TExJ1*8T9=?=*c6h^0m1!9CvUC4h&`H_*g+wgEAer<54clj2&{ zrszcrCVM<%jD&xL1RbsPr6X0~1j2vNpq$Mz{EqSc#luu8*X5Xe^FIqW!~m8M9RT{8 zYdgt&EM4bi`QPTAWecFv0ga`W2P-}|w8<3O>!Y48*L?Do74|~(ZC~mxczoMHyg7X&*HFVN24ylh%^rz$yHx=E@np*do;d*&SWHg`XA zY&G{?Q^-q|J>0?qa)1V=Ga90b*W}8>=63QwmSSbkMT{+4+4@F;_6H_L1r7P!y}`yz zq2z-N%=@PUtgR*pRR%tkg0iUB34rdi0q~|oD0kSREL)_<`VAz_#>U3Lv%KAS2mrFB zq<*Lvw#x>)Av}?_i0{EztjDi|c*m{Q5}#7IE4j$<3cx#%^ly^?>C#Ie+v?X`w>*MsY>qKXMQS~53LTafYrzvr?hq^ z>*nIlmTQ2M{Fy81?WDW*1__4WsR;nu%Lk#nJ$g3%QH~WIlRSsmTTJ)$LIrSDK{nop zoSY0mZ_$921}75w%#~+XpFM%rcpFe*!b(e2kfKumk1!xSw%%9O?Uw@AVO%@6Hzhe ziKwYXNYqIa?lE!-Vq(2 z3i?UNPL%BD^V}R{M;*a2~1=|G7FXAl^NijmlHpg-k$PS+N5_Lv85D zXvv(Obnu(lN-k8%oV3|F3_RQk%%bZme^L93LPtjzggVcKe0I>#m|2(yy+7c=Snpkb zkGq2VO?JAhFj41>kdK?kCcTOOGF=@fmN0>gc1sznZwPAZMV{tS2Q+O~R+2KPWPAmS z7w!)Z1)-BZN!h|^E%*wb2ZDGELh05926}tVte$^;4PLp(XmyzXU=8?OQuN+2_>PJ1 zJm#b^%;nhG4{oRBnOj+5R#a3#$oDmhrMElj(_DPAUWIqruZ@fg|}jiavC# zp4981dF4}&u*!{zRp;gJyYj@KXB2$4@)ZAoZ>qu$n*!XsK-L0uM$f>o_K+~H6L0Ez zR;VItPY&qJ(SW5_oY&n;<W`_vuomLnWLFkZctx;qYEjjt!c)3V2DyoP=`+q;utON^P^I4W$ z#my zCq65}yiRON860&)CM2nl}?I}(F=pgY8VEL;^-B~n*nfvdM%1l`1myf(c zq06Oj6xb=Ajg$o53_c$V#*k0#`;W!N64Zp_jB;EUY1Vqzgge!zSWY?jM3(@RzBmg4NoWBXB58^e-6b=E2|d2itMYs4B0IJg;U>I|7yKi!nn5k zEQ=^*(_rN>SIB*FZt5G&b8%J4^f+ztN15_W>t%oZ0|A(-abL#y_RX1=EQ9+1_o~5w z*0te(%DZs|{^n(Rd`vkYcb{Fwaib7e^hh|%U2(;O5QaN=h9`bMs@KFyE%Pr?O15w0{n$4nrIGy8lyT->>mvL8~>*TsCJ%dJvlM( zr)+w*Ebk`I3FI@#WhCHKrnaYOt)F&=4s!@Z0oEL>LAV?79F2v2WdkdRoHrT@V%@E` zzwJ`26O83RKRh_IrDHQ_?7doQsR0jgg~SJ(Hm9Tqo7dV?`&goLK<$KB)4;L$v8V{M zv#fHS6Ux(}mGtV>t9qt}5rqX9WIw)C9)1~*{QhzvCE~v9q?)Or4WpYwWK?^Ucqvxo zqa3okRBc_q2*H;^u}g+X@%IqTZGFs{HGHQXF&7 zfArU`os?C1mwX)y7N&M)>3FA=ZX9kt^!bzWzKZh5Th0>x>*oWQ?WwVnQ=w z@6Lg%zB@4RK-|NF#2%mOS`SC*1gn~smm&2_tD&&~k8@S>z6`#It7&-_uvP088+9x! zpp$Ap?^B!1-S^4j*J3w@B}x(~Q|N1Ww<$+DWU2qi)P?HNBiSJ{fpTFE*M}5pT2Xv; zqobn>zX$Qbf-kP!-DFlc<)ZtHC!%lVDM}tj0qI~)10csNaNA8T9Qv|tT~YaHEsgfjfWK!h}H zh&1h$^u8)K+)nq+ZM^$aOW1k!S9$Km;>99jY6uS?taAnk*DoB?ShYsluK@pHvLP|lTML;C{ z*1o^z9mB!!2XHuNU$NF)Go}R7gg>P|$>@_en_ORK_mgIZnh7kQiQ?l4W0VS2Zfk$R z!mq}yei zH6p)Q&8F51@ zH}P#~7uleDAtM@HfrL0;MBO~t`SFSJ`d_=IFZpHM+00_dNR1IC9SVp=?R=9PfR|w0 zMUfQ8v9X*Hx_BGY-Mbkg{;tGA2GF0XN$%Bc8fA;}X@ZhT z1jbgF6n0~b7P1{(hL@v@zoNJ_xcx*|pH)PC>h1Qs4w2SuulwEWk;G?R!Y?teuZZr2 zfW!)JRYn&MCs8S|2;BC;nET=+`p3hwY=n$|f9gZz=ebNdDqMY?Yws!Gaw8{+2C5ur z>_VaGGUpS=Mf01V{~84k26UQ*<>iEVXA2vjmS#!6+)?mPDnSLE4WA<jM$osLte| z;AxlPH`2Od#OL9>UJUmhId##p1ao_L-^P*rw4Ty+9kv%(IDgL$7WXcBOvFzxxYEk$ zy^Jvj50|@Nb16VvB8=|AfV&WWXDXXKl`>3g3LuOGXvE)wB^alkaKoVmcO1Zy7!E)= zRp6!RJAKHn{YOcM8emIMUr%Z&>g$`oeTJdP%Z!=d0VcdmbWaab&#`id;kFiEXHGV^%U=@rOWVw> zd3iK(f!3cgJEz?&tZ#DPS<2IM5vXQLrl$P**f-L;zqL_|Cp~hxtI{Nxe*bCR7bkG~ zk^>wIs?E1|M0ON30?ZFjMK?lQR9|hK`w+PE4&R^Gk!PX#QWipkg-#P6sgSe2_3F5# z%)!aV_AQ&5SJHdIYh&P}5GZrC-;Ob}N}dc0^1u5wS@-Ml{Z)!|kf3Q`1_QzuF}U`H zvA>R2<}hQ7B|~FkwZ{J@3U#0GtKEywEhe3TbiR9Em3e6*Mr?{`Xpl5du(eB?p4Nxu z3yFaiZ~!5W9gwiM-`LbajQk%C3(&$I3v=ix;|>bh|EnzP1_-6|{0;wFUf0nW&_)?p zOjW{P-C;AU#d8zSE=958ijzcBg4sP#@<3&y#6}@6%sp}1G#U7nfHByUvJN>_hiDkz z3#`3eFq-gk2a8O<4jGCoapT0L5nr@L1x^f;tjFi(;=sbN$Hn)VchK-_%_W+c`Izfr zd6&Pb1A(9L?q2Y(=ZUXGxx&``*;eu07zyQTK&n+u88azN$2eG2Q-cN*^HM1zO>=SM z*&d%($?Pl!SmN7QlJFX;Fu}e3+StIL8}iUWxuHoaD`eh0b$*Z=)~s3k z;hl`r+eb(x0ktWJG@mML#i%G}QrczWB<(J#@DBbU!y;s@$fR^Q;J&%SgX z2G&Jjs5ly8(j+N4=f1yuZS9%<002zjTVE=ejsLJtFXMKR&d48M9eH#h?`RwA6Zf!& zjt|LW){KXR9IkT$6&PfV7^AGO8CkZOVv63K2=psBC=e$n$_|x$Hih z>xTs$5yEx@N<(#6@+_ylKYtRy)Zmt+WVoAnJ8t}x@q?Iu`EraMc{V$DQXz9bn}j3s zs$r6*uFUyqRjF(>bx`us67z{-lzF!x5u=tAkU{|MGB?n#3SINxXGFA_h-U=Ea*6!f z>*#TVh_?N+3kWHEm6sD^jtQ;fqNZVh95t+A%RVamqtj>%FnWjtHGykG0?NkL!e6_d26<+sHyr2 z`7JFb4uiBs>XK6&-Oj!QNq=!20j4AaT5 z&cEUY;Z@84@@2y5jX(aOUp#|J$p&C z4B`NW+28A!?(Af_8)Ff}-xXNM$m(h6RV0M55qQ+9ziGo0c{5u9<&-di*(Dk^|Cr|ZWIW4M1wVRHTK z*~mn8B~itFbK-{A;*T%2qkyu3;vm%Y?;BGE9i3}cbpB>;K54B#w_l9e5!BAfTyz^w z>CJY#)XU$Z4=X7taR)*oJP>&`ck2a*i$x)_lO)xzZ?YQ6iZ85whG(A2Z*6UX?^bwW zuL4E|{x_BodwYC9I%pY~2IhX!176|e!|>vDgMCEta#E-H7F{y=r{x~ptNjr4Mn-Ar zxA{HYZS61dXC@!+e>o1r*VHIzljhw$1-bk^6+OkX$p$#7ltozZNivH|E{MiF!4qMy zGswEMlyi_n<^Uh=c?djE9~wS%=9cNVaF4N|sx@HjS>{EWdMSo}h#L*>G5lFjWk1Ir z8(9C0i1t{HecRmYYv%iA!zRILT7$H(;>}M~)~dsLha#YWgNYbt{+m*QID&Yy`uXLf zCy46|eLHAc3JTjXTB|Jmt?7)#THSnC`LIkv+0=19$;IKpCjb~m!%)s0wwm^KqU6Dd zpP3HAQ)0`Yt>@(90s|0v9Y`9XAq3nAI^ui<5RFF+@33S0rbP~a2RS+LfJ$m?IH@w0 z?t$|tU@Yzphnzndey$unfzmA>#ofWD+mT46_Nt*U(TsEK^dh+ZY;o`1q3pR>MOEd* zZue@Tg@%TfoWA}OSxpx0W$YTp1V!pXHuhmbcu5!sCIJ-zYN(2;Dpv4n_V#{>;XxJp zfiqM{`qTw(czEM}xoEDugW9w=+2imcXIbKIRa8~%&IPyJIvO|lCP&A=d#p^A=|Wg{QDZH;kqwTEO_)krY>)!n zry!3-f}_D=4fUuEFWCn5qv{++@2BxObi!LR&W$eGfCHGp-`yQ93 zqWpX`u;rUaob5oB0A8~fpo`R|rUn@^LMQ~lE9=4X^*r@ZRvt2^Z@E9Xexd^w*3rRq z6$BkHBa8#ntDI55;&w6|YBi-=O;yW~vto?)V?{Si z%`ZizEOTn>;}i9*?zo0XnFOC&vr)L$@TzWb*`j$fj_J7FJj#T4SCAU0lGwA7+hr<* ziA}zn!dkd5TZCT-D$YlKA|YR~e%#O7(wo=8U`tiJOW7{u{BR^GOK<+`RL6V0_n2tu z!`P7Q`jP;>d&Lb>4sanl0*sopN^<6GvbrosbxI~%@Rfwj1t*Waz!(pNvUoTV?=Bvc zy)_V^MRNLJ_5i^O&+f2+2X}-4ugadcu`!d(acy$Xjt`iJAA)0p68PN!?6!Y?IJS1S z^iPJKf&L(+L?#>zSDKBgb`)8zpM0pO-J&<-`6%*-!So*vBul%RIR!dBx8^pq^na25 zaJkYosC+z!PiM%@$A<=nrLVFGp{iz~h}{v-tCutKu~PLpFN~wiI?;93l}Tw$FGpd( z^6!gwgb~uy@NkTN3sx&b^f6BcCiQpddCE22yER2+wd7DebHru&q<%9LnvxMsZQKbH zC+_B{?hNnxJNz#aOjvr%-(I6h4zrZl#~|g(4J|~u(H|c?QaSg(C%3?E5b;eUGEy1b zD^%b;8<8+1&fcUUeDPYrTs+O(?Ep?XC;%Fm3kM!5>lb81%3AU-lEerVBtUQhK-n%1 zp>rZ5A^*%k;fLxQKKfG+upgML`oE3cx>beCWfn&WRYWvlu717zq=*z#fhJdh zrubSZbp{JA)LX*BPs?YkSjq3vo-(Od|FlJ4wTcujc!d%SzUptQ;5z9u4+ZJUgxyTV|g&O!Bq;MVtDb6}CepDE%Vn0&f)CdCClIf&b(#bn)z9Q#y9kW{( zx;xd6J33kU5-$pEs8>bNZ?o}BdAz1}4cdBKu+?ApX~zeCOTuD%EWBNF2M-FyF-2Y9 zV1EdmGjE2gnJk$DoIC%X;kp3{0D!&EJ6Il9hzAA&%Ktwa^?Bz(L(^4xT~8rt7kC;3 zkbCE6wBXTbI};&vf_u+}59*L7XJ?yoE$A$`L3U~wXN-zfH>MM?&1yl%*^8R63+hPmZ~a}9o0E=-_Pc64e-Bl87#X= z)^v6zjgRYqjkWocC-fZmvcWa&SQrd>)L$lvRV%-vd#2(vE|C_kznr3hE-a1{bAt_t zC$swto~DB%Sw(PGivy({PJWU+{^U6o_0*@pkOXx)IN5B$!OwQ+O!=&5+-A0tZ2^&q6%71dN zwQpAr_-w$JMgr!xco~*R)M26%P_-rLvecOvAGPZBCMn|JTFA;6 zP=bmo#)62@(^Id<2~yyEId+R(m-UG4`{G=RLaU1n1O@Gn6Kr&>%XcTI6gxg*zvMLX zTk()^+x~nD*+E-}7G7SoNR#eZ@j{u$R-+r6>)n)5O9E{51S<-~*79OyYm3Q4^>n z0Vx1fNZDE(P#sQSVkCKej@Pj$W5_1FUlyoa`-!&#Dtpd443p)aT1Mi(8gDt&QkOki zIG???r-zg10}uDJ^o>67B!l^iy+9c!0rnCMV$7Sq9Lz<|cGvN4i%NCaQt8cEbS(Rk zSX*0{mX|A@UV79p#)I_&sOk|~zWB+iM8Bo`P@G1!D;!ZIZJ3N>*SOTBWV*24tpSsf z7yz;riI@YnnVA^YB^cfvOjlq2YliN{gugcVr8Tz8Nz@1Y!Glk9WRb!>7|JOCx?_fb9a9t=*enA{hmx?Y-4vm;N5kA^yZ1|p@^5D>l+ghbaW%=5`QksWR zU2ho5>lHUiKqG_|Bb^7Gw{q8R`)qiR8<4(w5t&W(j23hYG>~YP+p9^`7dn8`;OG+i zt$Q@-U6cx#1%iM*x%Xq4=$+SD4@*2hWfw6-nlrV&lhdr#8*bP`uOGhMI*6GVa2d4b z35b7p-i9hTRslE~{p;fUvL8-L3|`Yb

    CWMy*df*n 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

    7xl)ifW25u-o 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®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ðTv%S9B^SZd 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%0DBr>*;)uypc3Pn) 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%0D<%S9Y8S)FT+nfD2n&-<(-T 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 literal 0 HcmV?d00001 diff --git a/documentation/dev-portal/src/images/telegram.webp b/documentation/dev-portal/src/images/telegram.webp new file mode 100644 index 0000000000000000000000000000000000000000..b9448ec965d24f61ac06b85a70fa94a21a20d519 GIT binary patch literal 252390 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

    neJU$5%+hnVlf;2 z*(@Ak&oNY@6^4TGz(y*URW345bjK?AspSR2HDQ8>ro+Xi0 zC{Oct{b*a82?|U)Lg)rCU_;sT44RWg4w#xEc%133E#&Y30Atebg5~xFs#OIa4PjBU z!N&rXS04O)`;iwW3hygn1NT;}g$7tjIGt)O<3?nDBgs8kWPq1rUDD9Yu>&oNHgqyo zS6_3hD>QnmQn1YY)L}BbfwKh>)i^C(*}P!?42CEacG0XbL2`>w* z0akOZNxuwXL4E_Siitj-jsCNYB=Kr0&mXf#cmENeh%l8k$jI3)1h~;G4b}f1Qp&aU z@Ta>a+X3BazZ`tDpNrUrMd5xP7p8xrgs0*NujQL5Hy5DUVNg<%k zr^IG*&e+aJ5M%$teH&kUBmXJM>yOVWNBG~0UJa-a9887@-}yM`RAKPGr-9Ou+>0|s zt-UJMim6A+UjtTJBA8(5f-Apr3|pyI@yD-_@xh(QQ65a?|nZM{TVFX1;pO1iKef2Cm5pM%hHZy^#k zp(hIKS!7XKV3)wT+MFD!*8_BU1X5E%Na97%V?K!X{YZ4zu-^aHsUuG4i$z&fUU=Xf z3JT{ZEOBZXo_g{rw-bD^wzVXPRB=pnU;HMEdBDc}qS%K=Rau&wGqZ53spI)htJOk} zjE4s}kJ`Hvt?5@l?fs=TF>UhQ8ReAyD|-#`tx^I_ulz0#Q#{jtu_}B8qof+fy=`FE z^`=CG(EKl2tR8KB5FKb4)@1NP$;UQLU0&vBiVu8MwD4{2#(;w?qiodnbi|fM(ShvF zh@ppXrAZ~LQv_K5yYcfST2ifI=Fawz5fnUCoBa%Tk-v*aB2=TY9#=~8^>*COE%~`p ztQLn185+Sq3c01e+OwB7rF(Wd+TFRG-fDB=6X}|Ial7vuU97|KWR2#7t?@DUo+uom zc^lstH_K$T+bEJi|4D`TrWqQsXG=$}r3k_@R-Bj?!@wwdkj+=_ErVKwZlVdp83mcv zX*)n>Nib~o#lk2fJB|0P1Fo4-uiBHR3?1d#%4!O=NSzRX00T;!=@7k$eA~xyk0mp7 zY`Yh1lZn;NBrqrEH{ChZ%STagFYb zaRuPyjOuO8=C+HJT_d>-Q+?%EMf^&;vXD-U1PX_bSr^WoX-XMGARcd9IEw~8zU7a! z$-QUBt$$f?N)Swpt1LB)@5FHY#s2nS>JgRj3CV0L*i}$9k zwp|KjrP3EB5?W26TA0;h$TB=(e}+TqD{WXPwZtIu6oq6eF~8!MEN(?~?7YUxMws$O zx0Ob{J<^JY3(Mrn;lOc}@g{QeB+7hRlV8}XyzmsQPL8LmK~$0UKKbLMRXn4jJS@@U zO~bu@_Sp9=yD9D`nqkA)R+<=-X>}ig!XRDC@O&z{bQdT?+cfqmph_^CYFW`VL@C*E z+zL0aNoar^6e>*u#Ce-)L`m|F2w#YKMOm5VgE5n(jla7_mLw0sH&$x7PZ6Zj zjGmY+Ov1c!G0GNUtRI~s*44JABMrZVifXi(gHG0eOhN!JJ*;6L7<0`zIno+5L9ie8 z`3Arg`ctbonYcDg4-l-fA-Sp#J0DkjG!<6T;_vYxnI8>SrU7D#Thho!Loop+aWi7y z08_v09?TdIo%FVmKZ6lWmE4IBsx-_p%kPBSZp7xaJS zUrr4l+1iatp6C^X2F}`cpizK`xL~I!n z>d*z=Ht;~qhGjd7nWL)R^Us;AMQ%tISHwbCG*ICVmC)J0o|BV1DL2uW*5K#NbwanY z38bve^X{#1ug5EhQ&aD_<#^U^C$hWc{D57_z!vS2Be?tSy(HW;HZQrUFR5@IR)E*woQI{+ zk?)HFqPlP^BXY-Df?~9LBlTvCmxfio}+pk@`bsI!SMe8a1pI(o@ZI}Xtg96@pJ!MK{X|4Wh!R?_lC4JmPe7yfLY=T zpwyvj2Zs0rrB*)b+g0{9o`?DSRPzM)?+$X7qUB`U167Iv$Bh;vlWq7BMeMXDRNDd9 zWlg^00c?AAShaqOAhL)*Cl~+i5@MvYu3}?aM9+V(!GMkL-afKcq4*zyKeTxE|yZG6y|6 z)6O*&!n8#8cnoutGv-!l>Vh^xC$e;muYav}7U)WW$KRN#bhdG14bfP{dUeGA?(M^J zkhFRG`P&r>l@S4k{UHgFO2GSh2%B4ndO?M}Bd$t9Qiq9mk9JLIqB<7;q&h0sNzZq7 zdxOk;qPc+dke%T!QyFnnnX%&t8NQ^0^WF8b6VKKz6d#rY*(xg z(C7Gua>ob=fU?Z_Uv zo{gMOm1>JiqiK((k*3EFw36r(B0R-A6_@;Uuk9W{zL?Xx4d{_3c-VyM{OKS4STxzO ztK_eF;v#W57x^U2#m#5>OVEsr!Sl&uNSM0 zHobnP##ycA0`$IainK=72@3m-Bu-57H~LA~kOSSPe*Jb&EFf?(QgQFC>O!2eVg=%U z7n}wu#)5JRGAObgm)dtPLM0VZJ!KknCU4lo2xx|1Q&>F}=Lx?)Ar5w4$rX_YREQ-qCk2HKPa6diy2oIOGE zn}PUD8muiL4%3Sj9Xg3}ASEQyWvj-xBnScNQJdn*9c{1#z4yS35 ztd)U%#Jzw)l`0LoIIVTCp+m{~w*9=|jk`lia3oljX<>8@8^3Vid$74doI(98qo1c? zjL*4!sFPIUWS@kT0T||znETfUUA9oMnM#?5?t6~!;qAAD$iHx3nsg?)XL$yxR;VW& zV>Q$oRKH3(dZ%97{evkb%)NOfV@|rM=?r5P)s(?`-zGnyHdYh@(V|_z^jZAyYK~Wh zCMa5H8n;uCreqRZpcaBit~>CEV9WuTwY+~F7V^l_yVqK(q)6g8mRG^yy{@%(oe8O0 zn8wdhdZM6t@eUZ!Sk^mUpLdww?b>Xe2%l0P&=-bDV?M5jP$6f}lFbD@-CHPw5kuL5 zkXqJjM)6=;fX%h0dYDjIaJktDBEC(&+lh2iCdLWPQ5OteaO$Eh=NGB>DAO<7>)9A8 z4}pyHjT|ltk+hqu-^%V5CeCxy8RAS8-9Es#pp-$^-QDZsgSPCXFg*N0%|-ed*wl^T z@Nq4cnBrD)*TKN8TU+HDbe@*?$!|?uW$>CLzEQmz)gsc;HD1DFv_tE`EU#s)RxmcB ze{mLzc9S=;VbJDGYgm+QLW7=HeJ#M+K&6#SFV*Bo7kn;&#K+;X^z5fe;XMRr`d;D4 ze3`aD0j-x7cAK}(BIb(hy*I#$Jte`0$|mdKUmVXgIG3Z}A~=&C%sf>EsKP253Wz4K zu-gU5Cl&v>ul;4Ehwu`UmC@k4lg9AabObp-2c{=I8g_W1jBc5NwE4`s<2BJ#Fh%x#*<Ky1c%I`v%cpD&+IVp5VA&M%E zy_vT4Ij-@u23g9nQk<$4;G;!}mmAk@DLm!7FxAj;(q6Joe!`xIbgUBeF&50{bWH;Y z{%Q=tU6JL&-gHLcu%PPsSYs^GQaOSCPIebE6|0@N-Bc)Nk7!-O89>D0KYWaiG~iWM zUek&MB^fD>RW*!qa*O{9;2~%s8?^7ol-qA5Oi81|?pRV;6$3 z{Def9bpCxI(%TOWioYtcuhl1q(9jZp`R=3$!R#!?rH9A_3=1`cG z;KAr=*uLNyi0~|Hy@`R7n;3T_I<%?9%y3^majjT#9p6Y?AWQb_>g(18QpahKrQi8y zka|+w--=&o!??6E0=Hng@7!v;Jn!T4IO^8 z1-~ZnJ_eTcl~~Su+5sm*CEp zMSKgqj2mBw=-&6J7Q0fu=?xxgDdhisZL5F6D4;q(I6tk&nmR>BoOOm% z&~A}#cRP`Lvu|e-;|Ih;y@0#b|Hh|!nlpZImj#Mu_gwQM4vN?MIx#)K2_;s3 zFS4J!kbp9NllfxKH*-(dL1kSt%SNlkx{eA)E7zC$oJiruSTJtWKSTtUw;LPyi??KH zHT}p}bX0RX%6%RE_DxQyGCLfKQY8Kx&*|3#!-gC+B3`a(3X5l zdZ}ci7Es>i z3ExUTC=TdO=dye;7~bFs+Ah}cLo<$Xy}oBqFYA2~u-}ukOdvnsZdtkDPASL(4@&i&5iKL#Aj@iLq z1-e?hEePihiU*TeRN1`9EZ8##Yfy`LwLMenAM@I zZFg^j#3_CseU^Bd=bUlY?A%e)<`_H1wS}*dUzrS3Ux=8pw3I0ANbu=cm}X+4E3$R2 z6G`0fr>1zrHoNN8ZD&k3Tg@K=VOI>Qi}K~5)x8EviJsH1N7s|`$X&Z#d7U}ZKLGTn zOze%kd#EV1+Ql-aZ=6i7gW$b{TN^FOttUf)hN6DHqoQrXle^*FYse^*PTg2jzm%JU z>klDIsT9D{CF?%}J(+LxBR@UzW!L1rkcBY_Z^;NR>OmX_0StJ$fJc<*()IW_Ytwdd z3;1I}W_?BdNS?v6Feidp!mS_5%4I9+=(TI*Ui{-BTH*;&000MvaI6rH)AO+(YVj;g z^}q}tZZRRt#`o3@{+KAKxaCM2f0yFOC~QAloV3)YhpaA8%yWanauW=9O;Sv#Aiq_P zJ?GK}-{q`E^zJY>8Lcgd_vueUKHBjxhiLav@(k-Hnb%Tp}NA=i*!ls+kk_Ayv4z!x%o<1ToMXpU z);FN5s*9UTvCBJ6;_1q5mKZvcvy+aox=X;JI;-3j673T!O?yJYpHqn0q$6yG>)^rE zl)NHnA&UCf`0~00zTWxd^yVlYwj>qBQTW;s%mCz-&`F5a{9xr{BrxC*y*z~?xgfNPuN9h}C)|^X_kg`e);fC$C5Rc@pp;^aUj({ zw$n#is`FUCAU0L8U&wPWQ`!zm^RikK%fd<4DEG$nJ{#rlE6K7Y5P>FO9Blmn*g#K| zLIvSQ`rSK(xq|)84g?P-a=H*hHx#J2o<4d~6{!vxa+srtybqpUExv(0bq8n`W z4I!P!o&uBqL(+hw#fT2pC=lSf0J#QCdrBl}am9tFa5_hHp0ZfqcO=MXRwRd$wXSoz z{4kGpRH5<{39Dzg@Bkold#i!r3;FYANkfpj%NFKRDZ=m~3s}(ox;gKDf?d-%l%Zm6 z$8VRxFxTB$$Y@~20YZ%EPwFVWTMiqC;8ukE-mUxqVc~3dP>Ahk$RJFX5q6Au7l%3K z-&5o!>5Xp{?jd=iQ@~z*lq>~b9_2)Si2;b2gwz{@9@&{czTISmasZCkpi0k!7r}-| zuY|~1=O1TWOYR`ew;9I-KXYB0xNz&Rx=jW*MNr|cP^o}6?6F!m4)7 z3jfA3(DL)GCuM6l?c;YPDSf-H#N2O9)47OcZl1}aPk3;dQ=1owU&A+XcbLq(CXCsl zz0;X9eC@o5xWNA(^LMYspSt~p@jK4MhUG%W%!^ zNmNQ-v;wA0AkHFgb*XL=azPdZwzz^mWPSB>aTf<`D=)~`8%l&UI%MLvfnDHUj2wKG zkkSTn;RR zGZjA&tqtSMl9fw?M|jfX(sAX|?51==ah>xM8|yNXe!0Z_Mw+FR8Smazz4|hojKVK8 zg^!Vgk*^;7IDKbw<|uczWAPo|s(OUiH8B{nq-+>I_9XtEluji(mJ!oywA$%?9CV zqshM~zHZ0@oAjCXIrxV=DDS=}sr(Og zCcSK%Z(N8<$C=JbTOVI#LaN+|VY)x_3(oIXaMq6Njyz$s0B<*xCgPtd_;-3$Xjq53 zqXf4c^;DE0L`M8g8h`>Yb8hg_3kfMA&^Uc{vTwb=4dH%kqTH?eP3>y02mfhcl=lZB zr<<{uDxKE)4EIKk$9O0U-_<)=JL?+p^V?vCVz3T+~6&HJz}(|{IM zR+LBoRQQe0PJE4*>Z{0>DO(cP7jguOV!%yl5X2}Xc0_i{eJrfXP>Vv|rr9u5;Gbyo z-Xh6iV4GpDPqtjJ-W|>7^s-wTn`jqWsj6G5Uem zfWoPzh5C)5Rl&e2t^-Tp`S@Xlf)#7M+9_BH6f@o>ab6E;;kh0ngIG3C;7{V1+iXvw zNU1?Uo_3T1@7gGc%iHp{ehsB@Nt8Q5{+qQ)RyHmHvCQwVIz4%cUlq?k;80Mw zme77(j#GGKO;Z$kQM|e;pi~LI=Bhfa9V`UiFjI=*@MWqY!z!Kt>`_XkG}yh~e7#nn zTnCYHO>@(Kzu~dd<1x_Ov*I&}9$kM%p?(OHeYrMtW@(y5#c2A(9@~#I67_=MHVY z6;3SEZa#kNBnx+20n_iHwR9vTzh^VMW=&VxZM>nL?IP}Z+^<-?lRhDV9YitSEF@#4 zmx5cYcMt#o1F1Ga0GL$LkpNm#%G{xZ8gDY80))vprf3U3}^=cz^v9NHF`5w=&ll#^{i2rz%5Rp@WO-~LJbX&UX_dF_Z1Wh(n zDQh&V$#iA_BVw;4;sN=L^R^;yIyEM7uC>LEE4h4E6^1V0iC#|{13c%~#^G-V)d{?@ z@hHt$?rSi)HbkB5bhM~(a&QF_AMdC>NaFS4J*QWF&`pY&oxZjoCCiw1g1QS1RXuFs zWH{ywdY3GCA*&-TIF7sD&7}w4N0f1DyMnfUCB%RS#{Fy%T#KF4YRWvXN4RlkC_ER} z!X~JB!-Q57y>7B#!ai_o@ z8;))?gG}f88fc7j>J^=O!A4eh*f=wmDy8gP{QbiH@U$*gdf;Czmg7I#le^!Mx2qMM z4SbX6w&8K*51l<)3O*^~mZPK7l11vu^ht|8`r%+_6W7P_- z15=f)&&{5Azsog^ut{VyRPn!N0VN*@YE39*xKf)8Mtq2p6Ycmr#)MxXQsqXsiANYO zmDYzDk*zi8FM?1?ub4FuGg9;iY86ufQ~!E84%09`cM$&Fm`=;us&2BQ1M!5}fV7=K zoPL?6&-}w2f+7c3M;=Mfxv(Up3*kP}mH5 zP8(x?(V#%TGN9FDN?vHckddeWe&B6XjFhaqODY{ zXr3Nj6VLhwJ~AHtV*H2wxQrUg)FS8M8QgOH+rg}zpav4-5s%+myn12Nt|dWq)oOX;&MNZhp|LT9K{vYjV9*#QJ2%Y8;FGFwrMrrPqB{o0UQlX8)^ zCbfsg27lOGry7uq=un2BX}hPm_<#}7bymdp2(8s`JTn)M{Q7&v-%(7+uOLFz+B_*` z2!~wN*)r%?%A51fR`=bVi1>|~5;Q>_;i7KBkgc|p%o|M2T!}V`HsYf{SKuV0kNmm# z++O~le5!DzhhIS1Zzl*Pc!?jtxwOtS+=C*iJo2ifN&qs90d3z{t*jCYG`$DRio?w; z4f*`u4dzF;@9x=X#h8GcNBxtYJE0Ps_1^@b*{CjlwY*FZh*I}>60@6zGt%lhSsLcX zaV6nY(YeU%{c8RCuTc|b!eNf~8g>H6)3Z!VWoXYjQM8f4x1%LRcI$jse-J0UX6)E6 zC%t~0d|}vF04ZqsBvs^A{i8Sy^lkh;g}dVqjp_XEFAUWrSr`M!RWPdsp(_<_u)OJ- z+if#(g*h%E3?Gw9o}50^7*ZwOY|s*=X7Mg+$G`YWs?}Acv8c&=ZAUI@wogNHxpV5K zvP<+>-syEFw02&Zz%u%rTfoq1LrG8^d@=yV?t*uBZs48X!_$@c#65^<5mJe|dQ2_1 z&O$<)Cc9$MowKMUwiU{vijvGIi%=xrLN0Wl1t;|@?9l-6^D39nq)MQ^wZ+Oqo@>iP-xc%ow6v`P1T%4ufNY(i2RL~w!X)~+ih`%*3>o!j3S-q7$gsey zUg1AAzTVu`aS>Gjlj?P%p2Y7n^tnv}kFv}vP}(N_W!NMzEO#uvIl-}(2+Y;JI*!Tt zeH~T3QBtwSrGsW)W2V7VZjJ`s>x5S~9Sf8;nAZ0k!jQ>GW^clzw7`G>024FBk#gy4 z(UM)HHYYUzDm~YwFToiWdt4F5@d=F0&Bi-m6Q1h{GB?+Toy=VVZ{U-*wLqIo)Py-! z7VfFByWbTVtmm|Is)u8-;3H!fEwQ1vBgqHa8aEORFt6&bv8eG;`!J`ZsZV zj%wPJ*=_Zi6HD(X!?3KipJV9z0ijV6c?H^>@~F?#`ZSTsTEz9Mt##pgXz+0i&_Rnc9EVXy8fdTGl${npLbp8z)k4rk0?4X(cBxe4R%23$d z(vy|8m&Ox}!@_hIUOgxZl4Mxh4a~^T>@w2$tBBi`hu2;%AGP40BB&a;n}RWH!5x&) z9rP_*U6J-Rj+_Rw0FHGTt&Ryg)(qEDD-m^aOpbO_ zyHWdg@^^&J=s(#)Os>O4-x?v4oS0SC643Ctf1Wue0T4aTm=dd;o)=vt64A7MPXupwtW`r{*9 zOGXjrinl2AOo@u!9$pxluoDC1-&zAaN6p;V{PCnt`N=`SutZa(d?}_b>7bteiiAl9 z?Jf#(;HO;{-@)Ehn)F)BqH3usz$sXOaJ3yeX`9g^;(QWgItQ+ZPAYyam~@C` z`zYGKIhTpBXjc`Ut%8ek*-PPRx2U4{EXsPkimjY<%} z+$bBe_TQKazRF3$!{yqLB1XHMs8zBXJ55-PEd~-HX%4qO%TW;1gt|Sp`w?H(!IgAL zni{6~Oz(M10O@Io3}Pu;=1#O741P0PO%U_tWOz&!y|1;ewQEs00JiE z5xjKvp+klcp~sXpo<(t3@@SpLyJ^>}>APH&3qMuUT%PQ^q6F6xJnB@Exl8FZiKqPl zOR+xYnk+JL@iC(+J<_K){s6ghX<$qI^Z#_)DUM2dJ_mGWT7T6H7F$e_Z9}^C#iGF> zJUBg^LRX@sqJzP}tKmwJ+FKq;5TQa6b$T)H*1FFGElM}>507HB*!yA;$q14F#rTY8 zI`d@cjl02+^j0%0s^Wr?1=XILw>=qv@=CZSjRD zaY#X^PBYT1w+YFXldF?%IryjF$RJtL;QIYt=Wa=MeK0W_v9MNlftUx(9b{vKtL7Ucq#3N&j8~3-Pl4 zybPh~JNO!dO`}p@l>|Uf4tHnZk9n0zR+T)19?;1X zbq`mHo>tU%7SB8X6&oK(a`WUu4~v`8ZWlD76mS|HNdxxr!3E zPXl*ucwfXw0YfazCx-w40ot8~ta@bSJcZ+;mdgVTOmiF17AWe=BlE8L<7c)z7}P7p z5&5)LlWWMl{P&8vW3EQ>;e~scKlU+dhu$Sm#TwfGpK1U&sp1*N)?zws zlo(~(h>QOjlNcoZk7gK8Gq3B>;UE3CVp_gGQsiWF_umOmFKL-xFX;5n(DB3dud9gf zAw#PzgAZpAmW4dq%Zg854szG&kdI8F{=(wA>ulmhr}ODbXAGq#(c|2$pyH0^QX;6 zn&H4%O&zGW*LtlwQ)~&DatEB-zLnhzVNJ=A9_przUPE|=*nr6brda$&T9BLuu6WUj zx+C{d97LoL1uJsvoL%LryN^ZKPM=$n_c){zF$IuTBE*wFbDPf3OV^X12I@^YX8$qvx^P_l-rScV3af;%BYdpX7l2gm=^iEOOv zv74XTRvxc~7c`{&=Yg|}(|r4h_E}*U-uP(ZdlDvWZP>+wKah+{Zr%GWO(z=fS_;Ju zfqMY(Hb(DgxS%@ifEd=2cJiMbl_V8mcpD3D*k=EMG7L?^>c~3Tkwinyr_WKGs+cg} zTl3p~RNy}YP<05Yg9UalOnrjuV7kX&K9=F1oAa}%nI^3J=vljnaNl4{4_)}51fT!_ z00w%E1iNek{RYt0mnPcTO1L4}b>+Giqw8%_Fjp=RxOII;@|%t?wF&d{n>y?}B;{$^ zLz4HLZMSsq^^yK=_j1GOEbAy{Rhoy67g;_@Xn6J{&*JY+J$2 zJ&fcN>25D^G=yOzqd@JvIKtE)$Tz1B)MoM==P+gVBfe>U{LH9iH&hnY069zBfzS9G z7=fdb7?j6d{5TOb*`FG50;NFi7q=ND-oFAA0xB8^WLA?ee4e zdrU)%P3V;~sLqr(gE?#j$n&qs;|(=QmU%Ei>`-+7Md412BxDaMnW6-93CteoOCoj& zy|77VUFHWA>pjCJ$sJ;|l2D&tX|lnkSV|-Nf-Akj%M?VDLc3fkuS&$$ot!TwWwKQ| ze7!3f%J}lD)e|PNkIL(QCKQ>Ge-3HgHs~jcJEh6Yb{yNOpiX#~D?3Zs)-%tcNZ~p9 z{fa=4AQ`L}07XE$zqel0o?6j_-{x>wHsIOT_mXVfmQEgdf-Y7QSCKPd*#Cc-$3o-} z)W`sSyyA*ySIny}+hz8V2Z%=#QIE#`0DLmpQxP^q!xXpEv{VlB7!ul7xUz9bonq;Y z5PD5`E$El06J4_#DW5%xc<7l?Rl&K>veUx0X`ih$ic`mGFAk3;oWHrU~1jZCfkj?3{4=V#J>*Qj}7*Wl{uD?C> znQabJsL6v+tF16gbCxMlN=qqQ?qN8th*N-J+4|jh`p*t4*q$!g=rn~TkS>}a+tIC^%~W>!;pPgBKDHlz1Dr)?=W8PND5B72?tXIC zYJVb)ff9^eWR3|(2FdL6#idC=$b3J90@g-x<0Iu!Z5^QLosfYkIH!Vati-vh0u_1i z3L*cnh&`0&4bQrrUnS7Aln2A<@I%1w!S1<~5cRNR=m={Q%Jy1A zls+@r$R;l>pAtO!(59pC`qiYPvrMN#Is$62fxQI%5@9)J&Ll%|MTT!_ISQggeUcIO z+@KkAPw!M2(cO7X0&u0|8vCN9?h3h-%T-;m(X&91w!$bWP;2fRGMj^dE4)^a?bZqI zfVZw6;3 zn1I+7-aPuQVp1D?B^onaVcLbC8qXAej$~1vi-86DTwvW=RT5xeIZ#;ADm+hTae+hD71DS3bG6!9mE)#nQQFezxsw zA>4u4B`f!AO6ZsaH^3_ClK9x?-1)`=GM;iiw)T5BJdHjWfI#+} z$r*sITaKe(Lu1j~v8BAfjZ1d?NmDM*!6py1=krM3^IJJY5rR~--oC%Y;XD>ePcl&m z*`Rjqxfq8NN{NkE$B_Fo2@DuAH1G1ElE`GMdUW)@MSNBVDO0U~;MsCPNK9lD#)?9S zRt^k2k*op4Xn%A-3ox!Np?%J9Q|9*f*bCeCuj<=O1${8|jA0()| zEUvWxcI`thPAqMA9*#y1Mlh?!GR?q};F3BYhi=lfzMqd!-^%5$se3%{P3}olQq$7-{n!JNELIvrLM9C*-hWgU9@km# zpBFt747EEk;6OIz;8hkvB(M*hJZIEw*&08Pct#H>I{clG!b!B(yZ)M@d%D)a&7ADE ze+U{!b(Twc?rS`=O>}*2ME2WiF9X>=+499`U@ay7fZ*_>V>(!!uw)E)!iY3RKKez; z`y~`SOD!8yM7ig;%3#vT$FQydfQF6TXKHeaqHs{>&%(k0P@hQcZY>>@nj!t5oaFiT z?!|csx+FlNZhZMK;j&r?vmD6pwIwLDIPfia=Xd1H+J9RdJOb@@E0DltpT93rL9lJfnT9)jG zxxPfpJGV-yG3z-fXdoUecYe@y5uMM+;D7A_-Lsll002W8qPX*YzyI3eJf-(g$C*fV zgCOvYUXQ}nSf#q=MXHA~S41|O=nz!5h8$OlO11#)+>{6&BZ7X={u^ONk3Ohu^K}CR z6{4nnEDscy;pFStsg;0TtnO#kegzN;M&PRNd?#^ehL?c=p2hjbDg@mI*iiSHuRdHh z6&on~@Ob4@6qpaB0nO*VS0DPEeyZA^A}8>N9bGiU@8n<$qjD|a0f(w`_;U$d{zcXi zFREl~avL-vSqUXu-2|X=H+~)w0KzU0_}ybn&AjDct-`0i9O4NHai@S4N=27cRk9t5 z)Y^C%(*g5VkA{!FuC8c&t6mg_BvdE@uttQOZ(b?UY|Ve1(8A8Gy&(fOPq1Vt7^Jk5 z>#WkDSVn|omoa;7w|Gwf-9#?|Vt0>GD?H<$N6VnfPk4Gi0f}35#7}~`1KLg1Vlce^ zE|8ZqKmCg5_2GVirtq!jtb7-j0MYkj%2>a`oKyPY<1d;Ke*VG7&|MDDJSobh1!q-$ zDGU7J{E}HwGTKLd-BJdS#VNulTFDM%!1%uiZvsIBRPf)nqJ3;TyHFUYk_UjPJhurb@l?g(SR z1#Y4w!hbMf(vR$6bpWUQuqB+L5N1|UDIn>Vq*02@7J}xa>8o`{$TC91xEk!|_!~7c z`$+v-jvNNr=X%tL2tqKr2%JYm0W!ruj?yLG^@5A?qd@$hq5@#yd8iCUjmLeX^5ANO zw-^6B2`vsPNqa;G$g&OQ#T+fDF$k2nK>r9UegOp_9j~IeCq5vfY>D+=PC83t8q@*# zb_jlDJw;sF@sa~&T*|QxiN-X*J}zcp?ZQd?p-V3Cjbk&0v`ez5Gfg4)&L@C|eNHK1 zo|!r86Ys`)ukUw3{LPjjT|e#7G@K&<0008%b{7Da6TcjUJ^T>DEobo%M1{ui^6G;h zsarhBO!<0#GOpyIQc%Y8{se(S?zLcy4Pi)p1f^6DZhS1OkOX8AS9bg&6bW|I5Sic1 zhvGl3ZS5-4e3Xpdv*Ym2k{Zb{-xn9Kf#P%Z+UI~4{*G7F^5tIx*y1jH^&4d{-ovCj zMn?)<+!)=1=5G@#($5b$l<3DM3l(d@W32|DX7^8umw#6tS-PvtohoedHvS_L>F&#V<9Q3+TJe;7VhGtwmY-ET^7#G%dF;ED)P6 zgUh#9?a7cQYYrrv5(l%c_u7nn%M}Ohzahlr1Usqex)e&1*~0XGe1rsDe0pT>%~LNg zwxSo@f+q%`t#~$C&Hzbs#mL)r!61zTiWBUxy4}NhYVOBwY}hD+%Wp+PN}6?Dk6GA2 zNHH9n7TVClR*E-=k!9J^oOz~06`twHP;$AOOs(P?@iz^0?cET=W*s-lZWkEkwCQZqWCjG~i>9hdft4>n> zGF7;Nk&808T#v0Dyiw;DI>{kG|0eD$QInfAfw`&*ZYXQoF})R zPve<;t&Xd9do`5ui`B4NtDxuPjjm$we?g$ejP0CPdDz7jKHm7;xIsG5e9_u;{iJtT zUKk0;<>+-0>@5|4A~y9>`x&eh* zv^BnX$>{rZ#hDm=jFypA&$~srb3wzY;Ik>#=gQ7M1E)DxUhg;Ns{33H5WudzM>2v= z>Z~;tY2%`$)OV$g-tM3iRuL&Kw zhFd)bP4iuhm2T48zFr9)JdgP^9mG$=3GZ~cj8Gs)8pw@ZOdyyyF0FpSdQigKdJyUk zDx%0vaiPg+uo1RWpw+acLiL1FLzJb`!kdaA5Hzwn^4%%1XJDTK*fE8+f7OH|B!B5K zUBVde@t1O*zt5W=C3(>mP*X;?fYjyqHH6gBRO1sK%O+LFV(HO>ri&Tv142HS0jHn? zCzyxNxNW@`k+$cmR_-chjnf`kVV{fljmsphqF|hS4rWgwB6f7^UBKQbeRYcpIW6y# zW4TQD;eb10{2i=#5SIsIm3*I@TVpE_2?%HD`j_fRd?H%L0%LawmddyeeR@ytEMm8m zt>!eR$@!p!C82;TNXG&`vFO|3 zGQwK4`s%RZwSH|c$raE>{a3kKPfSpL|s>ieOE8L(&=$~n+99@=X ze|1{&)jj&@XJuJ;%7noa>o%8eb0T0HrQzBaaQsY2$~F$58e&+laTWJ9*O+Mb{v>&#Iqi zn3&x8TNL30hXT{tTU2dV@Y0p#B%9(Phf4uuNEuyFUKzqw{nmCuuQAqs(O6=yoRJUM ztfp;Z6!iQuv{dLw6l&OGCX;L^kHSN*_LTPUq4FTiW$f^Rkc5CvGBVHh2t>)CkpTLB zxrIT=R?wjhHtgp!xRp8EYtg(YQ;lvE4yR~Wdh&()h&})WQyo$WUlt`K@-BdylHV>G z1VmMLR%jm6j6~Lf5E27N?0Xz9<^U6w#sq@3#s1BC3!h&6ozut;THe)A7K%crJ}Wse zPRJYi?~0qfLG!t<{BDdX&!~%bq=>M}aQQ(NZ&(^?6>X4k0{qSYs0aW601Y*Bn1?WD z)C;67KZ>0>94Q-Z(8@MG)`Hy!lb)Q%^`q^!)@oorRU?*Efrf&}8g01h0o;L(`=ydE zikG3{@1nRKB%r+@A5+2{fJlV9j|K1GK}5h)sRDA218xPVy)iGWLl$$uz`(; z*Gf{Oouhj;Ti?LQZYfAGauOo6y$r9=Na{&VrncR-!afdD93@^}WYg6z%5kIro_lOj z5b7HOzbs7Pjq#BIDuEHT6);|5)E8@>nFQoCV4cgQBwhG z^#BH$fM`4g%;84;kue@s`Hl#+6jqlYs;{#p7(m^J1z@E$JC%MRsVkt!$z>^MPZK6+lC*>0!YSAK^6;#OI0Dv!GNLjnDl*8j)7a!gp7`J!Q9d%56r*O1lVG_ zn#WwGn!80)K`_71!wRspW_S!V$`F zK9`r6#o9IB*dF!2@U&m^EXZUT*%%5oittA6iR5+V4dNKiYo(bYM$by}xw0oW-Yqy1KvfUn8U z4j&O$(e-c#-?7fMayrlXXj@-0J^M3Co}Tq|>B7Z9LU&u%7KSeQ${`zW8|yanBwZZ%KZcHj7^-*kel zyLS#oqO(WH^jb-?b96US7anWQYA5m94qmC}JyU>x%98>n7eKUyyI(8pwsnl^M&qzn z&~GYrr?FEhp9?TwD-7)(uVP6z?A$HVsz7nAv0=PT>N2BT+iq#SvhAP9be*{35^qAZ zjttm1*jZ;o@E-=xYZ3tjBw_7qE$ZIPR(BaeK$1>k*sIn6&>ktiH&%@jUUga9t(rhJfn#a6}}?GdEZU zd7${u7N^0KtI16ru42T&fk~94<6$T8`qwTP&dx=L?(DcC@!D&`9o9-vFOe#a`3u~L zWS)Wmj+MmiD>!R@S#-h{fBosT>A7-(FlI{Zg^mW(eUpS}`5>B*`X{6_HBBtz042S$Od=q(OlxJ)1#cIP@ip$`3j%RqC8RC*|+PxTi< z6t=)7bAa}qieKg;sH5{NlFkkKhB#dNKw+aDs8apW3?TCux>>#8PV?P#BGQrs*k`Zb zV!OS=Fb&KPrfAc|lQlYVdRvh?5i|3h^#Jh2)ce-;g@Lf6<_vpp000006?#`wDQQ4d z*lV{WM;=jo+ztRO;$P$6>&dz1BC)O*cWJTUeb3M-0Ad;mJT?oGmHE8XHfP9Zx>(dj z5j?aI6$W2cja}Td3Kr&~9F2yQ57DH%3Le1*pEWm2CcUvO;8np`H>Wpr=nAEe>%b1`o9SZT`HCDJ=cA=m0Al4_LcKJ#B*^J&UmsX2 zCy3J=Rx;)ugI|~R6@od??rZ&WC>m4p;=vH~98&Z?glG(Cz^dyDEdF=Cz;FrcOe>%6Roj%~MJZciSR+N9kvs14F{FTQ%Q3^{F9J48T0qj} zmZa+?A0bS!5Ag6lPXElzB%V|_rRay*gq=5hAJk2XZ%_Z6NB@ufEkw^v*>Zwy#a()- z+tKR0!T=Xa0S0ni;rw?2PC{QsQ*f+FP3gg~Z$;w3NKTEJ9z|7-WFjG%Ag>1KWSJF@ z>((yAZlv!@qQFgv4_)_4@>RAxIJL%;9;;ArdM?N*+2OJIvaKR*$+jjq1-4(E;0p!G zF!+#R`KKW++tC-juO>m7nc}aQ9xqqtdQSD5$x*$DgY>)RiG+y+|BW zE^EGnPxD;NbwE%9H8FV$GLM>w?dKXQDbM~=vDF8xan?(3yK zbf0Q*=U3{EXp5mMo2vD==&RLx~+!8!QPWDIau#uMVlJGDSJyA?-!ZJ4k3SFHdJ<0xn}F07N1eVhDV zW%d6dGVJ|AOB{+;7P5rT<~e8M-4;?e>}&MEy0_hKfF-!dP4*#}%r@I)-YNz2p{N-? zBXWzZTyxV4aSkXw=CebOZ}#w?_6s%qAx9G35ctk7So*Zbh;<)6eVKv!-)2N>P~ak= z{EiMRE1!X<1GfW2dQmRn`FsY&buz(7MRT+B>dP#Ng0w7n61n%+z*XJrU)26%+Y9(U z=BW48RDyGMk&v-{5Fv$kpM!8ffoOuC3amKZR(Yq#1htU5rHr_7Bl!WmDdI4nzjToG zRqSBrz7{%p9PlDpr&P>``~mF34Gw4V;*^j*MWTHvN#e$ori>odN3zWwPwYv z=YeH+SDAh9QdHK1SW*<#?%8y<$pdM$iF{d0lYJqR{ztKvZFk1H~V(;trp=@Ljlb+(K zknF@CBhb{bz$UO<7c?hu<6q`MmZmT<1l0XNXKA}n!Fe?+3hoKBVywL|6`uZgz?4SX zIVZW&l3Jp%E|3CLY$qf_r=7fGwiYchSsKC<;v2~TKqktAfDBEFvfBhl_}Ye(N!J}A zVEYnV1XY2PG|>3qPy%Fhax(9hyg}fo>R26-g$oh)vSR&jXj^-iO^?0(&(wxzD=k)z zj3C7K(oP`rL)oK5-|x1WG)9f5U$2JIj1dV`^sU~A$bhm2&AvOK@LaaBVM{` zFq$QQk99EUcIZ)PFWxInCP)Yle%e;uE}yhlw97)CHNjw}6Ce7~BPsP7E{lIj6Qo)$ zJ;Ctr(%Jm@YhM@!q;@)$E|Jddo*5l zn#rKaV`zS2ZqmZK8b6qbNv`Xj_h4B)?8`@LfB*mh34O@4z^|HF63W>eQ~v>!-1I1T z^$W}m_w-(^`nl;7J-lk6CNWae?DQtjNK#f(WPVx?TO@X7163-lp{#~DAHw1uVP=h; zIKX_-tDcj8r2}`b?X`bDyDjP+E%7Nk))LBG&R$z7A5lbp!z<7iYK{eIm;Uxw-`k)n zVMmWfU&r473QRB2pm7yKWr1>Gtg(Ty`pXKZksEg9Ea2KRV`p?sv!JR_Jcg4`5;~$q zQE|4i8qyofEZ|d%lbEX~&(8#qPZW=vp|ilQ#MGPDpZMYfa^W(V@CC6|xSoS8QO7%_ zXW%XOrGr)E&*P)?Wf9f_cU!qUPE~BJMK{lUkdKM3`wsN`)I1) z%>O{g$sgV(M>Ld|`R-FZ+MrBdv8_)^aU~=QJsr!?08j0UzdSN8pLIgA3p%M>H|rRx$SZSM|5RJx zDgFm%Tm9-tP>HGi1h?Xo8*6I-93jXcS)7ECkKI@RZ>~+z{;^Xxa4kZa)lQ38PX^fL z&R8xo<~7JenRW|n+x4&qa&iP_jC)QTm?LsffiHqE&iM5l(w8*g(}sIwzM247k^wA5 zu0aN*G~Le6SD2680)g~M5aWX-XWXF#LfyjcqN95_DQI|l#{SpZS2I^zn&2A4AfM#e zk?1`CC}Y+`nnXD^Z{>gXC~k0WkCKQ?GVbF-08#Ryh5h>)@>R181#6OlPg?A4vd1b(b*B^wXhvgDvZ zuRBchIwHnMeQ6kc<7zTt3yS+DDVB{-_D!2f>yF6#SCH(gv9IKMv1EWmHT;Iwgo zt@E|<2aUaJq;a1(PWj9)oa!pr*n^aPzySJHNU|`yeoKkG<356g_L@^Si2F}!1YIFP z+oHVQ{J#t?97ClR#paJC)@nSA0>I}lCQEyyas;LSP6MItuK4uf{pMi zQ-@S$us|%gDBKDEz!<+F9y^ zvU+wFQT)Vh_ABh8*%a>f-x+U<4ct3960_Mif&tigdeT&s^qmN~d%rKFLunM}>)Xgt zEFzJHo&>Ym3Jk0NS8en7_mA|cX^y3)3I`U5XTiyWVABH6&KCPR2|ina*|fRo109rw zVsOQXXe!p%e^jT(SLarymMMcC&z*)ehwTAget{x@5Yeu}bGNI1Q^B}|z}^_9y2tKy zmtCUa3^Rw|?4nE>ChQi4aS3}px? zw{WbO2@TV6Bfc)eY&F1mDI%{!SZ6<5`Gi`F+F4J1{uMcRQQb>Yi~Ds6z4B<-%&@+r zE+-Ce20BeKQ$2wGS@C6E`izeNS&oF52OkUa3u%Fr&AkVB?DGG`r*Bm+LF6-1Edmbe z;BsRy7U(Uq-D41>CXqs0$q)bl003in6X*&HEph~K$p^D#mItaH!jlsFJsIi*F#pm4 zJ0e$$Z_5AjbEOr3(wrYp+KFyTBt;wcpeB(?-1IUchl!osL4OO97aTp9} zrzoDysB?Xj&XzK_PU*8$)p|^!)iPY1`_)UU2@eLFwewP|XXpL@T2fG3kuZiT z+ye}(2>bi2m*&D}f&dAVnzlt^D_|rL*F-9@~0HY=Mqzs z#nEHWO-gK_#GdUk`H+u$p+Sxnu07E;{W!HR;)ICF>~USMF5vBF1kdkS2TPwo zZ^sW$A>Jk(+=1d9$~x31uc45>BP&*U0e8uP@lyAH4l!^b2_J>L_Lm zzOB&7H=zVc*lj_ikoC42nmOut{cIn7ZHryEL<+AA7&8o=)@}cnHAQje`_95j>c;}F zm7kwN+hI}V4}=e>v0LN>+v7no1T)WLu)PGu(ZMs!{(AsDMvS^46LO}Jk(j%vWc0U; z3{W3ZGOE6$djoQNJjCEI7 zY{}HGob?9i6?RL7y%nMdkq=Og71*n`WN&m(&0Y6opCOmu82NKor25%RGknVn#u(25W@ZHHx!b+5d#vi!4> z1kQd1QoYJxl*pJn+aNxbz}`h1aBmaEAlQ3;RZ~GH&3cS0O4g^zp*cC#7C(&Px-RaH zpgx~5f{YWyM*zDGkm2>))UR? z=IC4mX-4#p*v=XL;?4tqeN*NGsm+|fEG*V{e8BL$%Lj=vk%{Oj==Y3EZn+Ztniyd)#C24?&c z;zHl5VV7MI{z$0lC&!OImL(xT;likM6S=nbVpXXGHQa=s!#X~fB;{l+zq>1ywFLcD zqzjc=fmnH~42(lgIIzt;YL7@q{YOpGV}do@*Spu1WL}aP&zcfdQ;~i3ESngf$HTm$ z=rUQKi?%k}p?+JH7_a_)`QnU@bU@{A@ab#@1M@@0*8oows^Cqi^yvM`Sf=aM2reL@ zjw6wT=U8+tg?(17O2PzWeq3=bCZtonZhzO}G|(-WeyWz8W>}gbeqbU@!^IokvlSXC ze&ZaA?CdaTuK}mA@BX0glU9h!66*m0#@0uIgaFZ%6**{%!FLs?ruwCo8B0_tx)u57 zW^7?1#lF|k_-`9q98t`P?Xm|Qs9Ztrdw#eCRo2jl*v8@Ga^6WK&I&XTFQAUq{9YE! zbYf%YbwG{@y*c54YGm5F6*DDd-O#u}HtDMJ?0AzidP<}|^G4;)ei~lV4kPyTg^jG! zA*{>>Hj5bwwu7{>dJn>*@#<7(*(oBrdUKHXb?HtuM;v*jwpOS8-9G`--A?kNV=l`z zgvv#HSNYA}eS+9=xi6J?l6;=`!-5e`ez;spf*b=ZIvjCs)=3}$jiV2+SsWR_gR+c0 zylYcuERQk&kCuW`fSeWUkCMjuDIsw1&c*=!7?$wOqjas+@T%f7P3F56-OSLH3gTiv zMZ@nGgiYaq3iab;TU_`rJ;X1uL9=bP*D^}Q1p%U22mk;82o#pMic-`@ZzYs&dV<|4 z1OxPvoES9?;PkD-Tj%2jX*?JX&s12Yfh&DBw9&?a6 zP~cW+V~)8y_z(&dJ9SEs;{r6Rh|?(yyvA#^R+%lQ=tF5ai_9mdkV=S*W@#F2oVMGi1c3d4h7dGYd?h27JGrF`A0WuvYtGW)1~~ z-CUOAf@gxmJwef%GywNpxyJ{V(^$w8_&Sr93iF;5x~@Fwt@Kiq@6guzFPd&%|E3_$ z68bMD6GS9bD3QT2zo6ka!2#8xRaDjEuo<(=bmk+J?;fxrh-E7WixObSz=p_rrYIVN zsb|s74GEBfsWzO#K@=eYd}ba4O-{dfSom^-FCw+#kkP~xNux(x?Ifu*5&U@1xdy#g zC}F>czg?f?F#Trj%b<=VBk&1^K^M!3*qmC{flA0V(jBuZWitKaSk=k??wCd=|JT-a z%))$R2on0$bVb42TW&pPWyCkw(tuEbOhWrC7F%ZUeOp-m=a19`#%T-Gh>#)mD39Ou z%mY>DCBBU2E)&uRpD8mRfopz^p@-AvhQGb6yeB?GZ%_>vw!s71wlsvcSQpgX-+TQL zC2PCiBK123H6~23qyc!8-gd6p6NsCZ*&7U;WF*`kDh-N2?c5Yff{znwnA>a7QHS4* z^yF=?R}uLJ*Mb5)9?1vWo=-Ns#2^jbjGFk#E<{}V`XxnzwK#XRg-Nt+1!*cK@x3^J59GgX@;ld>!P2syjS3E7YgRi2+3MxoMav50 zIh(Y0OIDL$V*?~V2F4>TS}{07r}RF|@Z=ut&(&t5_k7oF&=W7+c1Q8F8}U~9g)RmE z;@~tPS2@Ogyqjq--gwi(3`|>qG;W|to#m!<5a`*SX)P4Ozh_yL=29_8*xYKL3{Z&c z+cn#fDAC{$E9w#2rHeYtujp`W=ndWwM~k=ZqeX1{v9=@ZD6njN~MBsC1@guQFP_!i!QqSC7$?c2)F zW(bkQi~SUZ9VMBXPdV+lDfWmuiWU$3<<^;+M70^5#=)eaj1!w7Ov9Z~-_>@xb=sFU zOTDxrKesFLfDABxLx9uDT~YeE3TZ{;kNu%!hn3!QNRI;@qJ2zKSG&78L6wa420xrV zg$$%&08HP6z$X}cLq`6-{~tUCQyPla&_T6yz(Y0qV1?Kb##o9H!fjmRHVM**7=DV% z)SxbSY}V>t4s-CI!B5)!I!Gs{?hF4k{kV?JO%etL-#p@1#^2WU9T<#Lh{LxAx|a%F zQj=7wR&!k8vL4QHOZEV3F{~-inF^MS2!41YGAzP?pW;8 z{cQq2R3$Hy!EsT^LuIQO19B)QRL5;iOkdi=7<^%5Uu0>3>MY)NWW(f#0f! zOa(73&0j=ZN;|Dh-u;=9g5xH$X5FoY(c|Luc}jxC&zYOUlwM*Y$BMs(t8~xNE_aZsQhd$QL&)=cyYi z9;d+m1Kt62^)`)=@eOW_#arPRE8+uVhQ6SclQQq^bJ1AAZ;`m3r-H-%nXZ9qjQ#by zPl9n`;a?T zsqIdkEEjFP^P)wl4aDk&w6wd~CFL3@+x8XW-&onvHL#F7_t^e_ftkjnm|Ls?b~b!z zYXUqCzhv(31K@qEF9f2_V^3sBHxHl{zT+KT-Cs-kKIhOCL##MFd~~iTUg}A2`IE4T z3K&^n}Yth&O&Wy@DVH-#BJX!97N-)5nVG0DA0BkYD{Lzh-;!YpGwUjm*_Apk@SK_ zyrLqVLadFhioj}{;1sZcLQGabzO6K$>Ps~!pt$vM`~t*4{mPpmXhWm(s!Qs=B49Tr zE1{<)a`7s=e-p!VPDmjj&wP$ow7S5Xtiw%s+b$S4K>0kW-y%`g**L+Vp7ygYb%rEy zDga;U;PYgP{WiDYe^(Ll(0vxNH08+)M;=$K!#xIBx1 z1TJI1x|OI+RF5=yD8N;;dCN@=V${Vm=n?4%`24Oq?X_c>e&lT%1GeB?J^APL>R@M1 z2CL9@Rp7YIw2|RLfP>3bWAN@gB-!LzT&n>wK(+!SC`EGbzVX0@Z}1!_asg?^%EUCNt02aukz9ILKlYz z=d0?dcY1FTL@^j6{GWFzF;h~ncmz5-fkMFd0&%XTW01uffgzkWxv8ZigtiI)pCGyL zeA_KnthXJ!yRcKDdX!8Pl{=_%#tBmoIFK~_jrDa56C)d`cKDBg{ktqubi_8K)S8`A zc*x($!W}Bt_`>>Eq5AJ=*J&-wRHvf%1SMNvW(GH$xP}#%fx zl*ew5j!_d{$TJQjy$v+IkxgljKs=&BIDvrf}_2m{c(uDi2X%SUDA9^WUY2MGupq5iRmg?bC z+RCq;Xg6&2h}X2Nz275+?o6ohXP@TmjPm5{j=WrF8~o8i5|b3Ujnr5Vq}Fg;Z~W{z zOc91q3b%ZM>mH~}q>CTLV$5onL7M{O;c}kp-l@MNnw`Qy?)4vFyy#T9Wt?atFi?ug zjJyKT)SGBaJY*x$gfJMMo^knUXLTq(PJZ$2-nC-T@{(J1RbNkY49{4)&cJ@M8S5m7 zT-F<~u8E?z*ST=0l2p1az8V@;mi)g_{lB&yL*nU(=g0&Q@yB^usRB?*@GpU76V)UZ%X0P2!K3=jEXAxIK7>*vXHlI2lLLN}G(Cd~ zaz#A{9xOQspESJOe5>g}?leg?OkUQ{qDeuJmI822w6tR=;j*9aWuHo@Tjq1J|8Fxq z*Z1U`{pk4zoIyLK;}FGsa@7FJ3a&67c)b`!n+h8F$mVv`b_I|S0lI&ubK0shJ6aBd z7kE>xt*}8AX7>JBUDy6ipW`hX{F$* z8mMnOAC;Ab+mQ|dLy@NwWl3|O9Ihbg3Og)$WEOB+(%{as#$;4E8op;;Br@-3t3mUV zXo2+QwRpY2oG#+otb?1oAfPn0Qdyt>@m;W=LzV7x&cX-5h!)08B?$+P`+`L4@b8vZf<;StJs+%w6(iWQz&8*op6B877`i@H$^o!4wUG{ePE3ZKU4W(m7UiMmGtFs78 z70Ed)5yuXM(@q`IOuv|?cvlk3j<6w&c{daX$f}>Sn;iMV4TYSb7zKqGazUOs+lD@K zbRL6R4llri?R#w~HIb@k-iB1z0h&Kab!|4L(fXz(JjR(jOp_tD6aVd0%~tF=`&b{1;JuLBOvOOIr0 zyqzzc@37&VaDhpUSiQZQ{-WK}?OQV+Rw@wUlLQtsWHd?-o~PQ&lVHql7Y!{x(q7Hz zC*_8ihO4h?x^}U~9`69TF(*cY3lTv%vK5x!?H*y~1)OSB+w(L*G}4@-sy zX*^iBdqG4Z-id8Le@;|P`UZ{>jo-IKOw$@VL#q^Ajx5!km-bjEypwVRcA>S$Iu)iO zSCb9AuPK;I`0xDG%2{5?!-ZfsEM78m3$q=#<+&oVk!r(X$D{qjiVU`@`glol-;TrF z)q?@J0&w$c8jSFa57#YeHxqZ~QoC*>msgxvD`)~8xJVow2A=^=g>*90`p*uN;r^8? zO6am*o)60VQTv#^6^t7R_r8vT(%F3B>c3*kC&!3Rc9vz9$%wkc4O9^;dR*JKn?TOyxiOOZ{=Lwu8Th0a>qXw30 zQH0n$sgwfDFWwe574GLcy8A2!4~e+nG<+rA9#A7r1BBNeDoW31^-HU!4=3O*f7-Az z{ZYjcq)6I02US{h+YTmsDkk)oO0`Eq4H+t#O*4JOl~>Q?EXUo($F)b2T^tAhF}wtH zz#{$(MJew>TvlCbiCZ;(UY}?(62AOs>1D4pP)t5DnLWx7z&@KVcz*8h)KtP)ljfYA zA2?z>DpFIh_P$=ecr^y$qB1&} zoHU{#SaDl;1?ouZq9%Swj2=w@+5K=7o09A6OB+X|VCf$~CS+{PMK(bXe|#1aZm1da))8;Har^@X-I8^a(t=?=ddsh;dCa9X(^SHPeB)RV`+7Ua{&?dP2 zqXqFc7Cmk6sUh9tjD`ZPVQT6ZA3nY`>GsiOk1~xiY!*JA6=>$HE_%$>RVN}H7nAio z&4C@kFG9MHVHtdl8U;%?Jq`rI;&hL}o*8i+)8!+}U`@o8ygU_HyZ>wZA!Wcc_u8Ks zXdboJ>6D%wUoCk%uOg(dFJoct_2Uc$!^%w^%LwM5UvDi9!{*O+8xM88Ls{gkhh~@LeG(0skK0Jy_*XYyRAx%(iwoMbQg4R! zxbC~#-$pI&QS_P&+y6mo7v!(>3Ft9TkcQ7DB$`b3fnsXl6C{IlI?A>$HJnRxNe(?+ zn=;mI*}|z&GU=9x!Sv=Tdt={m5byYpHqV!C&B7E%!&SLGu1t~w016Vlt`zRL=K`7$ zNsXS{mmGq!skUTTv2qXNt3)_W$FsYi;kv5I)>hcM4MOGlR6ilr9a?ZNAnkNqB29w) z7&cQ_5N@L|2L|~(iA}o&?hCAO`w=EFnE@%`@7lNztZf;$jg$3J=v}Jeewflt0*~8%|Z=rZk@gdxf21d1~kr z)vWc4A)}eblaLZbSz4&w9nli&a*8|$Q!ct2lEY>#dat$Y73`6yl*VMujb7;-DU1Tin{Q(!#QSi;p(e34V3Z#`SC>~1z3GiYw)s{`;M^$ zlKZ{(OY4t%i4Wc&+Ychb^|yPG#i!_i#zAG5)CCHV;s3&MDnesdY;5ug`uh++1&e>9HtS11xQnU?qbY%k@)adI@XhgF$+oV3g~**T(qx# zmcU-(#MxkeWOKp_+1gwJ@i|7iwI>O@P|uFj88i?WkI)W_jeDy&{1PYn#kmA8n~X*N#C3AVxAgF#C5Q%EN3 z`@XVxcW|*vL7;M3)hVHv!EMmdtIjt;9KW>-m7l1Sm-mtc0j*^ z6vBJ2Z82IxT*>S0YW9Jy2m zO%mHk9WmI@JgQ#;--{0cj_tymk=_7>%pvvMznUDS*tVEqIqZ|lwL|TtM}wIFs{)f1 zhurJqv1$huT62ZTOO=O+IaAtjz)miBvhKzm7io;tUqL2jzk_29!cu*#@4!Vy7}LxUW*8_ar6>*5q zGYeCYs{V3d5K|^PMEJ$9Q@l`|xPYLxmy@$8uZ5z|6iU{*?HUXaNG$-uE9-_&Lo22* zneb}f@cl;DPJ7`$J`22P-isI@kHm3cCbw}qGAKBbn_(jTWk7mhXvjiMVQzC}CNC4> zygHifOQ0-!(I6g~Bi_jEI432kVCge!^0vjFZX2-$prc8xXFQ~)VFzPz)<&PU5%fm6r~=ZF$5^1TMbLBeDT0s{0mW^70CxB6 z5;`;W`5W6!1} zy%LC_l2?%HK|c3b2BK>Ic$zS+%_=QNlKI#Vy=|j|3T5!<0Y+ znL2CK(hjgJ{|y>`(+TE4de`)nUs=~IQq_O)c!+4 zh(uW`kT|XVZv^t>q5U3)8Z?26fr~N>qcereMk|Ui9y1_ukYi80FDb) zu7)>1>!bb~|NOzi?dO&m!}K#Y^OAH^xbGdKo$O}}hd-3Oyo@$&U?)bgoKNwTV+WWe zkvCx&j&c~{k_>!?0(5=J=DB0=NFtC(s=BtpeVG8Bf-{kQ^#>tcNahSuIHi5hCDOnj z1_*-(b!&hOG70h7rC*x}kVd!y$2P^%Pfz9BmF3pKdr(!FC-lr?!N-GyWluO5sHVg%GL& z2gT5=nIWla$JT#!=&c!8%#+JouR}g-FZe^&8I-UCLe3w6PEnYOH#&Wz9A%ARDxm5w z#|zLpQ1$b+r}RN|YRTMpHJrha&u=~RFD&tRU%aePCx}9u^snG z^53Eb@7$K!e|M55F0rkbm!o|(kLEUYC<|wme7be;FA~o2koQ?HFdsAx+unAicGJ}O z-}ikJ7<+Logg63$5QW>yN2p1RB)X_@$~x}6sPs=F5=Ta^KWUI-sAcbhi6E{V7_|TNKS~4Bal! z*vR!*if=T)sUARr^9MY4O*5^;_%X}}sUk*;moeiLvy2o^c3TP-3~ZbqQ}-VqXTr!} zGC^xqn!H}HT$Y8rol!v0DGcC_A@x<(E%fDvihmUE*Vk=CEaS$=2T!!I6`tRUHMy+cJMSG`#iteGZUfL>O*I{*3AaU@7bGIWvYh~_jCVZQniGbW zlrzawOX6LNoR_{pGxAu^py(FMMqsT`~j z_eKOx5omgf943wu{h8eDrXmSq7K=>hb$|pBFF;$&RSgV61pF1_*Ze))jj#3u-N*}% zF%pmJ$jId>s{0cZZmwY+X7Fk;CufSz_wE6vt!W4tvc2xu5_RNXYE47YGh#6<{FtKg zwN2bw?E;|E%`(V5pfl9`WDVugENh!An?)Qy=_y0ON9F>$+%pP@S&|lMLhLZ2mO~+~ zUhK#1@YQ*pXR3+NCSrB+DS)>|CAZq}KRY!Bbd(16Ji=UMMezjBQ262mR=<<>=lo8w zP1c53qehv6VMLS?eurD8`v^C}vj2woN;r4;l6bnRo`uJd4h#b^=hzEdE4|j{|1$eML5TBw}ns`Hu_yqvlAj9ylJLy*#AwZ48Fyj2}#brHnyMcv2t7cf~Hnv(Y zrb33mUKA1VR7{u~2ZJEMZpuw8dh}>9h5)QABv?MtwDYQ5M2mvV&r|_jfJr-$Ax_ng zr-6(;I2WV_Z$1xB8N0|^2M>_HZA*VVv(;>K@4#N3n&I((UM!bQ?=?#kO5jF32|uUP zRe?pU@UvuGd+Rza$hj7v;A1a2@7LAE#IV=^03+DxysG#}pwhp6#DBe73Ib$r1N&U2 z(+d+AO@vUq2DX}kAAy+Rb*XYN9QH4>3wfViv`-P@6H=3gzh>6%wyg|Nor6^Uw+w1r z{f(GuoS+LI4wOCs?TTTblf(KBbN?JfGS6$d{nvCfO%46Hj5VLp*HrOR&ibEgx!7W*njvba$BrUUDg*S z3p4*ul@1H8dh%sqyMnpbEK_vVq!PLr*Timm;KHh z2N~#eu&ZO|V<9w0Lk{YQC^AiHP!6mQUSQ#Km3@w7Up(6M4L`f|VK;DJyOo3s9wxDJO*pXTPX zA)b`Q1BLHX%|%9;e!Ui=2we7lX##*II7h{I87+BVnkCaqU4hQNo=G9ZG(nYV)GLa& z#OQX{Mvn(Vcogj_HT{tXY*oMUXkDvx__V?esD+M1L}GnSeR;cTbD}Vi9c{3KN8n1~ zDbtfvfii7%;8zC4H~AnSmwB_7Eri%)J)>n2HIEs|HF~~WO~a4{1S_&(yQE`G@CZKM z(x9(*atT2d2oZdlR18CFJ)Um~+N}-=w#O)r-FflS-n{CBy5%VJ;;QjMu+^6x&$^^p zu`|Cn)f=&$f-=|rh_xp9L|?m6Q8`XDt?ybNNezq{lZJp%{({ZtRtI~-a|FDRKP{&4 zqk#}JM9aIw_yhfkHv7_#rAF=nPS^KNq`me_YoUaIAkoS7Pxrm^|5fH`v;u_Xq~UM^ zBm=#ED6-VVf*+yhK~YrfZYM3B9>|@*nsGbH5W2kua5T4GWCy<&-~2|ub|+u%ZSd`s znQ@zk8N1f%nY_}0^a^I;Z)K7mQLcz>-nUjHUqHlCU$)onS38P&AEI^6qU%wP4s}Vs zA$JbV7#DYEHEWi(C?elFiFk=sSAx36Jow2d>kCIp#&L2pgBA}ksY%;dt^KWXx8V&7 z7xK*I=|kbzjV0G2Gu+4$Yx?3XDTBU*s^>M8rzhA*TN3kgdwrSH&0gRCcpD99h>!$m z`s0LRxIrj^zU^Y(Jn;aZWwA&4#2(l`wr;TOAWw%>1;a8fOAE?{bRI8RXO zHL3Cu={-OtOMl-#*VpT=i?x6Sz{RaouIkz_@ybw%qBu?LPNu1pes|V3H@Va;vB;BA z{Ej(9lb&Eh|IE+kleN^AD8_KRi4bGH#d5HftO={8xvQ3glr{nPuZipG%uvX*TTcCp zYT;RBS6w?DZW2GZbU{d^0z*#2ee;2C0zPl1^D-~5$JC7~Vhflme(FKv+Q`~3Jx4$8 zF>PnB6NfO-KDxIPG=v?TU}(EB$?X8iGT>7aW`rOScyZj$0*OhG@2#(dPsn52zLe1F zL})~Jm)nnIFqp}4K#nQeCBKVX*+zy+4`J6{7NenoBx>Xg#EYVzZDAwn!R%>wfxJmX zkGRX`3G1PEE!bD|{bAKSf`p>2-fXf|7IMkTh8fTlW!RE=o-TtVfrV|e5W>F zwFWn|XiBPf60%01x)q8U*$FM)Lf5Pa3Ul(=&O#wWhkC!<7tyy1!N)=~I1~`2BSru# zta~;|^B@iEWlkKh+((v)LovyQR}#xk$kCSF1EFb)R4>uScV^uIB2GFXP}x+9XMOJ8 z)I*Y9doX`V;IdJM`@ou|E)$5q;S>Wc%DSMT67w%_+EXJi6?Jh^$Rk)7>YR8?H-2Ap z=y`9QFzP&P&#DuUf~H(Deom-e!VQ&^V&@kP#1)BtOC}L-B*M>iAKqw0ui-SZBUZ05 z!>C^@Fa{S&RLTMl3oPKhEny}5+B4vp%k&zRUbQ2~hNs`+1tqLq{zF;_q-3$LhTjq3 zDp8Xf*#?|b-B{}BL_AbqKTuhwtz>~BHdCk_Yg|c>2A}i34f&BZ`Xju#5@k%-AqxUI*>V+oCp9jEc;6%PW82|3x!&;D;=%al_`-t_%@8B6((Su;?7Z2$!HLrlE)l4K z%LSu5VCbIGELVgg`Q2;OiVlLB826O^+5nOz$mmp~CEhyn-z3bsUX)d2p~R(d!{j0t zh=e{=hP<+gf&+1QeV;vk9aZB$XR?A4i)(RW#=7ZpYvc)pTtY82SZK!{X+Nl*{V|`6 zFc~cPGn*jAu2XLUiN8i|lT;(H>!X10o2Y!uXL6IprmTgNr!Iy67%m9Zr=r3^L_ zI`eIdv46p|SOshBm^h+kf8F%FK2Saz*qTmS{AUJ^5cC)PWbVs^{a+MvLzA)~X6W;4 zYMEunPVnqAR4>?HLox0*mT~(vm9ZNnk0YWL`BOq#<^<)9I?2{i51%HyzNci6R9UE? zPPn6u&a0^u$SNlk+%@cg31<}Am^%x;I4o9`v4 z0FxxcUK;VX|JqqTt|kMgp2ilkd$}vPbHts>q_}g9W_g!crdzVsHbx7#6S-oLTP$7^ z{yVE|IB-P+Xr+U;EQ|{P(j=}AF0rA_v0$w0;tgFNtXL9aic9l_np112SP2|TgXg3T zCpS&}N=5cM2y!*e0adh>bc9GuOgASp#1p$03Dk^gzia>Ujp=-R3q}4biCEk}K?5<!lEGz)~<4NmK9#-9E7O54Y z{aqDm5Rz6L;k|Vhzf6JO9}ITo?J3W_ou+dJ$B_44%3$F)*g}8dwv=@C8<|r(-3(LJzC|YMWnY6eJwO30b2&9xuUSFyBAI{(5GL-*$%;vQ+g-!8& zD~TbrRT+5;n>nCkuyn&oGS#Hk{2Aq6(|G6RD~f-F=^eB9-EKM&KM3AR4QvcylTx*O zOjP&|RKk!oMXakx;xGTD1-!4J7>TQ;y)Zfi)_Ls_zp`PP$7Csy+HPH zDgayvz~_b#@x$V9k4vJ@8$zpXdFcw-Aj$uMYFY7$zIbELa7(&nX1$m=tIVOh8=f zCpfG@L31E~r^^%|Ik{tTeQ4%S#NGc`Y%GBq!bqD0Td?Iu9uP$m+0i8z*)kVIOW1Z4 zd}s@8CJxKjF-Z8zIk` zPojwA-@asIB+B5_N2D-QBPHxqNPz4L;NoV_&x}5`DgVb|to5JZjKY#+XIaJ4mnkI` zkTyNOE^;bM5lC_dsEbLUh)J#NaJN<^sWRk7&&6CF!-tVt?qERy0_X$8dy-E{;i-;# zi^_K~*M}T}c_W6jVPLB@a7n;QPN#?6u#8Jm8us!ovR7a2%A#=uUB`!AGa#0X#19r2jsaHn3qDrf{FgY^{&y?cOT)wTY?L5KzBDsvcAbopd(fM`_oUgP(Lt4Ur zr;*5pPtWhjIhVgC^Bj(qaW}Ui|I*ptTv1ncYi8KSiIYu=C%2HE;R^Md>0J09i64W? z78u05wWt4?H|#-`%OoMydJ93t7nyN5OSEj6)lB#II%6LJemhwBP7nT$-ZIn#?UZO= zsJ*aeU*9ZE+X5BV_DxZOJplRF4wqIv@Xka9U7PxzLTN0)3JA*3sZg{jLNe=^bjq!w z?QsP3UBv_2w#|VCvRVrhjhK+K$UypL)@iDZ;IrB7CKirds#r~QF>^Nilvxfrj?)N&eD0CB!bTzfDwZ|W5ipu2$Da^X&GWe;d z_TBgE8G`O)l(V}Z_@NLjj~?;&lVvH7503F~hiE3wiwIL~|DhEM7@lV`a`2Fn=|bCQ zDqik1DTN+J3bIW!b}5xw;_s*aO9n3=tDQRQ5}!nAb>?SE!;Ppf+=q{^>Y5oy-Foy# z&pqv$`lu=IIH_5%K~1t1-|_|eX7f7hkLd4b-gK7rCk@o|iEN-fd^lqu8fkJ7(7(vr zq-y@CE|yC9vl!o4xPe)Uw+yUU-T@mUcX=F~=dPo>1tW}Qn0=YMg|h$hFUASWxm6WY z{e0jF{~ESjs?4wP^&pIBR0%d5BvWbTl4x}uaaL8&LBdCEy5)RLHu-B&R68@gOO3Li zQ}?L#i<*RV-W>ogZ{Z{t?P4fuj>kFMv9PWi@is3kU-fO@x14QNuQj+5=_-vw(WbkF zw8$~ci~@Xdg+8OPn9E`6kQmJFX^0c2B`8Lz@E~Eg%EM$&ndo-MW~;|V4X})v*Upgf zA3IW2OwG$fXLm_Zcs@V#&q54&-X7|GQl6?Kr#Q{M$9x3l>>Cf166V6^OU^iSZFE+! zhL;1GLEM-7XbJP-}D552wq%nr5y z?6efyGfvdFu8oN2@NQVrxrKS%1!Y;Hj~K7OK_4hU9Znv21doA_7o7~Mksf#IshnsZ zjL&5fVI@ysC|-H*P?Q&Q3t`SLYV3MP1r733WDhx^3>**;WRS>Z5KF`=QyH$w)|_BN zX06A_n16IO>4L6TP%&ZeL2)(lr>*rUIwf}JZhTGJuu&Xy2cZ4SWcFdK>4H1{B-~N0 z#o-_xQJ&N`eN1lo3j}~+dozx|wsc$IRH{xA%8{at_C` zzsA5FqL6J8q4{ItJoLwoIFiCOXizi(OL%s%&PeM0xobO|afXDw z{+=fSGJrV~^j1goQA_g-t>`3>fY6+^E}ozfF91PEX9RH%s;;qvo-uyblqw!~{R-*g zsi3TCtd}*9+;&NoVFs3S*LS>@9~9(}21x~N&mrw8+|o8;=71pxK4<|lvb%}R$5Aul zx1QMjI`N?EhmThZ6spBUXP-o}`%B?XUG**%`Ch7-at6+akx-;tp8Vp02lTxBAs1rO zdY^UK99vHmCaN1q+O;w%;7A;W-Q64npAAnS|106KYf9Mwcf^UOg*y)Z0XMjxqI1+4 z^Uc(NhF+g@kzYIM-=OS9kihS}I>zxKN|vE+_1#b(UR{Af+l|TF;CfL%P!2C~5s3dw z(FEjN*}AZ#Jq$qYta~{T)t%1>50ILpwN57iDKN`4UvATe?hF>))H}&(ooC|xT98~$ zTz7NYTuKMP*^3^R`XP*bFV_EkzzDM*RqYweMkf({&LLhDljN%D9up{PUpAg&u9|+^ z1Y_F@H8RyC5<4`2Q?Ptj&ATeCVG0GFAD(sRiQtSkm&us^TytHg%%ye1Cs@66xp z-RW@R>s^0yri*juV3KhYg>sN@{gD@{@nW1yaoXkxj6e$cv;HyF4qS8=ckKTu-if1tc1zxQ1JcFvNoFdb z@D88`#T}oE+r{%v{-_ut@Y{o9LiXv>#B#px*q&05Paz#N7nA(&=xC-2&lwi1u$|C< z6wwQHaM%^-N2Rp6uvyIq#EZ+mjwppcj`Yq2mcCtMvPVb4{!(1(+v9o@hD-k8%1%KV zxc#~)$H=pAR@#8U3PO&UQH7fmx0q6}C2Xogkj9LbmU~fRv31_o>D$0G!%oPix>TO5 z1jiQx&k&4;pakPTPUZTDlPymJVLR(4!NZ+B*+de{Ti+;yB%p2}5J5F@W^1+VXSCMe;Z-Tkp7Y zxKU=H#7cVxIVbqD4U2t%#4=BDDVCWLnXt*NBU-WAP^iwlihL90WrMMSt%qkx`W0zA zEtzbE0D*)8Q|0vmSwTOiP3U?g-tbiCIn!{Z(ZZp!rBrTWNBddzVY`NDuHM}F%cy+9#6Y7N-3YNEabb$$ZO9n^F3-iG7gUaXcb5^ah5n-ZXmo^e|Z#THpb zPbEQZei6F^4};51&T~c=v*fYxAx!@_O^=|Lqu^K_x%4 zewlQF++(Y^XRY)Kh85)V@WxeXB4Vt`dS<$C4;{0)nO1J(Zi^+ZO{t0c;CHjo&r2}3 zv13*RX~Ga8Z_6(Mb+>DEHcn6zyS{$VP&aB~CX|BocbW z3{ntQt(4%S*Q1Z-CavML!KQr_C-?1$P1xK4h#p8;R4_ba74WVXIak=`RrAfSK-1{T zuU3*fvv)$WR2emak`D`JEhf z`%dwCdk?GD(<9BKytO_!Q;)AJPjXj`tqjoBzy5v0q|!&Q9m>YRd*FuE~O7B+lK+~jQa{P0BIzmWI)QNcr?e} zfObtuk3}f#sp=>!o@>bKjidn9pBk%JDDiqlk>CK#ryN6DBs(?!nQQiQiD-&FA4Tvv zW{mJ0bWr3}Mqp)WIP~ESR^W8p9}%{G>5pO5t*}Ya@|9t~^N`7&sRKrS=14RQU~ztJ zCADDT4?s;{8AN*}Mb!Q=DKd}^HrV+Y;QWe%q9Gu|^buI0t}B8of_w!gVof_#AbcYzI$;lO*?4-`ad#cxM%~U^#`DKQLjdQ<)wMK zEkROO+KBRfFB4#1M?s{3fz_7(E4KIu&e)X<3JBGFYVi;j_o%Qy2-?nMOcL1s_#na0 z=iiWQR?W{9jl*vAHBr`AaM_)epr{lU&C7m^2 zOk>HCssa9uzpzz7lODgfeLueqsH``4F}Yg%(V0s!{{T&lJu-iAYLJ z!}fj|e4;5OYxc!Kvv5gnK#grAS`t}Fm2p&Z>n`T}y6mHWq!7<*i@p>lk4;L4AWZlr+nJ>^3geeWitzUaB8oquS`6OaU_^V19TKNKXxwUlK5<4U zcn5B-LJbOlj&C$6Hl6`OvoWP=_WU!aJ5bPO8D#%)Zfo2kFTE^boM1q6qxLeH$rK)p z3!#~$EBaf5SAzqr`v@26Jo`(f>EF+Z{36xCz!$1T3Z8{vIYuBak zd1RV(1{T}*9@@K~zID8ocB$2NQAF9Wi2$7%oZB)9^}Ra3ZzaXI!DlwV>i%KwiQem` z6dYTj#&f|f7QK1K$e8&oU~+@~g>8dR!BSHXkmzz4>&N$&>TSc7zJU*Nk2p6+UDfT~ z@xK=aE%hvxU6Gw6an)|0IWT!M(vlUJr5Iy6>B{IGJ;?Xq1h4=pGZSdi-q0t+h+mCR zcaOkQ(w64Gj99*Vg)H@mPR91j%Q7$=*YYo~&g{e@5wU(cJ^bEgR3Q5Z=?i8(6lSz# z2;%qU*eA{fS0t?(4{+_G47gw+9@*{Ve;lAbkqd=wK$&$=LD^H~|8vZLxiit4ktKq( z_PqD{7Nr$okP|8hO~I&MORcTRsboV-VGx3?s5QIyCM90j)$c zVLq|thauhx8)A-)-D>tJ6}EhjFq>ED&N5{Us#8uLGTyJ|dK`**U7ooEI}**t0>(h=EH1-TMy&8_RL?pl>X5&JWv>k5SKfGa`96DRL1 zFdRoE=TjgBUo|7?mcOi-GM!XLA!31kb^zh@`fDuW`IXQz_SeQ#kJNSFzq1#&>cPv* z>M&4ML#OWIg@2yOv~!@gZc@87qH0p?fMNByx?b&RKMm#Fn zTwcARV`2y(1J}sHA#w|Bc7>u1N1}u&r2w-O>#`QicB}rl#?Vh9HsXD!X6*buX$2lI zSH1{H0P5|`>A03M8)PyAi*qCjR~pT_5+7E3Z)??-D3g6(yMi!K7-Q7g`>MZk&E{<& zKYo<1(*aODH>GI3oYl^;~sW@J&FP zKin8@S$W6&M_c_;q7QOowP_=~sJo)Xv$)euv#$8y%wHjVMt#J{j0Z9Ny_c zIK3vgrBP=%lDKd4k}CMoCZTjbzuI$N(}i0qJadyuIlJ*-2(-K zJ~oe%78e*1ZWx%jlP3*HMmJa2@~h6RyIRX6iRHzE0i3&}eYfX4#w%h77oOdH;RNKz zQG$b3q|N$PmHW!u=h7m2CZ?9Ssf%A~flus#j9axzb8`_o3mI!?Yve{&pwuT^0O`GELdGnXw+!_CEN<;> zyGoKX4=F>Z8>;SVB!8MrPqjNo@^?t`tt`EKzzv}#D>1O#e1~V&Ks$)=ZRVK;et%G2 z9>EFMy*n_>+R>H&GGt2;UOxi!t?DZt?QECrr9?f|eO6&%Ny4k^Lbuoq-|0bU*P3#j$uMc8F(u2izeceJNm{2(Bhh=a=J}1c7 zJ+ca2<#UB#N9iHO!k9d;3a#c}q>AK`yGurt0>@`w@qWWr^FEs#6pZwxR{nWXfCukp+k8kD2JEV1=6O{CCWa^>_vih zSC8^0r6KH8l6n+WWJVUAd%c@-wl{rpxI(VaM2WOu51l1U@Ff+UrTJL^6+r4PgT?i) ztTkdeHaPjQyAFO~j0tZ5Wm4rDaT@I={rTzI56zwp{0b4bRL`&@dw@P1dSPzZ1$3~2 zT`f;TQC0wo1F`zP$;k$(^hAGS{372kVD;71T+L~2& zPK_IMJ~?ZL7E3L0M}mDObG3{SEK7PQb#&%@cmFupEd3_l-?LI%0c@2EMo;azvT$SS zv3pz)45zC8L)BK971oKZQWF!4M-AkwkhLf99fXjEI*)0&F}G)y97;0Xy}nUp_Ff#r z&%Q1qq9<#{pU20YTkfMesmsQ2GcU$;sbk#qy*oxAe<%v@;~yD}Nr^HT_Ny8=bss>d zGZ{G%VxuRi3py$}FWAuJMVP&vE=IAC{}WX0>n#dNThkCCtkx>^aW5d6^97{2qOVRt z9?uS$`}j>?^OH@ePjgeAcwsmv8V?iA@`clOR(S3E5zs?4e(z)XZg}bop&!CHD=WfJ zSWX5Cz?U0M5@}VY;X!{lCYHnR4CO^5P;YL7s8M-KD?V`kpp7IUD*ReG`1Pt2iYsA62p;-0oX{XmSgwDqS zx!=WLuaTcn7@`$mVSo@Cs;>e<6g}DkoO%P8pIZl7`~w8|n`}~BC{Y3VpjSAaYg5#r zdOPdDF~<%25p<|uoX0w23pzkxg&$I>g?wv0BPvSQj^NOBF5Z33<8s`bFvCe~ai z3;`beuIZNtK8-IxD=$t~!){3mxg9St+7YqRi{bUkA$>(AlkHo`(=o57Q`Kn>lmWeW z5P@Q+OZNA_1@MNSqS#ZqWjgD+#xPp{nD`PMMU-_$mD*RoUrng^VctE)y8k(c>>VRP z3|4D@rvGIOj_}p8g)80@j~SIqiL^S!KGzITf|A=oZGxZUd%;&;6Cuif?f z69hDMPFk~C(SRFqYn-ap3pKz3?tVKmFWC%ls1g2;d021e8!od$%pA}TQQ&5j0w%)= z(~YW}HDnk->M;+V>#h(=;H`K;kCbu`1cMkN1$^@l1eO1r@m}$|UD7Fhe^m{$1kp|= z`%$By28&h{KM3`uAh&OvQopsK8gPJA9r==Edo&w$aiNcj?K>*j_9}k4_(da@T$b84 zCCH&hzEQ{FSpNOIC$H)!KC1H}flCp6UXww5uq^}~v9Z%o>-eF(CJw|wugXm_O}gL8 z^~;%mT6#Kc(i{lC)FH|sPQpu2@8RktJnPRi$&ibhkNOAta}$45%sX~{roX5kF{^C5 zFVYsgx&1cdt5U^Bh^)T}#qSPAECBR8=fhG-ynuZ4n!$T$u5P@oHbS92c3R31l8h@; zD`OcI=X2b81z6e;@YSxck@C)Bz0_xG#H$D`Aep0iOps+sLEI~^*J{SRSMwN;6wRse ze_d+WBfecAU#tPI$c_&jnM@XNAiH}sN>qB`@92ekKd*Y(D6-$&ob7Y`$0j)LvoHKf z7a5UP)sf_)V9S0}#06=92s`o~{Vk2Kb2d*bzffHs4u(7g>rr;g3qwv7{xZIBWt@Ea z*AD-z>Bq6rTyY%tkfHJTS3wQTA35s*!H5lMRVqV*b@YZsmgGM|Cr7lh#THh(PM&l{ z9Oo~U*9++zMdChQ#+t-&@q~|lHQz0r^jDS6DYNxjXd{^NiS0&7%axq}072mFhY|Q1`=^;4=>b9r4l_VfN_1U=<{5raBT|8&>jq<1g!s!t)RL6`sK@qU4%ug%$;1T9ag0{k@B@$)EeUKAfYE|C&ZR z2E%eT4BV(F7V`UYR!U)G-q>#oE&|`3EwwX$-Yl5a)Fl5U#e1sn(FHM(zK;@bn|IU; z$BC7n!a#Oym%0+qWxmf)Yzks)X%cuH<`Y|Zz<|WOl`EQM+F1U-wmnDwu+Z6k3m%K$ zvO#CgeUYP8lz#Q5AV3`{}2l@Wwak{4fj*492 z!}?(cX-*~yps50l^Sc!tYTs2f^cbT{1zG2MK%bOk9$+J|D^OsQ<0u&bO2SvlSt4Jj z@5NMUI$+!xND<~bT{2El8Kv8JSS=D*U?!|71Jn zEo)mj=U#WlGw$c^rm&1z9EZQKmwlJ^LG)}WKg1Kns)VY~Vr1?{!$mfcx zFf6YeKua`nDMw?WG2}2#0@*Zp9KZko000aCWsjcc8`=@{eCqX_?0xd;RUi846enPC zabv@+@_Kfal;OxqE99^v>YXOINWaU_SOX>f;?v4*#m2xeJLP4;wKy%~9|lh+C8&_; zca)SIS`3IG`r9GSu$n)a#b%D0etuu3P$<#(_ZeAbSCpV)lWQ!T+YJ$Oy6jgabn}im z083D1Hm{;dwkOEtdCKrb7vYGcyR!Z)0!g(Zu$=+HmsNAK0?5EwPp2dR4K5kcZVn0P z4O3B#S$}DD9yzyz^En;% z=-t8yg*Ie|PH_NMWLobT_y@5<;|~NK`BG6fsr6GDk%L>YWlZCM-uuV>4^9FYvr05G!=P$K@(L6Ax0c9SbD7TJ<-fM*F=kr}`j_OHY74d{nY=8gs*o3fd z{NvV0;#|Lwb*=f3WQhP^K%c)I0zO_mXJQ!YMt-W8kMIkfu zVZW&stwaF`hJ(o&Vol<_YA-Qj;hW6z3YU0LW8H!JCjPl1meHYK8~-VS*XQO?^IItJ z*75!7F$1c%HPsAPXKlEJjwuYn166RZSnP1{{$zh16B(qb!$Ee=%;dAh69(%Nay)?t4J(Jo7H$rdr@i z|J)+EwXPSKZsmKP=K%R8!B=BSaQ1|(eV+RN;?+RcMG|ynXXJcdzPh!9%;}l% zvupBhL*h8Ksl+7>ynZf0hB&KMQj2f3z%~WtYg#i)u0y-^nYIuDxi6LnuRB&Wxl$36 zizNSV)fR#S%L?-P9KJ(~lxfK2Y@Hcbx7@amuWWWoF`p6(&tLp{4&dLy7KrW>ck(Ugm&%{0E)Ap2r9H_i z%3Lr@`ylTAo>>b8s-wxpi+HL%;;#`hC2{ltty$Y4`KOmo^QaW!$H}|}uB1{V!dAMN zpI{~W<{JsOYax^qF2J}nyQzm#*P{X9rOB_rDBRmX((n@He?c5UI2%WVeQDoktB=4r zLL+`^i#SZCrEC^XEXljd+#fy@Rdns?pdgRTj!UP3@;)(nT8}zfu7H}o0=zsv>4cG9 zC_Uv|FKkjQR(_;h4z#Jf3VLZA5p=3}$IHnAEe1JK%b3eH9u|MiOr&4;au`p&=91pU zWu&nGzQ_Oo000;*c#&)Z{#AJbT+o}sOBB8~FCm__Q`{zNDn3_+v5)o!5v{|hH=aTC zR*pTcoB1M{_X_#ie|kLg%a+Ca`eQ^+2tAjKu;^1(Vc-Zw2=~8Z2rLM(I95!U^NVn` zc%d}phf5#gG4K8h00;Ywx^7LlNj*jR^v1`viui^Fk(0(m*Yx)TjOE5j?>p2#&6wKB z`c1{C<(*EiUxfVx2_EY<#YaYSC0cyLJLWsY3i39#2+U)V)%JYWGO?DRY$C+@`#l3d zR=n!DrGl?_AvS9w{CzzcGlsw* z=#+I)FF8=;ps(5famXWd>6vXm=me^3erl=m=6>)9aUS?1m>R!qx3 z&2K^@^De!I-nuvgm?_7B|EGHmAzIl0 zkHeaMeE(q8_GuBRO4A7OX?QmozjJrV!ZPJmek_5{l#9itrA_n)}j{!=&{ zr=4Mmjt~_qaLthtBir0f^1>C;A|rWzwA={C^Wn@C_+MZjW;a{}OqWeE%Jc!gLgP

    t%d3e@{{k8-y&VOESr#?eG=kA}*I@@=6k*RD%LVi-cv&cjLc?@sR{f zp1cApfP51NAVo%S8Rd8`WI5;1&uCIQw}i`3bJ&kmySCKs5HbpdSB9ZL@Aq#Txa zn!!hh7HO>zwWOVy+X0sb^ffKvVM1GM>SwT1<5RXRxgsavK*N$XHo(pUL9+4L4HK2V z115yL+??xO>@&5gR9)R!YRIM69oTPgn*W$VCz>s*c~dz&N|{oo;F;q+lh}xK+oBIa z6hst11Lw4TbJ2^Ln@?HPJHgnIMt==FzJ1sR8 zf$ElASNhB0I$mV+vgMi}61pfbXjaargC#xBOZ>*W*3F#DL6s27IU!`vQGl10Y6-{h zSj$;HU%ur73s*E)egP zI|4J=C@UM4!*hq77$X9=i0Y3B?Jx7ByVt0q|6&kL2UI{+?4(U)=ma#6r8f$K)-n>h zXn*(wzd%|Y?Y!Z+jLN$i?~qt*!h`y^q?-ITyQHd5475<{Zx|R~qr~mw{N5|PnxHae zQYhzkS=KcJC%C#Gmycs~yu3D4cI^lr5n_Mt+*!IUb7NBzXO#2uQ9gem=HR|IC3#TD z4)7DDM$GMon+NB_Z+5mRFO)W~#Um9Aw$x*@fBSUtC5*Zw^y#|E|O~0#& zSL@@FJ2`K0q1bV6vaNZg)!(myAK#y|{UEGfgcFsq7BLC-QU{YxYZW`35bIs#S62I( zFTebql;-qOK!_IaR~0%Em1h}uREvex;KWXTa^vT^xn%cSyPET1xnmq}eabGl&sDN1 z<1x9BavoHMs?@<;^Bb$;W@)~6N4L7ZGk3QtX3(}%+G);Uu-P>wG%e$F)KR_KlPaz= zUSol*^Dj5eFFYph;a@rW2UO2cq}}t3^R1|vuNdwc_TJ)`vX8e%V~q!mKvWZzR|P40 zI&9`9R*GP^LsjCv1WBq(2}U8i6RzC(;tCroC)u2w_45Y;4dT@7qfE8#o()ga7MvdGtT4XtKUkjT7^$3BfIg>&$2e z3~RS%e9AYb3CP$|t}FU7f1ezZc1F7@iQ=@PevKyLtpSsmL9McFXF;o^mzxqkc{0@m zO=>#ayV>lJEIjUgO(iyQ31kl(_yppuZSUfprO+H+^tjQw-7l3klJZJR1l_7tQM{cT zpj~ka!zO=!&%X_-kXUZ~anC>twS@C6ZonpOdkV5Pv}t{-2kD(*j3IOcz4a!Z@gx&- z8+-!IuW~%7`*Bg3zNoS9hk#qo>2^%Q4S5d3&-lO>Jb@q!!V{eOXpLlzfH{A-{v_E+ zveO>f4F}(x-Nnw4GiV2FVQ-;l^)8Z9j))QLD^ z?@r`UwhwUQ&dU*hV52Qc+1^8PW9DM2Zo@gZgiA#`$jX2L;e__jNf+wSgX_(H1*dl1 zHO~I;!R+5NO@Lxpme5nNl62s0^eJ3ipZvznFbSU_n9jY&Zn6i*ehm9y5SP{7+N#OlwZ~1n0wsEv zIxMKq*Sp(ua`4PwWq6q0EK4QnB@lk9=4~v;)~-P5ML{>e{Xr|st=g|-_+~|#Yjq|- zSLkxP4pp^b=O}&EyL;O$RTp#^R+;Q>9h194-N$bad5zU!01gJl_p9*zp0!NrW^g84 z9nlnB-^qtkCggXijYVsV9)-KNV6gPdkN@XM=VVz^>Ys$DoVQcyO#6u&!D@Aho(uwKwE5Z$*^|xhh z<^yk#o?`p|-b-r#|FK7HAFB;fedf9mKb!?VI=(n{^YrFV|HG3aT%ZBLg`@^jAWAMx zH}}2ch~rr62QsC}6tfKh+yHuo4FCaO*6j=g!9#cSkL z)f9|&RfSz>j7jA9V3mthw1148Z3tL>*g{JGNOtawT%N<(1kCtOUZ4qOO3O*#2zxe+ z{n$w3MJxGlvIkB~qunT4;f#pMT;eQxf!ty(W>3Jta|bonu&hetd}d)ssz6}9)=zZ; z70I?F9dEe!2&5rFg?AB`Y!st1#twn?#nK$F{C`!zH~Sb3~X-xuGCHigt_jS$pCusR>ALb?{&-^H2R@@4#|8~2S~&GsU5cJ+Bhyl}?o7W_Jw(FXwm#a0Mj}n2_Mh?PpBTjC$^(-C z@+CTyw+oX*kUd_eMNqW7Fr&8C(VORGC<*Q&!XZkecJv%c_G^*KCjzK#ce=YScAM;4 zljlrwX6bC6EW=4&dx*dE=Y2=bt1`(JFK(yA+WUNH#i01_)>2%wp)***657>@kP1D6 zEGu?ohZ;g0>(p*$9|KFX_1{f;6iAIK$liOK-ADRdz^74vfOLbk3=qvE&x%L|2eW%* zEuHE0808JPcEt2s{40`$$7F-Q8?1WSRCXk>-T-Hm9L+f|7t!N0ZTzLM&Y#T8J$3VW z2?;%IL5IrMuu&1qei0{WZ}Z2dk=>v}E&>)UyL|SR1gsGCtLycuHO{6D8qFSwGT}z% zzKqX@GBh z?*HTXeF$LC^tqaJ7g#d9CJd%6(V^fqbvlP7c#z^ovWw?;TDNi4uzAD|uO~C}^Z)|kb!z$HObN?rAeF)_mT?d4 zJB;cAd3n9nj33;EHD|dp;O8W&(t`3}546~TAKP)0p_o=g22RS2C_X5l00Zc$w+MUjT`0CzL%I}yP(!PS(3Yrm0 z4lx+oGAG%s{6P2Bu@=E-CvNeGkiUwfQg2WH$o%6%&>2ziAPgmR^(wg~sJ#e6NUU+?tGjSwIwv9l7Vi=x zzD59{=Qr@3lH3xRI!rDoB;oup9~;7(_dwv_ba`y1+Pf_e!z9wd{-j6C3v9$K(|)|{ ztKlt2NuIuVfNPU-JNe*zG>z{dVW-hmvaTHyF73V^8a^V{9b7=GunY?xDVv)0oCkbo zgtK=g-IEL}kN%Z$j=F}h>)U+NHSdyFtUVgJg(G567KrlsfWybTJS}6wvnsg84>j6f zbQy6Pk{ad|yzCju%KSfIo78Q#-2;|T?TBF^KFmEwq4+XcnWgfeMvLmF%R z`-quf#JvpwXZkLihpJ*vsjLds^t4SDr8x_%~G7`y9Yb!9su_Uj-H$WPiM2;0e~*^E zC-1ZGw}XY${+Z5x^eqt*Vlhkc8@Tt&*0R@)kRoF9ZgxITv8~$UAR*lvgbUumTC&G5 zH=_ev=AM5`=&rXq{hEM{F5z81sEnY>2=l&l>pBv0oA0)jebJniZ++49wcjW*w%z!V zhYsB>ixd)j4;XX_+AM>0gMM(_U{)^^Aq=!oqn_cYq)5!rvj=UC0f1cHszdiXud(@8 zN9fj0J(07(>d(Rufq2x4Y2DG(KPl`ncxOI4Pa#5o4-XGgatBFPbcyfmReaq>dg8Rr+st z5PwTBL+^I*8S{1yso$()=SL-E+}F8WrNVb1xZ%4VB_d1L5l=sg@tJDd-mBjO^Tjw_VlxhOckG%4>qiaaxMeP-vM$?2n18W0^=bTZo zTR3k-VGZT)v+*td{E7)f)z zi2(7$?FxH1EM57$KJFh5;kzRi;-S|@Sz-)6m;^WpjfT}zfANMBw)!2(`y^yiUw52j zS7)#Dv&|Fl!+l3tCFKh)&~+h(qKVQ`r8d;nph=U2()`iwFZjS|yQNZFw?hm0H6%cx z+XkAgVp>0`!Vc5in~-~-SYb1gjnzSLYS{!G>W$rIs4qWUM8Y$&uj#lu3&-kZ3Q-#Q!+qc=VLh%In9CV6} z?9c>|BzAW~O-)RjnpS9QVk3vx;*kY^F57DfjkgMHH7qdZRE^2>n%@v|Z_Gh|6LZy7#^fguc+K5t5B zUz2iTcu!Yi?I4LY+tiSEmZ0t{0- z!u$>_q5O?lboBz>oUl#eRU4-of?|@G^b_uD%S&Iff6+aIDV)zG>W)qJwgb?`&|1i0 z(_#ulF!dWBEH-|;cvpTr5vi52)G>7t8;_ACqoD+rWWEUPwfPj zX4mv--EkO2qVj^xyVthmUFBP%k3}xt{`pT*8$s*@0S`YZlOwfPR!x%G*Q$za!j`5t zirJB22ZV6fg<>s6mHA1Mc$8>9Z77dW*fln4VCm-V8mURbfP@HVVx@zKi1SOtb>Mq@ z7XLp#FCi&-k*w`mT*KP4D{yM;5*XYEmr31|{33zU^axgCzfYZFy;m4;HyNwV@|QeP z1Z|-4wtrP_;kh(o)FF0&03FXDY~|)v-iJuaLFD&v67rHjY2R-)U{Fv>-A|K&&T(Eu z!XPFrPAsAKid)YYx}?>!6dmquV^A^#ZQdu#?@K#2jKs*6L{QPUyQqC`blM4oh$G~> zU{YF|B`i%#Q~&=&ITIedO8iiNplw4m<@5gkI}PLj)?YUplN(=17_)yYXgy72($gxN zPqOcA#4Gs6NoH#sbtza@8S`0EXQO%b`|9-0hz!GFv&p`#lFmQ8-^`eC2l}vI@J7AD z19!R*IM_{G!;k7exxEDC*r@;Cb%84&kKTr8{_uNOt#aUu;Jh+Q2UcH!?4nqd>fhzy zEKs!RBaiU1*1m@W4T=^%>Tc78JxLA8atx@bcIGgZJ2)3ws~j-UcjZm)+PqG}*C%@? zT855h$u%I{;H0=?7eBbKQ5nphyW-bM3M!)B1{4H2jm7HBFBowbo4fP?AR9lXFMBP= zNWBn1v##S)CO@Zc?09*}O&Nf(fTM`k6*-v?sAl=tw%Qn_inPp}21Zxo#AUMYFZIv_6_z zHr;pdn+%=#l;Cye!d)}4Y{1OJk@8-lq*5h0G?6TeXb%M5%)Z`&8XU24I~66qD=pph znTNBd4f#+gl{>QfYnH`*6$u%X&qom%@sm+)*;ZGMl%IjhxFN}J@wFxM=S^zBqZn8X;&V%aBf zC*&CMQ4K1DuOkOzJ^sM?B)0GJlF&7&l4B(Bb;QF#q@0xa^HXsH>{F|h!%y_;o*Q<| zgpMTBvOlb_QW_h!K2vBsf1I_R!;FC?n_~1N!Wre2fv*-aNu*urQifa4IBR1xM{tPZ zYxKA4`#b3hkK#$UqJA48TopT@=auCZi{ zh>@{+c!Q)xrL%XrD)%cTu&AVKxT-bLkIGWnNafe>Nm)4h3!xWo|1bRO<`;160!Yny ze;@`I7sp6y(a)Ht-kG{Y#JZ7A>$WM;Y)XkV;sZZ=ND!I~UQJ<1LuSE?PDBZbk_f_? z{&Ue;Cg(2X{{6S6qZX@Fhy`Cc=u!LncJ_QFWC zC7D|V@uw9S((i$tZjyy}oUhs>b%d`Kd*zNEm7CXbGQUSFlGg7OT)5POQJ-^$4Q&%}wpzj|MCOlP3yAX!kf=hlj; zQVEG)HS(STpanB581T9t%DrHSnB!n*)TDdH_|>$|#r;v=nvfjY-V&_(=6>ntNn=@} zF(y5vGAwUbJkugm%S@Q%bwt#&SMqo{;e=RtR&FFEK2ko z{f8=J+;QaOa}6pIO*gqsyfc+fMraZMd_z1K=qq}n;AE`^H=O@JZTak+&gm7^WUbT_ zK~7!f7NKnQ3xK0;FqxNGemj7tZEfo1024=PSBc@ia^TCv9tE3{Wa-$5UF|=Z^~Nkd zcKEx#*1CUYN!!iSxZ_)>SdTPO;g5mZSjVuU?ROxA2#<&PHL64aYXTAT35rdgb(cJu zWy9r8R&I$&s)7t9Fg{769#2qHBNTLu_zHn*w=(IzWulUl^(Ne=bea$uf+yh1Cn89) zoBPIAdG(+j+fAO8>Rk(obj_~N6(0g*J zk|J0UCv)@e$$v`m3YwfAy`4d}>+6f?pv?{PLZ1+t8~bed&-gS8NB&_#gNSUo3@Rq< zPu=hwbGT@SW#DFX;4YJ8y&A!e+hrT3K5;2U3Q=xg0oppQhg|lED%%mmrk^wbrK375 zfWFW=*%X^6V1f$wbc>D>11MH`_FheYv0^5D9f}l&5^{`GV-5lg)3UG0nd*Q50011u z&CJ%30i_KlOpt?)g{vbv8%BiZgT+Y$>VDU$WqxGg7-q6H2zJCv>+rO%-X=8GK3}HJ ztKUo&fT7hp>SsTI4(ia$5^64JwRYX#Ikw&O zCrpjm$yz+-QoJkJ6#YdvzDqL{8DwUXg{*%6o5M|mCjG?(fj+rtveXa{4aS*WQPi>%aDvA_vlYrrrx?0UiXf+YzY_w|A?a5p56SKcfzWG? zWd%=bbvAD^X(g)K z-FGB1TYP3L^i#;kPO&*2@aZAXFcuPx<>t*YlsX-^ zaDalN;BPl=@~ftfv2Kkw=+iRz*;l0yy3&a3TvRof${rX@LG$%gS` z>?z$5OLZ9qN=H@4V7&OaNJy&ZOI@iLi<8n7LHsoas#%(BsXPogxNJ4VV8eA1#g#TJ zhxd=OLsQr)3bOl)G=Nt7ETZ`%Le8H-o;X)6v8}uxUY&G8eR|17sJXzKo;4gP|U)|l;)Pa#u<((QA(HvXq%Yu_; zU&g_#Um{b%F!>1d=t7bQMnZydx&<8Z*6iR4t`{=e^;9{%|vFD;+~ z>7hcfN*kiHZNEeD7&qg@;zPiWSxuZ3jxw5N0QFDb6Vg~=gtlJM!x#5}h~DGF2)Nlp z#P9T4wjAmf5z`(L;NbAppfC9QZ>wpzN2TOi*{b&l(Z^@lM~q_gxsnfFRdit=i@~^2 z(>DQ>A%?N=W$k_Z(I}BAT_pQ)^#Dqd9wR5*KT#dAvJ8|03cF=4znRlSh?E-^Sw_{j zP)XcnmR7$KcEW*Acl=#Ry2C;PO|m%&WUBj2remvdZj+H#g5QQ>XBuJXvtpT~?KE!2o)*^Zg&}COW-ZD_ZwsIK zioiV#$?aH;VS6*>$0>#CkKZ^i2C4L<=p|&wLvQYIe{Ka1BR=uB*2$&>1#2iwnd$(U zwrIbtPEM-fUzA)f?5j*cUa^RJWc+Br*AOpl(;M9S5{4RFiU&7sN2{iUKS??%FLrHo zV>d#Z_I-mn4eT^4(+M0>F|`_$y!^u1sN(ixjv2SWE0{e^es|GNm7F^VLWm{AIdMAP zSmXm=sW)cvAf>rziAliLw$T+M`jzkD>i^D+j#Z&=N zott_#Pngx8Ri`#Gd$t2eJfp>vtyY1KyXahW+m7E{(VQuZ2c;#rlcPT( z0OmodVl6_JAb(|$`n(Y191#dWLZ$zLtc^*}orxRzfJW#?HyKT^~S%V1D zBeBQF%h~5O2hz?d z=tak>QPo@eKgvuCB0=sYo9ea<^C*Z`uIPd(5H~V?bpXlmHnXZfD z0f+%L7-_BiV)7f6C~)D4yrc^N0000$K`F|~4o#`ec>8II+HGJqX4wM{wn~h2e06mf zro%w*>)N_i(}=XPye zNH#$5p6*RZ(LwjI!e6mJ(xXc0(5MLSFz#e-N$3c;sxT~krKgITLi_nlwCzpEM?0h~ zs)<(+6djpQD6-?1@S4^_hn2bh4j_%L2OhSKUY07vsXTg%-01VPo>V^79EItMg zf@F&8qd9#B>+Oy4eg30MdZ9nvbt8_$m-+!|{mZ9Jj&#R=t6a##q=I55!y7XjRsYNS z^IE2Gk=J!&#s_@cL37`OnekvyEk3ja=Y~T_cO1U1kO2@<~8UfEl@XQ1FNTcbxI)g5E3 z9)e(Fsj$zCJ!4u7)`C=>N%Yl>5F1ZXKX~>UZ*j|`-81S?qohVBZN?)iD-XopEK1l? z75Q6^I(;)5XI`=VHhu!%@99CPWl=+mg|+R|g4@_#~Qe%@=a&S9Q%rOQ4 zajOjJx*ZWXi6cFfHYm(^Nm1UX$y^rUQ929eLJt}yF25i`AT4JnqD=0SS5JjVUs4M) z;?T%GKv0`*s;6>JwBn)8s6U{(3TU|;Tv z=WgV)5+xt?W5M+ix%b%TSb1cN^6Bf9EEIe9i3|Tz#&sh`q5o5Y!VMdV7}H>uhu+a_ zaxv%83dec_$v+D#67tQY1QLysh;C~){KQ*L^z{l_xP4=1HZ+^jBq3}0C#w!K%X%ns zyjdct@r-G1;qLcmpsIH)WvKCwE+HGvH^JXoSpTH`bqMu3xbh-49gv|bmOQ%~F znW|^$-XlaHWAa`{MOGnlXDoVec~Y@MRS&tgSQ77>3S`A(>gPcyQi9};JA!I!6pJC& zFeH6ZE+V=2O9~k{U|v5jWXZ%FV!BJ>fol3;#k}hSJ5e~9Zr{=IIvGtm{`iS;pX6f6 z55r!#d`!#j@W^Qm*^64(O&3Tz-!9@xY1r#FdSk((I3}?oK+6$^8&z~zPl~elw4=5w zbR(qRWMU+)P!&^cL)-Z|zSm>8akpvni{f2K=y1r5&XdMb9z0T9fF2O1Fkb_cJ9XlY zP^|r9j7KwZAG@Pt_XIIKr6xyyA#8QGN_O39zbA7Sn9@p2KG3N_vbQhNz(cZYZPBs? z!7DXQj%8~6Y`d=py>3bimtYr4JSkbWQQ7yLs?}3ULjevm5-K$;JBu(Eg9hj*>g+N` z35>k(LckLcHY}?l6Dz}!o#%^pEsQ_N2z#Ezru4A=0d`z0D>y?05Y;-{?M~xnbxM#K zMmg{q7h%kVu|i`{L;oWJj2L&aK)ll_*4OOl5{3`+>IO^RtYZck^THETg$Nc14?GIO z-S#vXE5;Ax|64So{PUCEEXPFwN8Io$?%cZ+&O(DUrc2%I{WhG*%4@UsY3Wz>ep8ET zZ5dAz^u+HQqSoV}f;$vMF;0M9!Z2yslEbwt1aS2p)2*mbxrFCW^q3}DP2*$N&-iNv z?C6*tcg(U{zW-Uw{8IU=PSK{?MhVffGo~)xez|C7dS!7^nlmhg8RtAW6|Gae$D0a> z(1~2f*$0+^yJqfTVIk;ZAHo_mr-Vy53)9t2vL8tGSV+2^*10g25TzkE*5;pJjvNC| zH0!e|j^ljcjfx(!!7W)u*Pk28Pn(#lmbFf08cMV$ScJ*5O_&p@qF9k3t?U>y)IKYO{$H7lB>X5K_8gssb=|T{m}=*XM&_+sw4X>A zK*oJp5x|(VYD@ZHtfd9mS%mMo&u@PM2f!E!N+GZ!5_fR{Q~AHSF|GE29SmD@tKNV- zc?!*62mug{?_dR>c}acpr1y|jzpNxF9;87$Q9G)l`h`yi(9 z%xd81Zh6+lOR2oq+2_h|etCeE2|*iwo4bBB>x{NC?jtEIUIrEU?6ZN1w+!dUfy`=~ z|1;j#O$&HU&d%$l1smK{wbo1kZn)fFMo61>^Rq+JTNG>7M!T^oX3ghA3w(Au5r05? z%|DT>=droX2Kt{<$?OSO;&asj6(TLh7~JPT>wSOBN@CzZw;bviK(QfJa%;32YaV*M{H+GXn5#{1t!h&OR_0%v@cA(q}Y+$xV$N&&=uvQt@jWoP}cltLU`} zUw+kKv_%#+x(vibX~4qCJ@L-nqm(MKgYS@)el%P)EN1)g%2w98eLm~q-{B_(i%C_} z3x=|^OOsKok#OEM=-F4;B)RSuEFldesa%McGVD2_aePv@6nM8rk_7!9WlG=k5^iNZ z#?j7X#P~q=f@&Ew(amOdO0Zu*^;FwaNq0FJ$<&Em!zOl9+ZH+Cq6=}3!pKaqoWETy zvB$}!;j511`sCBbEqTR&$roEx6B=L>kBF-9SFH4~E%ZVaItAphO5>UrsAUD$I{mh_Zwv_eFG@H@I=b6`5r^;WB zPr0DRR6OsmeNGgZTpwAVx?w4}u%-RnFVe7%tO-5a_EO`)0JyC_02%0LLUN3HN&WR1 z;w#u~jdq|`gg(Si{%vvX$du|(9^lwT@rI%Db)rXgTQR9NTAj)0H=+y-Zenyj*K_!Q zvp&e?m!rl4TQAV{W2bD7eh(h|8L-j8Jgn)pL|EEtQ!a4FYINSF1j!3N%49* z?dddDNxty_se0}wxh9@#A4y#fqnHmmYp`U8X@i`)p%LzL#_&c0LrSWSrPdwY>yglQ zF%+Y1LeJnTvUokkXSz$pNxEE~;W?tZ;Q0FQ*X_sp(<;sU#YwZ&r=Dw8&v=zRE?R3_ zqkyY@IDq zhLrmT1p*oLT{xtjy$>~bD&AgJ*R9W}n}E<80yYU(l;L<C6j7D6VAPhpc zv>k=U_1lpElRpwK>p|ItvlYteuIY}?6YVE})+*TOqV!ko1x<%~PWnvGZA{c=c0`q9 z(JIb@xH&8dDjbOegRFZ6-Lk^N!aft!wdv<`ihpwYu+A)jn%0I`Jhe7;)JJjjJvB|V zWYlf@$ll{9fB*mh<$v;t_IX^yoM`qD0u-lR9j2}#gVB8#1rsL*DA(i^$p?HGpr`f^ zt+%jpBo0~1LLSA0r{sv6tQGhla6)UG1}HImUDz8RX6SoXDMi<_+)tJeYT#JygXoqJ z%#HQ+c&bnE&*=taaZE8{Ejv2XO1s*k^wcI>rrsI?W{%NIO}Irq86ayeExn0Tv-ei* zZBE3hErbo334tt9 z^U2<2o;MkUeCpZ@RX*^1B6(WxWip>7 z=ow>Cmw;W%mMRtWWH(KV8gh75N6o@m2gXwUfS!K zn90TM^&WXWko^?%yHq0H_oFOb%zQg8C2^z!hNXP*+NVx>Np^;aBO_$Hu2X4>)ce5B zr7`@20v{1Efx`SZlKp&niaJ?0H@0bP-ZH(!t0)GcP?J(Ux4G>lZG@FqpmPvVRM8gj;u zBk>QJg;)joPZ~V(3ouMaVFw;o>@t-r7y9H-hK$fAjIrNSs@KsB(zuIB%szB9&UAaQ zNxlptV2AtJu4l8bGK-}-KBjN)W8gKdV17_apNR$9P*E_)M#ZHBio7CM)&Wh8362LU z@C*3~0ikZ4tuZ(lhVas~=2Bum`c+Gp80XA<%4q|*!B#QY@uD2#G??dM@EAX1*>)d$ z6Gy0>f}SYG&-RYa2`C^`48d&g=SxNpj|^c#G;Y*nm?>NVXqVK&`rZ-HU@=%1Df{*k zCWte_qUVtquxk`$HfL)pz49SvUmQEB>%krg>Q_VXza2S6PI~D(X=^cXsjBAljN6M7 z()*$WD5IU+Y%s3VAG0bMMq(L38>aa;4K-0?Q!JJZaf$EeKgo+9e6^E_zS0t>$TOJ~ zKpEB@WL?kZpKhTjjkuyj1JUhEBNT1v0c zcaMrHWD!0p4kGdcARnVL?`B#`PU$tiYb0I}T3m5ihD@6+@-q{H zSHJo=^+pa)8}OXsK^j}mbh5+u;|rm^?YB_Y?D4SW$4?AZm-IeJv;*mM9}B8xB(1#J z>Y{gJj~$2ji<949em`dy7@nD6FAQ6CQ?oF8_dq@KbedY~-L$P)&zbIo$11J#TFN?o zkE?Ikyl`WlxmWHt*DmJ!Q8RJiS8X<({Frj+kwbJ8fTRD zEQ0%n#&1WqaI`qHdQ)8z6z7(fUB}WYhH@ljdDJ2Vh}qP7h&g2F{}Hfy`uoA~)1spO zCkrqSVde2ZY(Qu6p0w?qS_U-snx(2aPS6pp#imDLiZKISQ(+?P=pwDijYttf2(=an zp`{^=jl=3N@r+r>PDq2A$4#H%1|3DD`zhC!GnKmPW{yOmz&M?&PN*KJII1)eqFg(U z=@NO^NtDyLbd-N2HVCzLpWvrMramb`-5=q7z*X7B@5u-O&vicueMCfy>h1xZfeI`I zO~Z%1k4z=KSI$_8t{ncZ#5O50h zfnurx%^w<7p3u@G0&E|qoFoUGg5-`_{$Ulr5~~d+;L=_86{6>mP=GUIgd-CnoC1Yp z=LSuzdB7lfMO@cDaZKiLE84Lic@1%Ell5!fY1&?)xE}8@+#z}4^LwCD9?#=_fY}&| zHKET5+y`SD9S3>>mxp;9ORwQh9|rT$Yy&!;+BU9@yw}N=U|RV#s+gdVNnfy zGPE2$6k=5F)FbsFvF~mdfb@i)|B__`Iz&V<48DHoiLP1|*3i+NQTVM*idyMrU|6${ zcuAj37m9861J*sNkiS9)nl^1GNAv3rR^&57wi|#-dgcRIU~DiPX+1z9A^kF8#@AP~ z_Q+w`0~b~naq8&LGOT2g(J(XcRg`l&^~HRZyNVviZ6#d!4P3}0`^n1OiLiD8(7|7S z(gY_HfU>NolevZJrWc2yNp{~FxysQ?rT_o{OmO%dEhuDnA1fXN+>>V5Jq05Q7&B({ zwgV`?i;)8J=IAm6TT#4InTh-DcAi-;5KcRf`$``zcQ5ckv43+8EKHFV`PpN_BHPvGOC9#gKR-yhQ&|aqvGBVPJ|^ zq%8k+7IPg`O-UWoS`PEDH5fa!+MKnbQph1oUT6f%&#F&P9H!gKO%w$B*Tq-_f-hohp=${Y~ft`1{$0Hz)v z=Hl~U00Bff>&xS09&?oQc=hW)1K@R?l7_f-YfQx>WwT|ET(8JcWj#~flK6}rQ;%c< zTBYdtg%%LiS3Om^L0wBQU+f76UaV|x%#BZDrHH;(6rn@}>*@soXTDyilN|^)!LBcg zXdb4pVzh6S5_`t=l$ERpcdy*LE3*Ca!?#j#5-oUj_ED7e99Bh#^|;B7CHegegpzJG z-J&(GEanSc18weBZaiZDzYEl14%iiBMnjs+CBL+PKoOZZFMr4_6ziE zjFWaiaX(r7k|ff7Cwy6Zx!#0N1pP!7^@vX(Y3mcYh-+b5IBo}XM#lD4h$=6+SA`-W zRK~+XXV@3peIP-v6&qyc#)e-Q6!)w)Q$_h3xo#5tf%wO_)JQJJuHE+pqt34btE0;A zg%^2?=EGQ-Pzf6a)jt;iQ9!Q0A9Z~uEMDCq#=R6%*{D!B1c!zM;2rYrE|U@9ucgUY z4YXH$K=_5?kJ{j2MLA}^tcdP1*r-$&-}4FX+YeN;#hs{jaRxB=)@CilzE8jcz0p>`#)R(Jd)XcJLdF1kyb`ZJ@z3622;oj8 zEE;aw*DQPiPDOL0m?wB{MGAN695Y#g6OxNNS#RF*gG1n4;=d@guno*nr^2f^R@)|* z^43rYPq}M0z+G#g`#C_5%CVbU`V-4{XGRAyud6k}1r_rSBzZ-qK+%27e-o{!qxi*} zKu_m68yD#eJ$77JMn+%>vWE7!Q+*##L_BX6>fyIYABS01}zG&3ehZlL&-%8%b@K5?Qy_@ieH;mwwv;UcKr>6DI_H20{yO-Y@-^RpJ~BB!jgS2=QQ> zQ1L#sg4UK2Nl_VfM}g~4XK7nTgvJosAO|Dk#pb>_ zAxmz|>U2%ACs$*%7K5BMQk=oDRBhux=g4r>a_PN&{vyrtxDSOOVR86 z^|xa{MRJfHTv@}kqm!6CZoKf_j-hH8Tg}W*R!LA|zY;}~-Mf67RW&PqfyL6O-~zxW zj~c763Ahqf*YcaJam%*JrKt4}KA>^8S9UW*GDIK$i>uP`Pd@F|wTs^GwmvL$Q}*!? zyK)pKuVintgFcBZ5f6K!RD214HX0X8CJokx?g%x5o|0FCkq^Vzy-;Jvb=G&WtE#&A z?*Q~5@=~387dX!?kwITZd;O-@&26!LsQHK_cG z``tgO;n;MHFhp4r{)71S5l34Vji&mJ9Y17s>xeTvP02d7g>}f<&BVV+abXa}UDKD4 z{IJU1V;}3}3-@s%=2=Uq&u;u;HUfrgp8lL=Zw_#bl`Slxw+1;+=^DiK4>O?QN_{bi z$n2E9a2u>sA}O(-FR)%;F_<{0ZcLQX8^?6Ho0E8NqKCe4#E-wgt#gQHZAu*DhgxW2 z^}_$JGme{Pspus-RVjP0$VJioxecvbn=A+)1u7BE_NW#yy`<(_8fL7phV}Vi)NJ+K z$NFr{y`QZbcZw}Y{hMD?(5;J?@s@BQf9Rk4djtwsCISx)rbK(IA6i1$Pp&Di(o63b z1s^rav|qFm$PxGDt?iq1o#0_MpG1^rbMc58Cka$p;(nddj#~d7Bk#ZwHsp|A{E9*kul~zj{Q&^& zH>eIS&inRGgS5jA@171Zql__}SByz06ceY*(`b+LMBx@UHP$h6GM}p=FAS^khu<#x ziB*g#yXCjGU6*V%#3*zs&{l*S7jO-s(=EI}F{X-9T0DRwCiQt7ZGA5S<2_6(0i3d+ z@USPfUau#|BEc`I=sh=;*dTkusf0_z-qf*+rx>wic-1WsJ%?)JLq%<$Rq5E z3Z2Zp0Yq*=ht5fNvB9OyX(z3s=j*QSR(khHxq2FTGQ(BL#MLlYzk>bkRtKYS1dA&$?#e%WI5|~g;mA*BLmU*7H?gYeg|UA9gbUVc*5nb7)%Pha8Q>WZ zQ~JpXF+UW32(Xu46=g`!^fvPg6S*KN=+tgSvc!wIs0_Ik63el2 zBX{$F9Q#q42#q|&r>9#s%5x~AzqVdO0WDUaF#uO+hWy6N_tdFS!v`(cO9$ZbLs4q# zSB>aWpIP8j)Tc#|U>2Y#LF?|F6NWETHO)X)GB89Nd?)|$UmiaiNtOW8l#QEwjZS~a z_ta64hO3s*$zUwT*yRgwAX*o{_;NOTq*IJ4o^&`0KiSGXtH9l}BOpm!XJ-7?HvMX_ z`Zu#z0{+bVCw<{oLh9+r(CvwgggTJE+E)#zV*mgE0yqw3jpFo@Y9V+O<~nWi{2ggE zlRk&Ws(>Yl`ewEcg>yP(ZOuj>!tmr*{!eUv!fINIHsAD(%qbm&FYq2KR6@m;&It(#Vs9F)A9kuR=#q(p zdYFn%a}gpy3aV^vE|ST_OT3eViw{ZuPn6Nq#=;g(lPsG+lQ^=F0s4WG*`Zjm%jt}Z zuE)DL3XGXW3nOghixv%OXPKZ3zZjT_Ye_)o$L5$GQa~m~dVJdVRkhYQVYMR00z2Mk z4m(HYm6{OOPC{E;BYr|qvqAQKYDTHrxkS5z`Jx$~mV#B_uDycB+L!kI>AsMBZu7aM!wzV}0t_w(pF9`1C2JVw{uw z7)^8(6`Xo6SBpSOD=0uZ0c?so0>ulAkwi*}mpEl9QlZQmOoGbaeICGa|CITLe$aIz z!Si?k007}~RL`P?%G@D(NLm)IqZzEsGDAqzbV+OPgdeS(fn7iVrKDgG@(xpckiD1K z5a!#r3Kx0aK?rGE65?UD{&pG8ep<>Sc)UN_*+i;+SD zkDVs7kxMA2NbgcMH}fMS6dta=)FG|lc%s)OtQAYdF|`GnI4m)v6d6)XTt_ck;-Q2k z`0evWqMDZCOHejq8`LB52fNriq|O*cEs2#Kr1AbPrsS6LaJ1i0R#AW32-hC)@$h_< zRPruO>WmlrQ6D!_qJ7w{57w!Z2r10d$5JlZH#=nn4bE~-t!H0 zJ{mY)95yX4B8m{Wd>gI4<VV00$ykDGL7HMj$p!?`1N2LlRrA1lS0dj$C4otXp zl3DOd)vG!#aWP?ZEF;M>|A9ewfA3u!uoXzk#UtHK?5d&=>BbCP z3m$0@REb|k9%-ODmgkR~6vg9~ApY!zjzTPbmM0qCk6KnSX+n{4E)2Mnc{7m-pT!lv zInSRede@m!piWFfX6}CBt^nYI6}@V3rn)B(D;|~x_p4j4zOAL{SKPZ z4yiAC74o%du{voJAepr00O0b*rNrQ7br^s93L8?@>D{7nI+|%1`v={R`$i&HK@&E{ z(2aS~Ft99>`1TGc1M0;;_@vD7`bA(=Rx0VpZj$b+`%%D1yJk$Ic3Kq6gyYcD zFWPWu444w%DZUu0cW2FMudNhIy_^+7|5Wa+Mh~I`!hKL! zBy*Tpp-fU3Bd$P1o5m2dK&FZ|v?r-)33QD}>!J1P-hHtXPoQ^nM1h?5vkMikWtq?! zXv-iI++pMi@W{W!XMfCn{@s~B{eA)e4m4PPN~P}?r><>s%Z%JMe2(OTGU6+h3Wg@b z`0~0RUcK+PE0s938(_<0tEGqZ0h{VbMGuQ5uYdgNmHQpk1(ln(cuW6-jw%B*Jl@07 zaT&YOn>r>l8+JY3-v3tvb z*2>yVqDzkcS=?ft0^1IdouoVmwL9fIzxw>u%)0^MI{tKd|SAP$-c%(DS?;30fffqdJ>GC>nbyAOy zkfaGX(7jA5l*+f!`8Zb=i#2EA^1^4I?)W6`llsVnt+Lz1t3NA#^r{w?n5rK2bl;&2 zv#9=>>)I$yMsj#}xH?I!krfUOzIuPjWhoU*Hy%YFOs}&Z3w>A{=9Uw_C^3wn!4NE@ zq-P{?wgthn^XxELrI;&Y=*{$%?%(8Dxc2TyX$BJ?I&v0n~>hNlKBFsrWlCSeF!{FY6Y(1j#4*TUwP8lvx-a zJ+&xzH+V)4a9f5X?3Er!V7A(VnWRRNUZky!e1qer8m~%5$ z>+Tc2wum?M(dt?>2H&_Z-a?lR(gZU;J+^-5)j4)lT?8M=A(f%MZEiMbvOtiK_`Y5c zWsk^pDIk(!zxB*&QHd_+l|qW{-4?x}apmRh+z_t)qX%G{O~AI|ZVyG-Drne&gw#ia z>M0p%f|<;rZ+I|t}a>|OL$EOtFJWc8R5{@x4$Jc?!yd@I6$&PLA1 zNKXX(e!H+9P+9pjMe0&2Fh{RII?DjjacN!jD0BCw`tp;8w9Ky_7PK zb5xy8ZZeIW)mp;9L|tx-^|}lM3*rtv|LDdeE2z+)3G@)aMMov_lF+W$FjyT~eSro{ zGvqs^hafpZilT}6(~a}EYtVF>$Uv7B1EU9v-j7~S>{k)cCN3uK7kDJ+2b9V56x0nL zeMClUt9g1cA#is?a%WJ-jaei_hCPKnkK#tTeMdVcPLazucn0cVWVE zd!I9`zMd%UCVcn;z@93rwOH+87(~rV5*&4bAAW1(SxJfAD<*hXMj&|Q`*GHI=ZY2Y zRaHXp*tpq%000P#E6Y_4i_LFM*h*Pwuxy~s=(9a_2H$CH=4E#=( zJA9HxMSkJx+(qr+Dxyjw>@aOt1mbm%J>mP)hXIT1H87Ny^az`Im@Ey~zjf{qd}zuE z8Tg?kE>1&Mv(^M`rK7g_5Rsz(dYZ!HTqM*W16MnYQ!~%Qjr+?*rBH23G}Fplu2B8m zop3Vm-eB!zXRx;s2?aO%wrBK`T9R6s=E*Qr(~B?dfN_1d^Pa*r32QIzpSN++584SM z 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%0DZFxU@sbn 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

    n}XX^DK143=~@!@*EArAP^; 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

    Ml3VO9s6<#c)dX(}m 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 literal 0 HcmV?d00001 diff --git a/documentation/dev-portal/src/integrations/faq.md b/documentation/dev-portal/src/integrations/faq.md index ff7982b36f..a58f0e166e 100644 --- a/documentation/dev-portal/src/integrations/faq.md +++ b/documentation/dev-portal/src/integrations/faq.md @@ -110,7 +110,7 @@ Yes, it is supported. Yes. Follow the instructions in the [Ledger support for Nyx documentation](https://nymtech.net/docs/nyx/ledger-live.html). ### Where can I find network details such as deployed smart contract addresses? -In the [`network defaults`](https://github.com/nymtech/nym/blob/release/{{platform_release_version}}/common/network-defaults/src/mainnet.rs) file. +In the [`network defaults`](https://github.com/nymtech/nym/blob/master/common/network-defaults/src/mainnet.rs) file. ## `NYM` Token The token used to reward mixnet infrastructure operators - `NYM` - is one of the native tokens of the Nyx blockchain. The other token is `NYX`. @@ -198,4 +198,4 @@ For the moment then yes, the mixnet is free to use. There are no limits on the a No, although we do recommend that apps that wish to integrate look into running some of their own infrastructure such as gateways in order to assure uptime. ### How can I find out if an application is already supported by network requester services? -You can check the [default allowed list](https://nymtech.net/.wellknown/network-requester/standard-allowed-list.txt) file to see which application traffic is whitelisted by default. If the domain is present on that list, it means that existing [network requesters](https://nymtech.net/docs/nodes/network-requester-setup.html) can be used to privacy-protect your application traffic. Simply use [NymConnect](../quickstart/nymconnect-gui.md) to connect to this service through the mixnet. \ No newline at end of file +You can check the [default allowed list](https://nymtech.net/.wellknown/network-requester/standard-allowed-list.txt) file to see which application traffic is whitelisted by default. If the domain is present on that list, it means that existing [network requesters](https://nymtech.net/docs/nodes/network-requester-setup.html) can be used to privacy-protect your application traffic. Simply use [NymConnect](../quickstart/nymconnect-gui.md) to connect to this service through the mixnet. diff --git a/documentation/dev-portal/src/integrations/mixnet-integration.md b/documentation/dev-portal/src/integrations/mixnet-integration.md index 9df20518bd..f1fa576265 100644 --- a/documentation/dev-portal/src/integrations/mixnet-integration.md +++ b/documentation/dev-portal/src/integrations/mixnet-integration.md @@ -22,7 +22,7 @@ It’s packaged and available on the npm registry, so you can npm install it int The webassembly client is most easily used via the [typescript sdk](https://nymtech.net/docs/sdk/typescript.html). -You can find example code in the [examples section](https://github.com/nymtech/nym/tree/release/{{platform_release_version}}/sdk/typescript/examples) of the codebase, and in the [typescript sdk docs](https://nymtech.net/docs/sdk/typescript.html). +You can find example code in the [examples section](https://github.com/nymtech/nym/tree/master/sdk/typescript/examples) of the codebase, and in the [typescript sdk docs](https://nymtech.net/docs/sdk/typescript.html). #### SOCKS client This client is useful for allowing existing applications to use the Nym mixnet without any code changes. All that’s necessary is that they can use one of the SOCKS5, SOCKS4a, or SOCKS4 proxy protocols (which many applications can - crypto wallets, browsers, chat applications etc). diff --git a/documentation/dev-portal/src/quickstart/nymconnect-gui.md b/documentation/dev-portal/src/quickstart/nymconnect-gui.md index 8783d1b9f5..cf7644b616 100644 --- a/documentation/dev-portal/src/quickstart/nymconnect-gui.md +++ b/documentation/dev-portal/src/quickstart/nymconnect-gui.md @@ -11,7 +11,7 @@ Install NymConnect and select an application that you want to privacy-enhance fr **Please note that NymConnect is currently released in beta. Please report bugs via Github**. ## Usage instuctions -* [Download](https://github.com/nymtech/nym/releases/tag/nym-connect-{{platform_release_version}}) and install NymConnect. +* [Download](https://github.com/nymtech/nym/releases/) and install NymConnect. * Select your service provider from the dropdown menu. * Click `connect` - NymConnect will connect to a service provider and its SOCKS Proxy (IP) and Port will be displayed. * Click on IP or Port to copy their values to the clipboard. diff --git a/documentation/dev-portal/src/tutorials/matrix.md b/documentation/dev-portal/src/tutorials/matrix.md index 7351ce85ee..8267aabcf5 100644 --- a/documentation/dev-portal/src/tutorials/matrix.md +++ b/documentation/dev-portal/src/tutorials/matrix.md @@ -1,5 +1,6 @@ # Matrix NymConnect Integration +![](../images//matrix.png) Chat applications became an essential part of human communication. Matrix chat has end to end encryption on protocol level and Element app users can sort their communication into spaces and rooms. Now the Matrix communities can rely on network privacy as NymConnect supports Matrix chat protocol. diff --git a/documentation/dev-portal/src/tutorials/monero.md b/documentation/dev-portal/src/tutorials/monero.md index 77439d0728..68f3bf3578 100644 --- a/documentation/dev-portal/src/tutorials/monero.md +++ b/documentation/dev-portal/src/tutorials/monero.md @@ -10,33 +10,35 @@ A team made up of Monero community members have successfully set up a service pr ## How can I use Monero over the Nym mixnet? +> Any syntax in `<>` brackets is a user's unique variable. Exchange with a corresponding name without the `<>` brackets. + The mainnet service provider to Monero over the Nym mixnet is now ready for use via [NymConnect](https://nymtech.net/download-nymconnect/). -* Download and open the latest version of [NymConnect](https://nymtech.net/download-nymconnect/). -* Click on the top left options and go to Settings -* Go to “Select service provider” and turn it on -* For Mainnet, search for this provider or insert it manually: - +* **Download** the latest version of [**NymConnect**](https://nymtech.net/download-nymconnect/). +* Make sure your NymConnect is executable. ```sh -i1TiuoNp4jp9weffCW7tPnkb4hRTPydRjX8iXFVaYDG.88Z1hruuvbzWpdCE2xYnTbPNrr49j4s7mmUQC5wvRRLZ@3EPuxwGn2WP2HdxybzoDa5QsohYSP76aQQRUJuPMvk23 +# in Linux open terminal in the same folder and run: +chmod +x ./nym-connect_.AppImage ``` +* **Open NymConnect app** +* **Turn it on** - Monero wallet is listed in the apps supported by default, no need for any setup +* **Copy** the **Socks5 address** and **Port** -* Go to the main NymConnect interface and connect to the mixnet +Then go to your Monero wallet (desktop or CLI) and change the settings to run over socks5 proxy: -Then go to your Monero wallet (gui or otherwise) and change the settings to run over socks5 proxy: +**Monero desktop wallet:** -**Monero desktop:** - -* Settings -> Interface -> Socks5 proxy -> Add values: IP address `localhost`, Port `1080` +* Settings -> Interface -> Socks5 proxy -> Add values: IP address `127.0.0.1`, Port `1080` (the values copied from NymConnect) + +**CLI wallet** * **Monerod:** add `--proxy 127.0.0.1:1080 --bootstrap-daemon-proxy 127.0.0.1:1080` to args * **Monero-wallet-{rpc, cli}:** add `--proxy 127.0.0.1:1080 --daemon-ssl-allow-any-cert` to args -Follow the instructions and the Monero mainnet will be connected through to the Nym mixnet. - For those who want to try it out in testnet, a stagenet service provider is also available: [https://nymtech.net/.wellknown/connect/service-providers.json](https://nymtech.net/.wellknown/connect/service-providers.json) + +Now your Monero traffic is protected by the network privacy of Nym Mixnet. diff --git a/documentation/dev-portal/src/tutorials/telegram.md b/documentation/dev-portal/src/tutorials/telegram.md index 1965fceea4..731dc0d163 100644 --- a/documentation/dev-portal/src/tutorials/telegram.md +++ b/documentation/dev-portal/src/tutorials/telegram.md @@ -2,6 +2,8 @@ *This is a shortened version of a [Nym Community post](https://blog.nymtech.net/how-to-use-telegram-in-iraq-with-nymconnect-106a3b8dd050) written by Saliveja.* +![](../images/telegram.png) + The purpose of the following manual is not to promote Telegram but so people can use it with the Nym mixnet if they wish to, should a situation ask for that. This privacy-enhances Telegram at the network level and allows users to access the application from locations like where the application was banned. See also: [Element (Matrix) over the Nym mixnet](./matrix.md): private, decentralised and secure messaging. @@ -10,7 +12,7 @@ See also: [Element (Matrix) over the Nym mixnet](./matrix.md): private, decentra Here’s how to configure Telegram with NymConnect: -1. Download and install NymConnect ().** +1. **Download and install NymConnect(https://nymtech.net/download-nymconnect/).** For more releases, check out [Github](https://github.com/nymtech/nym/tags). NymConnect is available for Linux, Windows, and MacOS. On Linux make sure NymConnect is executable. Opening a terminal in the same directory and run: ```sh diff --git a/documentation/docs/README.md b/documentation/docs/README.md index 8cc1041c73..9a5eab0773 100644 --- a/documentation/docs/README.md +++ b/documentation/docs/README.md @@ -16,7 +16,7 @@ To contribute tranlsations in a new language, please get in touch via [Matrix](h ### Variables There are some variables that are shared across the entire docs site, such as the current latest software version. -Variables are denoted in the `.md` files wrapped in `{{}}` (e.g `{{platform_release_version}}` is the most recent release), and are located in the `book.toml` file under the `[preprocessor.variables.variables]` heading. If you are changing something like the software release version, minimum code versions in prerequisites, etc, **check in here first!** +Variables are denoted in the `.md` files wrapped in `{{}}` (e.g `{{wallet_release_version}}`), and are located in the `book.toml` file under the `[preprocessor.variables.variables]` heading. If you are changing something like the software release version, minimum code versions in prerequisites, etc, **check in here first!** ### Diagrams Most diagrams are simply ascii. Copies are kept in `/diagrams/` for ease of reproducability. Created using [textik](https://textik.com/#). @@ -27,12 +27,6 @@ Example files are inserted as per normal with mdbook. Some binary command outputs are generated using the [`cmdrun`](https://docs.rs/mdbook-cmdrun/latest/mdbook_cmdrun/) mdbook plugin. -### Updating platform version - -When updating the version, make sure to change **both** the version in the `title` on line 2 of `book.toml`, as well as the `platform_release_version` variable in the same file. - -> In the future this will be dealt with something like a preprocessor widget (todo). - ## Building When working locally, it is recommended that you use `mdbook serve` to have a local version of the docs served on `localhost:3000`, with hot reloading on any changes made to files in the `src/` directory. diff --git a/documentation/docs/book.toml b/documentation/docs/book.toml index 846bf5ee2a..b8b6636656 100644 --- a/documentation/docs/book.toml +++ b/documentation/docs/book.toml @@ -48,7 +48,6 @@ assets_version = "2.0.0" # do not edit: managed by `mdbook-admonish install` # https://gitlab.com/tglman/mdbook-variables/ [preprocessor.variables.variables] minimum_rust_version = "1.66" -platform_release_version = "1.1.29" wallet_release_version = "1.2.8" [preprocessor.last-changed] diff --git a/documentation/docs/src/SUMMARY.md b/documentation/docs/src/SUMMARY.md index c9fc9c6d1d..8e4f7c6127 100644 --- a/documentation/docs/src/SUMMARY.md +++ b/documentation/docs/src/SUMMARY.md @@ -9,8 +9,8 @@ # Binaries - [Pre-built Binaries](binaries/pre-built-binaries.md) + - [Binary Initialisation and Configuration](binaries/init-and-config.md) - [Building from Source](binaries/building-nym.md) -- [Binary Initialisation and Configuration](binaries/init-and-config.md) # Nodes diff --git a/documentation/docs/src/binaries/building-nym.md b/documentation/docs/src/binaries/building-nym.md index a79af72c3d..15b152e4fa 100644 --- a/documentation/docs/src/binaries/building-nym.md +++ b/documentation/docs/src/binaries/building-nym.md @@ -39,7 +39,7 @@ If you really don't want to use the shell script installer, the [Rust installati ## Download and build Nym binaries The following commands will compile binaries into the `nym/target/release` directory: -``` +```sh rustup update git clone https://github.com/nymtech/nym.git cd nym @@ -47,10 +47,9 @@ cd nym git reset --hard # in case you made any changes on your branch git pull # in case you've checked it out before -git checkout release/{{platform_release_version}} # checkout to the latest release branch: `develop` will most likely be incompatible with deployed public networks +git checkout master # master branch has the latest release version: `develop` will most likely be incompatible with deployed public networks cargo build --release # build your binaries with **mainnet** configuration -NETWORK=sandbox cargo build --release # build your binaries with **sandbox** configuration ``` Quite a bit of stuff gets built. The key working parts are: diff --git a/documentation/docs/src/binaries/init-and-config.md b/documentation/docs/src/binaries/init-and-config.md index e749662b8e..7c519a5889 100644 --- a/documentation/docs/src/binaries/init-and-config.md +++ b/documentation/docs/src/binaries/init-and-config.md @@ -1,6 +1,13 @@ # Binary Initialisation and Configuration -All Nym binaries must first be initialised with `init` before being `run`. +All Nym binaries must first be made executable and initialised with `init` before being `run`. + +To make a binary executable, open terminal in the same directory and run: + +```sh +chmod +x +# for example: chmod +x nym-mixnode +``` The `init` command is usually where you pass flags specifying configuration arguments such as the gateway you wish to communicate with, the ports you wish your binary to listen on, etc. diff --git a/documentation/docs/src/clients/socks5-client.md b/documentation/docs/src/clients/socks5-client.md index 052a52f027..292848ff8a 100644 --- a/documentation/docs/src/clients/socks5-client.md +++ b/documentation/docs/src/clients/socks5-client.md @@ -160,7 +160,7 @@ Create a service file for the socks5 client at `/etc/systemd/system/nym-socks5-c ```ini [Unit] -Description=Nym Socks5 Client ({{platform_release_version}}) +Description=Nym Socks5 Client StartLimitInterval=350 StartLimitBurst=10 diff --git a/documentation/docs/src/clients/websocket-client.md b/documentation/docs/src/clients/websocket-client.md index a6f8f62d24..f0980ad9ae 100644 --- a/documentation/docs/src/clients/websocket-client.md +++ b/documentation/docs/src/clients/websocket-client.md @@ -109,7 +109,7 @@ Alternatively, a custom host can be set in the `config.toml` file under the `soc ### Connecting to the local websocket The Nym native client exposes a websocket interface that your code connects to. To program your app, choose a websocket library for whatever language you're using. The **default** websocket port is `1977`, you can override that in the client config if you want. -The Nym monorepo includes websocket client example code for Rust, Go, Javacript, and Python, all of which can be found [here](https://github.com/nymtech/nym/tree/release/{{platform_release_version}}/clients/native/examples). +The Nym monorepo includes websocket client example code for Rust, Go, Javacript, and Python, all of which can be found [here](https://github.com/nymtech/nym/tree/master/clients/native/examples). > Rust users can run the examples with `cargo run --example .rs`, as the examples are not organised in the same way as the other examples, due to already being inside a Cargo project. @@ -183,7 +183,7 @@ Nym [`ClientRequest`](https://github.com/nymtech/nym/blob/develop/clients/native As a response the `native-client` will send a `ServerResponse` to be decoded. -You can find examples of sending and receiving binary data in the Rust, Python and Go [code examples](https://github.com/nymtech/nym/tree/release/{{platform_release_version}}/clients/native/examples), and an example project from the Nym community [BTC-BC](https://github.com/sgeisler/btcbc-rs/): Bitcoin transaction transmission via Nym, a client and service provider written in Rust. +You can find examples of sending and receiving binary data in the Rust, Python and Go [code examples](https://github.com/nymtech/nym/tree/master/clients/native/examples), and an example project from the Nym community [BTC-BC](https://github.com/sgeisler/btcbc-rs/): Bitcoin transaction transmission via Nym, a client and service provider written in Rust. #### Getting your own address Sometimes, when you start your app, it can be convenient to ask the native client to tell you what your own address is (from the saved configuration files). To do this, send: diff --git a/documentation/docs/src/nyx/mixnet-contract.md b/documentation/docs/src/nyx/mixnet-contract.md index 1f1fe5fbdb..48b63281fc 100644 --- a/documentation/docs/src/nyx/mixnet-contract.md +++ b/documentation/docs/src/nyx/mixnet-contract.md @@ -1,6 +1,6 @@ # Mixnet Contract -The Mixnet smart contract is a core piece of the Nym system, functioning as the mixnet directory and keeping track of delegations and rewards: the core functionality required by an incentivised mixnet. You can find the code and build instructions [here](https://github.com/nymtech/nym/tree/release/{{platform_release_version}}/contracts/mixnet). +The Mixnet smart contract is a core piece of the Nym system, functioning as the mixnet directory and keeping track of delegations and rewards: the core functionality required by an incentivised mixnet. You can find the code and build instructions [here](https://github.com/nymtech/nym/tree/master/contracts/mixnet). ### Functionality The Mixnet contract has multiple functions: @@ -9,5 +9,5 @@ The Mixnet contract has multiple functions: * storing delegation and bond amounts. * storing reward amounts. -The addresses of deployed smart contracts can be found in the [`network-defaults`](https://github.com/nymtech/nym/blob/release/{{platform_release_version}}/common/network-defaults/src/mainnet.rs) directory of the codebase alongside other network default values. +The addresses of deployed smart contracts can be found in the [`network-defaults`](https://github.com/nymtech/nym/blob/master/common/network-defaults/src/mainnet.rs) directory of the codebase alongside other network default values. diff --git a/documentation/docs/src/nyx/vesting-contract.md b/documentation/docs/src/nyx/vesting-contract.md index cd9bf0975d..cbc5bfbcee 100644 --- a/documentation/docs/src/nyx/vesting-contract.md +++ b/documentation/docs/src/nyx/vesting-contract.md @@ -1,11 +1,11 @@ # Vesting Contract -The vesting contract allows for the creation of vesting accounts, allowing `NYM` tokens to vest over time, and for users to minimally interact with the Mixnet using their unvested tokens. You can find the code and build instructions [here](https://github.com/nymtech/nym/tree/release/{{platform_release_version}}/contracts/vesting). +The vesting contract allows for the creation of vesting accounts, allowing `NYM` tokens to vest over time, and for users to minimally interact with the Mixnet using their unvested tokens. You can find the code and build instructions [here](https://github.com/nymtech/nym/tree/master/contracts/vesting). ### Functionality The Vesting contract has multiple functions: * Creating and storing vesting `NYM` token vesting accounts. * Interacting with the Mixnet using vesting (i.e. non-transferable) tokens, allowing users to delegate their unvested tokens. -The addresses of deployed smart contracts can be found in the [`network-defaults`](https://github.com/nymtech/nym/blob/release/{{platform_release_version}}/common/network-defaults/src/mainnet.rs) directory of the codebase alongside other network default values. +The addresses of deployed smart contracts can be found in the [`network-defaults`](https://github.com/nymtech/nym/blob/master/common/network-defaults/src/mainnet.rs) directory of the codebase alongside other network default values. diff --git a/documentation/docs/src/sdk/rust.md b/documentation/docs/src/sdk/rust.md index c53fde7b01..bb89a7dbc1 100644 --- a/documentation/docs/src/sdk/rust.md +++ b/documentation/docs/src/sdk/rust.md @@ -27,7 +27,7 @@ The `mixnet` component currently exposes the logic of two clients: the [websocke The `coconut` component is currently being worked on. Right now it exposes logic allowing for the creation of coconut credentials on the Sandbox testnet. ## Websocket client examples -> All the codeblocks below can be found in the `nym-sdk` [examples directory](https://github.com/nymtech/nym/tree/release/{{platform_release_version}}/sdk/rust/nym-sdk/examples) in the monorepo. Just navigate to `nym/sdk/rust/nym-sdk/examples/` and run the files from there. If you wish to run these outside of the workspace - such as if you want to use one as the basis for your own project - then make sure to import the `sdk`, `tokio`, and `nym_bin_common` crates. +> All the codeblocks below can be found in the `nym-sdk` [examples directory](https://github.com/nymtech/nym/tree/master/sdk/rust/nym-sdk/examples) in the monorepo. Just navigate to `nym/sdk/rust/nym-sdk/examples/` and run the files from there. If you wish to run these outside of the workspace - such as if you want to use one as the basis for your own project - then make sure to import the `sdk`, `tokio`, and `nym_bin_common` crates. ### Different message types There are two methods for sending messages through the mixnet using your client: @@ -82,7 +82,7 @@ If you're integrating mixnet functionality into an existing app and want to inte ### Anonymous replies with SURBs Both functions used to send messages through the mixnet (`send_message` and `send_plain_message`) send a pre-determined number of SURBs along with their messages by default. -The number of SURBs is set [here](https://github.com/nymtech/nym/blob/release/{{platform_release_version}}/sdk/rust/nym-sdk/src/mixnet/client.rs#L34): +The number of SURBs is set [here](https://github.com/nymtech/nym/blob/master/sdk/rust/nym-sdk/src/mixnet/client.rs#L33): ```rust,noplayground {{#include ../../../../sdk/rust/nym-sdk/src/mixnet/client.rs:34}} diff --git a/documentation/docs/src/sdk/typescript.md b/documentation/docs/src/sdk/typescript.md index 5ce939e858..49bc816738 100644 --- a/documentation/docs/src/sdk/typescript.md +++ b/documentation/docs/src/sdk/typescript.md @@ -1,7 +1,7 @@ # Typescript SDK The Typescript SDK allows developers to start building browser-based mixnet applications quickly, by simply importing the SDK into their code via NPM as they would any other Typescript library. -You can find the source code [here](https://github.com/nymtech/nym/tree/release/{{platform_release_version}}/sdk) and the library on NPM [here](https://www.npmjs.com/package/@nymproject/sdk). +You can find the source code [here](https://github.com/nymtech/nym/tree/master/sdk) and the library on NPM [here](https://www.npmjs.com/package/@nymproject/sdk). Currently developers can use the SDK to do the following **entirely in the browser**: * Create a client @@ -19,7 +19,7 @@ In the future the SDK will be made up of several components, each of which will | Validator | Sign & broadcast Nyx blockchain transactions, query the blockchain | ❌ | ### How it works -The SDK can be thought of as a 'wrapper' around the compiled [WebAssembly client](https://github.com/nymtech/nym/tree/release/{{platform_release_version}}/clients/webassembly) code: it runs the client (a Wasm blob) in a web worker. This allows us to keep the work done by the client - such as the heavy lifting of creating and multiply-encrypting Sphinx packets - in a seperate thread from our UI, enabling you to build reactive frontends without worrying about the work done under the hood by the client eating your processing power. +The SDK can be thought of as a 'wrapper' around the compiled [WebAssembly client](https://github.com/nymtech/nym/tree/master/clients/webassembly) code: it runs the client (a Wasm blob) in a web worker. This allows us to keep the work done by the client - such as the heavy lifting of creating and multiply-encrypting Sphinx packets - in a seperate thread from our UI, enabling you to build reactive frontends without worrying about the work done under the hood by the client eating your processing power. The SDK exposes an interface that allows developers to interact with the Wasm blob inside the webworker from frontend code. @@ -41,7 +41,7 @@ Support for environments with different bundlers will be added in subsequent rel ### Using the SDK -There are multiple example projects in [`nym/sdk/typescript/examples/`](https://github.com/nymtech/nym/tree/release/{{platform_release_version}}/sdk/typescript/examples/), each for a different frontend framework. +There are multiple example projects in [`nym/sdk/typescript/examples/`](https://github.com/nymtech/nym/tree/master/sdk/typescript/examples/), each for a different frontend framework. #### Vanilla HTML The best place to start if you just want to quickly get a basic frontend up and running with which to experiment is `examples/plain-html`: @@ -53,10 +53,10 @@ The best place to start if you just want to quickly get a basic frontend up and As you can see, all that is required to create an ephemeral keypair and connect to the mixnet is creating a client and then subscribing to the mixnet events coming down the websocket, and adding logic to deal with them. #### Parcel -If you don't want to use `Webpack` as your app bundler, we have an example with `Parcel` located at [`examples/parcel/`](https://github.com/nymtech/nym/tree/release/{{platform_release_version}}/sdk/typescript/examples/react-webpack-with-theme-example/parcel/). +If you don't want to use `Webpack` as your app bundler, we have an example with `Parcel` located at [`examples/parcel/`](https://github.com/nymtech/nym/tree/master/sdk/typescript/examples/chat-app/parcel). #### Create React App -For React developers we have an example which is a basic React app scaffold with the additional logic for creating a client and subscribing to mixnet events in [`examples/react-webpack-with-theme-example/`](https://github.com/nymtech/nym/tree/release/{{platform_release_version}}/sdk/typescript/examples/react-webpack-with-theme-example/). +For React developers we have an example which is a basic React app scaffold with the additional logic for creating a client and subscribing to mixnet events in [`examples/react-webpack-with-theme-example/`](https://github.com/nymtech/nym/tree/master/sdk/typescript/examples/chat-app/react-webpack-with-theme-example). ### Developers: think about what you're sending (and importing)! Think about what information your app sends. That goes for whatever you put into your Sphinx packet messages as well as what your app's environment may leak. diff --git a/documentation/operators/book.toml b/documentation/operators/book.toml index 02f3878356..48a764213c 100644 --- a/documentation/operators/book.toml +++ b/documentation/operators/book.toml @@ -48,7 +48,6 @@ assets_version = "2.0.0" # do not edit: managed by `mdbook-admonish install` # https://gitlab.com/tglman/mdbook-variables/ [preprocessor.variables.variables] minimum_rust_version = "1.66" -platform_release_version = "1.1.29" wallet_release_version = "1.2.8" [preprocessor.last-changed] diff --git a/documentation/operators/src/SUMMARY.md b/documentation/operators/src/SUMMARY.md index 82345c6f49..e5d89b14f5 100644 --- a/documentation/operators/src/SUMMARY.md +++ b/documentation/operators/src/SUMMARY.md @@ -4,8 +4,8 @@ # Binaries - [Pre-built Binaries](./binaries/pre-built-binaries.md) + - [Binary Initialisation and Configuration](./binaries/init-and-config.md) - [Building from Source](./binaries/building-nym.md) -- [Binary Initialisation and Configuration](./binaries/init-and-config.md) # Operators Guides diff --git a/documentation/operators/src/binaries/building-nym.md b/documentation/operators/src/binaries/building-nym.md index 8610fcb63a..a3ff55c9b2 100644 --- a/documentation/operators/src/binaries/building-nym.md +++ b/documentation/operators/src/binaries/building-nym.md @@ -39,7 +39,7 @@ If you really don't want to use the shell script installer, the [Rust installati ## Download and build Nym binaries The following commands will compile binaries into the `nym/target/release` directory: -``` +```sh rustup update git clone https://github.com/nymtech/nym.git cd nym @@ -47,10 +47,9 @@ cd nym git reset --hard # in case you made any changes on your branch git pull # in case you've checked it out before -git checkout release/{{platform_release_version}} # checkout to the latest release branch: `develop` will most likely be incompatible with deployed public networks +git checkout master # master branch has the latest release version: `develop` will most likely be incompatible with deployed public networks cargo build --release # build your binaries with **mainnet** configuration -NETWORK=sandbox cargo build --release # build your binaries with **sandbox** configuration ``` Quite a bit of stuff gets built. The key working parts are: diff --git a/documentation/operators/src/binaries/init-and-config.md b/documentation/operators/src/binaries/init-and-config.md index e749662b8e..7c519a5889 100644 --- a/documentation/operators/src/binaries/init-and-config.md +++ b/documentation/operators/src/binaries/init-and-config.md @@ -1,6 +1,13 @@ # Binary Initialisation and Configuration -All Nym binaries must first be initialised with `init` before being `run`. +All Nym binaries must first be made executable and initialised with `init` before being `run`. + +To make a binary executable, open terminal in the same directory and run: + +```sh +chmod +x +# for example: chmod +x nym-mixnode +``` The `init` command is usually where you pass flags specifying configuration arguments such as the gateway you wish to communicate with, the ports you wish your binary to listen on, etc. diff --git a/documentation/operators/src/nodes/gateway-setup.md b/documentation/operators/src/nodes/gateway-setup.md index f1cb589756..5a880c4ece 100644 --- a/documentation/operators/src/nodes/gateway-setup.md +++ b/documentation/operators/src/nodes/gateway-setup.md @@ -97,7 +97,7 @@ It will look something like this: |_| |_|\__, |_| |_| |_| |___/ - (nym-gateway - version {{platform_release_version}}) + (nym-gateway - version v1.1.29) >>> attempting to sign 2Mf8xYytgEeyJke9LA7TjhHoGQWNBEfgHZtTyy2krFJfGHSiqy7FLgTnauSkQepCZTqKN5Yfi34JQCuog9k6FGA2EjsdpNGAWHZiuUGDipyJ6UksNKRxnFKhYW7ri4MRduyZwbR98y5fQMLAwHne1Tjm9cXYCn8McfigNt77WAYwBk5bRRKmC34BJMmWcAxphcLES2v9RdSR68tkHSpy2C8STfdmAQs3tZg8bJS5Qa8pQdqx14TnfQAPLk3QYCynfUJvgcQTrg29aqCasceGRpKdQ3Tbn81MLXAGAs7JLBbiMEAhCezAr2kEN8kET1q54zXtKz6znTPgeTZoSbP8rzf4k2JKHZYWrHYF9JriXepuZTnyxAKAxvGFPBk8Z6KAQi33NRQkwd7MPyttatHna6kG9x7knffV6ebGzgRBf7NV27LurH8x4L1uUXwm1v1UYCA1WSBQ9Pp2JW69k5v5v7G9gBy8RUcZnMbeL26Qqb8WkuGcmuHhaFfoqSfV7PRHPpPT4M8uRqUyR4bjUtSJJM1yh6QSeZk9BEazzoJqPeYeGoiFDZ3LMj2jesbJweQR4caaYuRczK92UGSSqu9zBKmE45a diff --git a/documentation/operators/src/nodes/maintenance.md b/documentation/operators/src/nodes/maintenance.md index c955975118..7f0416ea9d 100644 --- a/documentation/operators/src/nodes/maintenance.md +++ b/documentation/operators/src/nodes/maintenance.md @@ -19,7 +19,7 @@ For example `./target/debug/nym-network-requester --no-banner build-info --outpu > The process is the similar for mix node, gateway and network requester. In the following steps we use a placeholder `` in the commands, please change it for the type of node you want to upgrade. Any particularities for the given type of node are included. Upgrading your node is a two-step process: -* Updating the binary and `~/.nym///config.toml` on your VPS +* Updating the binary and `~/.nym///config/config.toml` on your VPS * Updating the node information in the [mixnet smart contract](https://nymtech.net/docs/nyx/mixnet-contract.html). **This is the information that is present on the [mixnet explorer](https://explorer.nymtech.net)**. ### Step 1: Upgrading your binary @@ -230,7 +230,7 @@ Here's a systemd service file to do that: ```ini [Unit] -Description=Nym Mixnode ({{platform_release_version}}) +Description=Nym Mixnode StartLimitInterval=350 StartLimitBurst=10 @@ -252,7 +252,7 @@ WantedBy=multi-user.target ```ini [Unit] -Description=Nym Gateway ({{platform_release_version}}) +Description=Nym Gateway StartLimitInterval=350 StartLimitBurst=10 @@ -274,7 +274,7 @@ WantedBy=multi-user.target ```ini [Unit] -Description=Nym Network Requester ({{platform_release_version}}) +Description=Nym Network Requester StartLimitInterval=350 StartLimitBurst=10 diff --git a/documentation/operators/src/nodes/mix-node-setup.md b/documentation/operators/src/nodes/mix-node-setup.md index b168329487..15a5a21ef0 100644 --- a/documentation/operators/src/nodes/mix-node-setup.md +++ b/documentation/operators/src/nodes/mix-node-setup.md @@ -87,13 +87,13 @@ Mixnode configuration completed. |_| |_|\__, |_| |_| |_| |___/ - (nym-mixnode - version {{platform_release_version}}) + (nym-mixnode - version v1.1.29) -Identity Key: DhmUYedPZvhP9MMwXdNpPaqCxxTQgjAg78s2nqtTTiNF","version":"{{platform_release_version}}"},"cost_params +Identity Key: DhmUYedPZvhP9MMwXdNpPaqCxxTQgjAg78s2nqtTTiNF","version":"v1.1.29"},"cost_params Sphinx Key: CfZSy1jRfrfiVi9JYexjFWPqWkKoY72t7NdpWaq37K8Z Host: 62.240.134.189 (bind address: 62.240.134.189) -Version: {{platform_release_version}} +Version: v1.1.29 Mix Port: 1789, Verloc port: 1790, Http Port: 8000 ``` ~~~ @@ -134,7 +134,7 @@ It will look something like this: |_| |_|\__, |_| |_| |_| |___/ - (nym-mixnode - version {{platform_release_version}}) + (nym-mixnode - version v1.1.29) >>> attempting to sign 22Z9wt4PyiBCbMiErxj5bBa4VCCFsjNawZ1KnLyMeV9pMUQGyksRVANbXHjWndMUaXNRnAuEVJW6UCxpRJwZe788hDt4sicsrv7iAXRajEq19cWPVybbUqgeo76wbXbCbRdg1FvVKgYZGZZp8D72p5zWhKSBRD44qgCrqzfV1SkiFEhsvcLUvZATdLRocAUL75KmWivyRiQjCE1XYEWyRH9yvRYn4TymWwrKVDtEB63zhHjATN4QEi2E5qSrSbBcmmqatXsKakbgSbQoLsYygcHx7tkwbQ2HDYzeiKP1t16Rhcjn6Ftc2FuXUNnTcibk2LQ1hiqu3FAq31bHUbzn2wiaPfm4RgqTwGM4eqnjBofwR3251wQSxbYwKUYwGsrkweRcoPuEaovApR9R19oJ7GVG5BrKmFwZWX3XFVuECe8vt1x9MY7DbQ3xhAapsHhThUmzN6JPPU4qbQ3PdMt3YVWy6oRhap97ma2dPMBaidebfgLJizpRU3Yu7mtb6E8vgi5Xnehrgtd35gitoJqJUY5sB1p6TDPd6vk3MVU1zqusrke7Lvrud4xKfCLqp672Bj9eGb2wPwow643CpHuMkhigfSWsv9jDq13d75EGTEiprC2UmWTzCJWHrDH7ka68DZJ5XXAW67DBewu7KUm1jrJkNs55vS83SWwm5RjzQLVhscdtCH1Bamec6uZoFBNVzjs21o7ax2WHDghJpGMxFi6dmdMCZpqn618t4 diff --git a/documentation/operators/src/nodes/network-requester-setup.md b/documentation/operators/src/nodes/network-requester-setup.md index 2082c2035f..b89dc4d0b2 100644 --- a/documentation/operators/src/nodes/network-requester-setup.md +++ b/documentation/operators/src/nodes/network-requester-setup.md @@ -190,7 +190,7 @@ Stop the running process with `CTRL-C`, and create a service file for the reques ```ini [Unit] -Description=Nym Network Requester ({{platform_release_version}}) +Description=Nym Network Requester StartLimitInterval=350 StartLimitBurst=10 diff --git a/explorer-api/Cargo.toml b/explorer-api/Cargo.toml index 10ca849b3d..bd6fed0ae6 100644 --- a/explorer-api/Cargo.toml +++ b/explorer-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "explorer-api" -version = "1.1.27" +version = "1.1.28" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 2c3f6f00d6..c3b4ea356e 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-gateway" -version = "1.1.27" +version = "1.1.28" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index 0a9edd82b9..91f99e9f81 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-mixnode" -version = "1.1.28" +version = "1.1.29" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index 29be65e7bb..3fb1c48506 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-api" -version = "1.1.28" +version = "1.1.29" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-connect/desktop/CHANGELOG.md b/nym-connect/desktop/CHANGELOG.md index ab9c1da100..371cf6441e 100644 --- a/nym-connect/desktop/CHANGELOG.md +++ b/nym-connect/desktop/CHANGELOG.md @@ -2,6 +2,14 @@ ## [Unreleased] +## [v1.1.20-twix] (2023-09-05) + +- nym-connect directory error handling ([#3830]) +- NC - it should not be possible to toggle speedy mode while the connection is active ([#3816]) + +[#3830]: https://github.com/nymtech/nym/pull/3830 +[#3816]: https://github.com/nymtech/nym/issues/3816 + ## [v1.1.19-snickers] (2023-08-29) - NymConnect sometimes fails to connect because the gateway it fetches from the validator-api to use is running an old version (of the gateway binary) ([#3788]) diff --git a/nym-connect/desktop/package.json b/nym-connect/desktop/package.json index a69bc51486..00eececabe 100644 --- a/nym-connect/desktop/package.json +++ b/nym-connect/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@nym/nym-connect", - "version": "1.1.19", + "version": "1.1.20", "main": "index.js", "license": "MIT", "scripts": { diff --git a/nym-connect/desktop/src-tauri/Cargo.toml b/nym-connect/desktop/src-tauri/Cargo.toml index 133b94a921..6b4de12a5f 100644 --- a/nym-connect/desktop/src-tauri/Cargo.toml +++ b/nym-connect/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-connect" -version = "1.1.19" +version = "1.1.20" description = "nym-connect" authors = ["Nym Technologies SA"] license = "" diff --git a/nym-connect/desktop/src-tauri/tauri.conf.json b/nym-connect/desktop/src-tauri/tauri.conf.json index 555daaa1b7..46c8645e64 100644 --- a/nym-connect/desktop/src-tauri/tauri.conf.json +++ b/nym-connect/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "nym-connect", - "version": "1.1.19" + "version": "1.1.20" }, "build": { "distDir": "../dist", diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index cf66ae325e..67ed6b41fa 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-network-requester" -version = "1.1.27" +version = "1.1.28" authors.workspace = true edition.workspace = true rust-version = "1.65" diff --git a/service-providers/network-statistics/Cargo.toml b/service-providers/network-statistics/Cargo.toml index 197ee6e49a..e718333802 100644 --- a/service-providers/network-statistics/Cargo.toml +++ b/service-providers/network-statistics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-network-statistics" -version = "1.1.27" +version = "1.1.28" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/tools/nym-cli/Cargo.toml b/tools/nym-cli/Cargo.toml index d571f87d7f..455da72803 100644 --- a/tools/nym-cli/Cargo.toml +++ b/tools/nym-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-cli" -version = "1.1.27" +version = "1.1.28" authors.workspace = true edition = "2021" From e083bfcfe4daabb7e3f02c2a56f2b8826e707f29 Mon Sep 17 00:00:00 2001 From: Mark Sinclair <14054343+mmsinclair@users.noreply.github.com> Date: Tue, 5 Sep 2023 14:57:23 +0100 Subject: [PATCH 04/47] Docs: post process to adjust URLs in index.html files for hosting in subdirectories (#3842) * Docs: post process output to fix paths so that many mdbooks can be served from sub-directories * Prevent theme from being modified * Upload docs to Vercel * Post process docs * Process local links * Docs: only process `index.html` files from the root, All other files have the correct relative paths to serve assets properly and link to files relatively. --------- Co-authored-by: Mark Sinclair --- .github/workflows/cd-docs.yml | 40 + documentation/dev-portal/book.toml | 2 +- documentation/docs/book.toml | 4 +- documentation/operators/book.toml | 2 +- documentation/post_process.sh | 7 + documentation/scripts/post-process/index.mjs | 88 ++ .../scripts/post-process/package-lock.json | 1313 +++++++++++++++++ .../scripts/post-process/package.json | 16 + 8 files changed, 1468 insertions(+), 4 deletions(-) create mode 100755 documentation/post_process.sh create mode 100644 documentation/scripts/post-process/index.mjs create mode 100644 documentation/scripts/post-process/package-lock.json create mode 100644 documentation/scripts/post-process/package.json diff --git a/.github/workflows/cd-docs.yml b/.github/workflows/cd-docs.yml index a1ba0c104a..917a115064 100644 --- a/.github/workflows/cd-docs.yml +++ b/.github/workflows/cd-docs.yml @@ -38,6 +38,7 @@ jobs: - name: Build all projects in documentation/ & move to ~/dist/docs/ run: cd documentation && ./build_all_to_dist.sh continue-on-error: false + - name: Deploy branch master to dev continue-on-error: true uses: easingthemes/ssh-deploy@main @@ -49,6 +50,7 @@ jobs: REMOTE_USER: ${{ secrets.CD_WWW_REMOTE_USER }} TARGET: ${{ secrets.CD_WWW_REMOTE_TARGET }}/ EXCLUDE: "/node_modules/" + - name: Deploy branch master to prod if: github.ref == 'refs/heads/master' uses: easingthemes/ssh-deploy@main @@ -60,6 +62,44 @@ jobs: REMOTE_USER: ${{ secrets.CD_WWW_REMOTE_USER }} TARGET: ${{ secrets.CD_WWW_REMOTE_TARGET }}/ EXCLUDE: "/node_modules/" + + - name: Post process + run: cd documentation && ./post_process.sh + continue-on-error: false + + - name: Create Vercel project file + uses: mobiledevops/secret-to-file-action@v1 + with: + base64-encoded-secret: ${{ secrets.VERCEL_PROJECT_JSON_BASE64 }} + filename: "project.json" + is-executable: true + working-directory: "./dist/docs/.vercel" + + - name: Install Vercel CLI + run: npm install --global vercel@latest + + - name: Pull Vercel Environment Information (preview) + if: github.ref != 'refs/heads/master' + run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} + working-directory: dist/docs + - name: Pull Vercel Environment Information (production) + if: github.ref == 'refs/heads/master' + run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} + working-directory: dist/docs + + - name: Build Project Artifacts + run: vercel build --token=${{ secrets.VERCEL_TOKEN }} + working-directory: dist/docs + + - name: Deploy Project Artifacts to Vercel (preview) + if: github.ref != 'refs/heads/master' + run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} + working-directory: dist/docs + - name: Deploy Project Artifacts to Vercel (master) + if: github.ref == 'refs/heads/master' + run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }} + working-directory: dist/docs + - name: Matrix - Node Install run: npm install working-directory: .github/workflows/support-files diff --git a/documentation/dev-portal/book.toml b/documentation/dev-portal/book.toml index fb083e36a4..f8c4af7f63 100644 --- a/documentation/dev-portal/book.toml +++ b/documentation/dev-portal/book.toml @@ -38,7 +38,7 @@ chapter-line-height = "2em" section-line-height = "1.5em" # if true, never read and touch the files in theme dir -turn-off = false +turn-off = true [preprocessor.admonish] diff --git a/documentation/docs/book.toml b/documentation/docs/book.toml index b8b6636656..98534646ff 100644 --- a/documentation/docs/book.toml +++ b/documentation/docs/book.toml @@ -38,7 +38,7 @@ chapter-line-height = "2em" section-line-height = "1.5em" # if true, never read and touch the files in theme dir: this is used to stop the looping reload issue referred to in the readme -turn-off = false +turn-off = true [preprocessor.admonish] command = "mdbook-admonish" @@ -90,7 +90,7 @@ git-repository-icon = "fa-github" # edit-url-template = "https://github.com/rust-lang/mdBook/edit/master/guide/{path}" # site-url = "/docs/" # cname = "nymtech.net" -input-404 = "not-found.md" +input-404 = "not-found.md" [output.html.fold] enable = true # whether or not to enable section folding diff --git a/documentation/operators/book.toml b/documentation/operators/book.toml index 48a764213c..870118ee61 100644 --- a/documentation/operators/book.toml +++ b/documentation/operators/book.toml @@ -38,7 +38,7 @@ chapter-line-height = "2em" section-line-height = "1.5em" # if true, never read and touch the files in theme dir: this is used to stop the looping reload issue referred to in the readme -turn-off = false +turn-off = true [preprocessor.admonish] command = "mdbook-admonish" diff --git a/documentation/post_process.sh b/documentation/post_process.sh new file mode 100755 index 0000000000..bbc866a66b --- /dev/null +++ b/documentation/post_process.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# this is a script called by the github CI and CD workflows to post process CSS/image/href links for serving +# several mdbooks from a subdirectory + +cd scripts/post-process +npm install +node index.mjs diff --git a/documentation/scripts/post-process/index.mjs b/documentation/scripts/post-process/index.mjs new file mode 100644 index 0000000000..db37911027 --- /dev/null +++ b/documentation/scripts/post-process/index.mjs @@ -0,0 +1,88 @@ +import { unified } from "unified"; +import parse from "rehype-parse"; +import inspectUrls from "@jsdevtools/rehype-url-inspector"; +import stringify from "rehype-stringify"; +import { read, write } from "to-vfile"; +import path from "path"; +import fs from "fs"; +import { glob } from "glob"; + +async function main() { + const distDir = "../../../dist/docs"; + + const items = []; + + const books = [ + 'developers', + 'docs', + 'operators', + ]; + + for(const book of books) + { + // only process the root `index.html` files, because they have absolute paths instead of relative paths + const filenames = [ path.resolve(distDir, book, 'index.html') ]; + + // leaving this here for a future where other files need to be processed + // const filenames = await glob(path.resolve(distDir, book) + '/**/*.html'); + + for (const f of filenames) { + // Create a Rehype processor with the inspectUrls plugin + const processor = unified() + .use(parse) + .use(inspectUrls, { + inspectEach(args) { + const { url: rawUrl, propertyName } = args; + const { tagName } = args.node; + const filename = args.file.history[0]; + + const relativeFilename = path.relative(distDir, filename); + const relativeDirectory = path.dirname(relativeFilename); + + // remove relative paths from URL + const bareUrl = rawUrl.split('/').filter(c => c !== '.' && c !== '..').join('/'); + let url; + + if(rawUrl.includes('.html#')) { + url = path.join(`/${relativeDirectory}`, bareUrl); + } else if(rawUrl.startsWith('#')) { + url = path.join(`/`, relativeFilename + bareUrl); + } else { + url = path.join(`/${book}`, bareUrl); + } + + // const item = { filename, relativeDirectory, tagName, propertyName, rawUrl, url }; + const item = { tagName, rawUrl, url }; + + // if(tagName === 'a') { + // console.log(args); + // } + + if(!rawUrl.startsWith('http')) { + if (tagName === 'link' || tagName === 'script' || tagName === 'a') { + args.node.properties[propertyName] = url; + items.push(item); + } + } + } + }) + .use(stringify); + + // Read the example HTML file + const filename = path.resolve(distDir, f); + console.log(`${filename}...`); + + let file = await read(filename); + + // Crawl the HTML file and find all the URLs + const res = await processor.process(file); + + fs.writeFileSync(filename, res.value); + } + } + + // console.table(items); + // console.log(); +} + +main(); diff --git a/documentation/scripts/post-process/package-lock.json b/documentation/scripts/post-process/package-lock.json new file mode 100644 index 0000000000..8fcd8df5e6 --- /dev/null +++ b/documentation/scripts/post-process/package-lock.json @@ -0,0 +1,1313 @@ +{ + "name": "nym-docs-post-process", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "nym-docs-post-process", + "version": "1.0.0", + "dependencies": { + "@jsdevtools/rehype-url-inspector": "^2.0.2", + "glob": "^10.3.4", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "to-vfile": "^8.0.0", + "unified": "^11.0.2" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jsdevtools/rehype-url-inspector": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@jsdevtools/rehype-url-inspector/-/rehype-url-inspector-2.0.2.tgz", + "integrity": "sha512-iQL2lb+nOoT+5jFz1nfOa3oBJPF2JyBtPQgGmrRhxLT3QZAGIMLz/mh/9mUmk7FfKF5NB8xq0KoLn5F4/QHpyA==", + "dependencies": { + "url-regex": "^5.0.0", + "vfile": "^4.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/hast": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.0.tgz", + "integrity": "sha512-SoytUJRuf68HXYqcXicQIhCrLQjqeYU2anikr4G3p3Iz+OZO5QDQpDj++gv+RenHsnUBwNZ2dumBArF8VLSk2Q==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.0.tgz", + "integrity": "sha512-YLeG8CujC9adtj/kuDzq1N4tCDYKoZ5l/bnjq8d74+t/3q/tHquJOJKUQXJrLCflOHpKjXgcI/a929gpmLOEng==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz", + "integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", + "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", + "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz", + "integrity": "sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz", + "integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^9.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.3.tgz", + "integrity": "sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", + "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/property-information": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.3.0.tgz", + "integrity": "sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", + "integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.0.tgz", + "integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tlds": { + "version": "1.242.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.242.0.tgz", + "integrity": "sha512-aP3dXawgmbfU94mA32CJGHmJUE1E58HCB1KmlKRhBNtqBL27mSQcAEmcaMaQ1Za9kIVvOdbxJD3U5ycDy7nJ3w==", + "bin": { + "tlds": "bin.js" + } + }, + "node_modules/to-vfile": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-8.0.0.tgz", + "integrity": "sha512-IcmH1xB5576MJc9qcfEC/m/nQCFt3fzMHz45sSlgJyTWjRbKW1HAkJpuf3DgE57YzIlZcwcBZA5ENQbBo4aLkg==", + "dependencies": { + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/to-vfile/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/to-vfile/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unified": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.2.tgz", + "integrity": "sha512-Zta++onvS/dJ6xUvXQOR5q8XJZOkiMCE5wQ8Yv9mLR25pxRS567EX0GO6HZRxxNV/lznwfsvRZ/1pqe9K9QLeQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/url-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-5.0.0.tgz", + "integrity": "sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g==", + "dependencies": { + "ip-regex": "^4.1.0", + "tlds": "^1.203.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/vfile/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/documentation/scripts/post-process/package.json b/documentation/scripts/post-process/package.json new file mode 100644 index 0000000000..04e3a762a2 --- /dev/null +++ b/documentation/scripts/post-process/package.json @@ -0,0 +1,16 @@ +{ + "name": "nym-docs-post-process", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "process": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "@jsdevtools/rehype-url-inspector": "^2.0.2", + "glob": "^10.3.4", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "to-vfile": "^8.0.0", + "unified": "^11.0.2" + } +} From 96f9e39e1d82d91c706e940bbe0672a96a25f436 Mon Sep 17 00:00:00 2001 From: pierre Date: Tue, 5 Sep 2023 16:20:17 +0200 Subject: [PATCH 05/47] refresh nr list on privacy mode switch --- nym-connect/desktop/src/context/main.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nym-connect/desktop/src/context/main.tsx b/nym-connect/desktop/src/context/main.tsx index 2f553b5153..295117e260 100644 --- a/nym-connect/desktop/src/context/main.tsx +++ b/nym-connect/desktop/src/context/main.tsx @@ -239,6 +239,13 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { const setPrivacyLevel = async (value: PrivacyLevel) => { await invoke('set_privacy_level', { privacyLevel: value }); + // refresh service providers list + const fetchedServices = await invoke('get_services'); + setServiceProviders(fetchedServices); + // reset any previous selected SP + await invoke('set_selected_sp', { + serviceProvider: { is_active: false }, + }); // refresh user data await getUserData(); }; From d36451040043b56a93b308f45ce0b838f847a055 Mon Sep 17 00:00:00 2001 From: pierre Date: Tue, 5 Sep 2023 16:23:26 +0200 Subject: [PATCH 06/47] typo --- nym-connect/desktop/src/context/main.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-connect/desktop/src/context/main.tsx b/nym-connect/desktop/src/context/main.tsx index 295117e260..5954c4e40d 100644 --- a/nym-connect/desktop/src/context/main.tsx +++ b/nym-connect/desktop/src/context/main.tsx @@ -242,7 +242,7 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { // refresh service providers list const fetchedServices = await invoke('get_services'); setServiceProviders(fetchedServices); - // reset any previous selected SP + // reset any previously selected SP await invoke('set_selected_sp', { serviceProvider: { is_active: false }, }); From f16498915ae6e761bfd14316b8d75a2ede01ff96 Mon Sep 17 00:00:00 2001 From: pierre Date: Tue, 5 Sep 2023 17:02:24 +0200 Subject: [PATCH 07/47] fix types --- nym-connect/desktop/src/context/main.tsx | 4 ++-- nym-connect/desktop/src/context/mocks/main.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/nym-connect/desktop/src/context/main.tsx b/nym-connect/desktop/src/context/main.tsx index 5954c4e40d..9e8f5f21af 100644 --- a/nym-connect/desktop/src/context/main.tsx +++ b/nym-connect/desktop/src/context/main.tsx @@ -36,8 +36,8 @@ export type TClientContext = { setConnectionStats: (connectionStats: ConnectionStatsItem[] | undefined) => void; setConnectedSince: (connectedSince: DateTime | undefined) => void; setShowInfoModal: (show: boolean) => void; - setServiceProvider: () => void; - setGateway: () => void; + setServiceProvider: () => Promise; + setGateway: () => Promise; startConnecting: () => Promise; startDisconnecting: () => Promise; setUserDefinedGateway: React.Dispatch>; diff --git a/nym-connect/desktop/src/context/mocks/main.tsx b/nym-connect/desktop/src/context/mocks/main.tsx index 02de84aa69..2da2661939 100644 --- a/nym-connect/desktop/src/context/mocks/main.tsx +++ b/nym-connect/desktop/src/context/mocks/main.tsx @@ -21,8 +21,8 @@ const mockValues: TClientContext = { setConnectionStatus: () => {}, startConnecting: async () => {}, startDisconnecting: async () => {}, - setServiceProvider: () => {}, - setGateway: () => {}, + setServiceProvider: async () => {}, + setGateway: async () => {}, setUserDefinedGateway: () => {}, setUserDefinedSPAddress: () => {}, setMonitoring: async () => {}, From b3cd42de58de5f9ee762666bb56a2517f5ae2f31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C8=99u?= Date: Tue, 5 Sep 2023 18:33:42 +0300 Subject: [PATCH 08/47] Fix updater.json URL --- nym-connect/desktop/src-tauri/tauri.conf.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-connect/desktop/src-tauri/tauri.conf.json b/nym-connect/desktop/src-tauri/tauri.conf.json index 46c8645e64..dbc556f694 100644 --- a/nym-connect/desktop/src-tauri/tauri.conf.json +++ b/nym-connect/desktop/src-tauri/tauri.conf.json @@ -51,7 +51,7 @@ "updater": { "active": true, "endpoints": [ - "https://nymtech.net/.wellknown/mainnet/connect/updater.json" + "https://nymtech.net/.wellknown/connect/updater.json" ], "dialog": true, "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IENCNzQ2M0E5N0VFODE2NApSV1JrZ2U2WE9rYTNETTg1OTBKdE5uWUEra0hML2syOVUvQ2lxZmFZRzZ1T3NWbGM0eVRzUTVhVwo=" From 1cf2b10e310d8cc4670fcaee58dda8fa51d8f4db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 6 Sep 2023 09:58:24 +0200 Subject: [PATCH 09/47] clients: handle config upgrade failure --- .../src/client/config/old_config_v1_1_20_2.rs | 15 +++++--- clients/native/src/commands/mod.rs | 6 +-- clients/socks5/src/commands/mod.rs | 6 +-- .../socks5/src/config/old_config_v1_1_20_2.rs | 16 +++++--- .../config/disk_persistence/old_v1_1_20_2.rs | 16 ++++---- common/client-core/src/error.rs | 3 ++ nym-connect/desktop/Cargo.lock | 2 +- .../desktop/src-tauri/src/config/mod.rs | 37 ++++++++++++++++++- .../src/config/old_config_v1_1_20_2.rs | 7 ++-- .../desktop/src-tauri/src/config/upgrade.rs | 9 +++-- nym-connect/desktop/src-tauri/src/error.rs | 7 ++++ .../network-requester/src/cli/mod.rs | 6 +-- .../src/config/old_config_v1_1_20_2.rs | 16 +++++--- 13 files changed, 104 insertions(+), 42 deletions(-) diff --git a/clients/native/src/client/config/old_config_v1_1_20_2.rs b/clients/native/src/client/config/old_config_v1_1_20_2.rs index 6f4686b063..30969b0f12 100644 --- a/clients/native/src/client/config/old_config_v1_1_20_2.rs +++ b/clients/native/src/client/config/old_config_v1_1_20_2.rs @@ -1,8 +1,13 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::client::config::persistence::ClientPaths; -use crate::client::config::{default_config_filepath, Config, Socket, SocketType}; +use crate::{ + client::config::{ + default_config_filepath, persistence::ClientPaths, Config, Socket, SocketType, + }, + error::ClientError, +}; + use nym_bin_common::logging::LoggingSettings; use nym_client_core::config::disk_persistence::old_v1_1_20_2::CommonClientPathsV1_1_20_2; use nym_client_core::config::old_config_v1_1_20_2::ConfigV1_1_20_2 as BaseConfigV1_1_20_2; @@ -43,18 +48,18 @@ impl ConfigV1_1_20_2 { // in this upgrade, gateway endpoint configuration was moved out of the config file, // so its returned to be stored elsewhere. - pub fn upgrade(self) -> (Config, GatewayEndpointConfig) { + pub fn upgrade(self) -> Result<(Config, GatewayEndpointConfig), ClientError> { let gateway_details = self.base.client.gateway_endpoint.clone().into(); let config = Config { base: self.base.into(), socket: self.socket.into(), storage_paths: ClientPaths { - common_paths: self.storage_paths.common_paths.upgrade_default(), + common_paths: self.storage_paths.common_paths.upgrade_default()?, }, logging: self.logging, }; - (config, gateway_details) + Ok((config, gateway_details)) } } diff --git a/clients/native/src/commands/mod.rs b/clients/native/src/commands/mod.rs index 6badc58748..e1896bcfb6 100644 --- a/clients/native/src/commands/mod.rs +++ b/clients/native/src/commands/mod.rs @@ -157,7 +157,7 @@ fn try_upgrade_v1_1_13_config(id: &str) -> Result { let updated_step1: ConfigV1_1_20 = old_config.into(); let updated_step2: ConfigV1_1_20_2 = updated_step1.into(); - let (updated, gateway_config) = updated_step2.upgrade(); + let (updated, gateway_config) = updated_step2.upgrade()?; persist_gateway_details(&updated, gateway_config)?; updated.save_to_default_location()?; @@ -177,7 +177,7 @@ fn try_upgrade_v1_1_20_config(id: &str) -> Result { info!("It is going to get updated to the current specification."); let updated_step1: ConfigV1_1_20_2 = old_config.into(); - let (updated, gateway_config) = updated_step1.upgrade(); + let (updated, gateway_config) = updated_step1.upgrade()?; persist_gateway_details(&updated, gateway_config)?; updated.save_to_default_location()?; @@ -194,7 +194,7 @@ fn try_upgrade_v1_1_20_2_config(id: &str) -> Result { info!("It seems the client is using <= v1.1.20_2 config template."); info!("It is going to get updated to the current specification."); - let (updated, gateway_config) = old_config.upgrade(); + let (updated, gateway_config) = old_config.upgrade()?; persist_gateway_details(&updated, gateway_config)?; updated.save_to_default_location()?; diff --git a/clients/socks5/src/commands/mod.rs b/clients/socks5/src/commands/mod.rs index d2b37b5a84..f9e876015d 100644 --- a/clients/socks5/src/commands/mod.rs +++ b/clients/socks5/src/commands/mod.rs @@ -199,7 +199,7 @@ fn try_upgrade_v1_1_13_config(id: &str) -> Result { let updated_step1: ConfigV1_1_20 = old_config.into(); let updated_step2: ConfigV1_1_20_2 = updated_step1.into(); - let (updated, gateway_config) = updated_step2.upgrade(); + let (updated, gateway_config) = updated_step2.upgrade()?; persist_gateway_details(&updated, gateway_config)?; updated.save_to_default_location()?; @@ -219,7 +219,7 @@ fn try_upgrade_v1_1_20_config(id: &str) -> Result { info!("It is going to get updated to the current specification."); let updated_step1: ConfigV1_1_20_2 = old_config.into(); - let (updated, gateway_config) = updated_step1.upgrade(); + let (updated, gateway_config) = updated_step1.upgrade()?; persist_gateway_details(&updated, gateway_config)?; updated.save_to_default_location()?; @@ -236,7 +236,7 @@ fn try_upgrade_v1_1_20_2_config(id: &str) -> Result { info!("It seems the client is using <= v1.1.20_2 config template."); info!("It is going to get updated to the current specification."); - let (updated, gateway_config) = old_config.upgrade(); + let (updated, gateway_config) = old_config.upgrade()?; persist_gateway_details(&updated, gateway_config)?; updated.save_to_default_location()?; diff --git a/clients/socks5/src/config/old_config_v1_1_20_2.rs b/clients/socks5/src/config/old_config_v1_1_20_2.rs index 47d6dabe3f..998bd90b32 100644 --- a/clients/socks5/src/config/old_config_v1_1_20_2.rs +++ b/clients/socks5/src/config/old_config_v1_1_20_2.rs @@ -1,17 +1,21 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::config::persistence::SocksClientPaths; -use crate::config::{default_config_filepath, Config}; +use crate::{ + config::{default_config_filepath, persistence::SocksClientPaths, Config}, + error::Socks5ClientError, +}; + use nym_bin_common::logging::LoggingSettings; use nym_client_core::config::disk_persistence::old_v1_1_20_2::CommonClientPathsV1_1_20_2; use nym_client_core::config::GatewayEndpointConfig; use nym_config::read_config_from_toml_file; -pub use nym_socks5_client_core::config::old_config_v1_1_20_2::ConfigV1_1_20_2 as CoreConfigV1_1_20_2; use serde::{Deserialize, Serialize}; use std::io; use std::path::Path; +pub use nym_socks5_client_core::config::old_config_v1_1_20_2::ConfigV1_1_20_2 as CoreConfigV1_1_20_2; + #[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Clone)] pub struct SocksClientPathsV1_1_20_2 { #[serde(flatten)] @@ -39,16 +43,16 @@ impl ConfigV1_1_20_2 { // in this upgrade, gateway endpoint configuration was moved out of the config file, // so its returned to be stored elsewhere. - pub fn upgrade(self) -> (Config, GatewayEndpointConfig) { + pub fn upgrade(self) -> Result<(Config, GatewayEndpointConfig), Socks5ClientError> { let gateway_details = self.core.base.client.gateway_endpoint.clone().into(); let config = Config { core: self.core.into(), storage_paths: SocksClientPaths { - common_paths: self.storage_paths.common_paths.upgrade_default(), + common_paths: self.storage_paths.common_paths.upgrade_default()?, }, logging: self.logging, }; - (config, gateway_details) + Ok((config, gateway_details)) } } diff --git a/common/client-core/src/config/disk_persistence/old_v1_1_20_2.rs b/common/client-core/src/config/disk_persistence/old_v1_1_20_2.rs index 3346dca6ca..d26cf1461c 100644 --- a/common/client-core/src/config/disk_persistence/old_v1_1_20_2.rs +++ b/common/client-core/src/config/disk_persistence/old_v1_1_20_2.rs @@ -3,6 +3,7 @@ use crate::config::disk_persistence::keys_paths::ClientKeysPaths; use crate::config::disk_persistence::{CommonClientPaths, DEFAULT_GATEWAY_DETAILS_FILENAME}; +use crate::error::ClientCoreError; use serde::{Deserialize, Serialize}; use std::path::PathBuf; @@ -15,16 +16,17 @@ pub struct CommonClientPathsV1_1_20_2 { } impl CommonClientPathsV1_1_20_2 { - pub fn upgrade_default(self) -> CommonClientPaths { - let data_dir = self - .reply_surb_database - .parent() - .expect("client paths upgrade failure"); - CommonClientPaths { + pub fn upgrade_default(self) -> Result { + let data_dir = self.reply_surb_database.parent().ok_or_else(|| { + ClientCoreError::UnableToUpgradeConfigFile { + new_version: "1.1.20-2".to_string(), + } + })?; + Ok(CommonClientPaths { keys: self.keys, gateway_details: data_dir.join(DEFAULT_GATEWAY_DETAILS_FILENAME), credentials_database: self.credentials_database, reply_surb_database: self.reply_surb_database, - } + }) } } diff --git a/common/client-core/src/error.rs b/common/client-core/src/error.rs index c0dc76f1e6..0c30c149cb 100644 --- a/common/client-core/src/error.rs +++ b/common/client-core/src/error.rs @@ -119,6 +119,9 @@ pub enum ClientCoreError { #[error("the provided gateway details (for gateway {gateway_id}) do not correspond to the shared keys")] MismatchedGatewayDetails { gateway_id: String }, + + #[error("unable to upgrade config file to `{new_version}`")] + UnableToUpgradeConfigFile { new_version: String }, } /// Set of messages that the client can send to listeners via the task manager diff --git a/nym-connect/desktop/Cargo.lock b/nym-connect/desktop/Cargo.lock index e7c60df056..0181354c1d 100644 --- a/nym-connect/desktop/Cargo.lock +++ b/nym-connect/desktop/Cargo.lock @@ -3992,7 +3992,7 @@ dependencies = [ [[package]] name = "nym-connect" -version = "1.1.19" +version = "1.1.20" dependencies = [ "anyhow", "bip39", diff --git a/nym-connect/desktop/src-tauri/src/config/mod.rs b/nym-connect/desktop/src-tauri/src/config/mod.rs index 538b5e5fbb..40de5d4827 100644 --- a/nym-connect/desktop/src-tauri/src/config/mod.rs +++ b/nym-connect/desktop/src-tauri/src/config/mod.rs @@ -137,6 +137,20 @@ fn init_paths(id: &str) -> io::Result<()> { fs::create_dir_all(default_config_directory(id)) } +fn try_extract_version_for_upgrade_failure(err: BackendError) -> Option { + if let BackendError::ClientCoreError { source } = err { + if let nym_client_core::error::ClientCoreError::UnableToUpgradeConfigFile { new_version } = + source + { + Some(new_version) + } else { + None + } + } else { + None + } +} + pub async fn init_socks5_config(provider_address: String, chosen_gateway_id: String) -> Result<()> { log::trace!("Initialising client..."); @@ -145,10 +159,29 @@ pub async fn init_socks5_config(provider_address: String, chosen_gateway_id: Str let _validated = identity::PublicKey::from_base58_string(&chosen_gateway_id) .map_err(|_| BackendError::UnableToParseGateway)?; - let already_init = if default_config_filepath(&id).exists() { + let config_path = default_config_filepath(&id); + let already_init = if config_path.exists() { // in case we're using old config, try to upgrade it // (if we're using the current version, it's a no-op) - try_upgrade_config(&id)?; + if let Err(err) = try_upgrade_config(&id) { + log::error!( + "Failed to upgrade config file {}: {:?}", + config_path.display(), + err + ); + if let Some(failed_at_version) = try_extract_version_for_upgrade_failure(err) { + return Err( + BackendError::CouldNotUpgradeExistingConfigurationFileAtVersion { + file: config_path, + failed_at_version, + }, + ); + } else { + return Err(BackendError::CouldNotUpgradeExistingConfigurationFile { + file: config_path, + }); + } + }; eprintln!("SOCKS5 client \"{id}\" was already initialised before"); true } else { diff --git a/nym-connect/desktop/src-tauri/src/config/old_config_v1_1_20_2.rs b/nym-connect/desktop/src-tauri/src/config/old_config_v1_1_20_2.rs index df6356b226..0a2f017a75 100644 --- a/nym-connect/desktop/src-tauri/src/config/old_config_v1_1_20_2.rs +++ b/nym-connect/desktop/src-tauri/src/config/old_config_v1_1_20_2.rs @@ -3,6 +3,7 @@ use crate::config::persistence::NymConnectPaths; use crate::config::{default_config_filepath, Config}; +use crate::error::Result; use nym_bin_common::logging::LoggingSettings; use nym_client_core::config::disk_persistence::old_v1_1_20_2::CommonClientPathsV1_1_20_2; use nym_client_core::config::GatewayEndpointConfig; @@ -39,16 +40,16 @@ impl ConfigV1_1_20_2 { // in this upgrade, gateway endpoint configuration was moved out of the config file, // so its returned to be stored elsewhere. - pub fn upgrade(self) -> (Config, GatewayEndpointConfig) { + pub fn upgrade(self) -> Result<(Config, GatewayEndpointConfig)> { let gateway_details = self.core.base.client.gateway_endpoint.clone().into(); let config = Config { core: self.core.into(), storage_paths: NymConnectPaths { - common_paths: self.storage_paths.common_paths.upgrade_default(), + common_paths: self.storage_paths.common_paths.upgrade_default()?, }, // logging: self.logging, }; - (config, gateway_details) + Ok((config, gateway_details)) } } diff --git a/nym-connect/desktop/src-tauri/src/config/upgrade.rs b/nym-connect/desktop/src-tauri/src/config/upgrade.rs index 2f4d37b777..2f41a964f4 100644 --- a/nym-connect/desktop/src-tauri/src/config/upgrade.rs +++ b/nym-connect/desktop/src-tauri/src/config/upgrade.rs @@ -8,7 +8,7 @@ use crate::{ }, error::{BackendError, Result}, }; -use log::info; +use log::{debug, info}; use nym_client_core::{ client::{ base_client::storage::gateway_details::{OnDiskGatewayDetails, PersistedGatewayDetails}, @@ -52,7 +52,7 @@ fn try_upgrade_v1_1_13_config(id: &str) -> Result { let updated_step1: ConfigV1_1_20 = old_config.into(); let updated_step2: ConfigV1_1_20_2 = updated_step1.into(); - let (updated, gateway_config) = updated_step2.upgrade(); + let (updated, gateway_config) = updated_step2.upgrade()?; persist_gateway_details(&updated, gateway_config)?; updated.save_to_default_location()?; @@ -72,7 +72,7 @@ fn try_upgrade_v1_1_20_config(id: &str) -> Result { info!("It is going to get updated to the current specification."); let updated_step1: ConfigV1_1_20_2 = old_config.into(); - let (updated, gateway_config) = updated_step1.upgrade(); + let (updated, gateway_config) = updated_step1.upgrade()?; persist_gateway_details(&updated, gateway_config)?; updated.save_to_default_location()?; @@ -89,7 +89,7 @@ fn try_upgrade_v1_1_20_2_config(id: &str) -> Result { info!("It seems the client is using <= v1.1.20_2 config template."); info!("It is going to get updated to the current specification."); - let (updated, gateway_config) = old_config.upgrade(); + let (updated, gateway_config) = old_config.upgrade()?; persist_gateway_details(&updated, gateway_config)?; updated.save_to_default_location()?; @@ -97,6 +97,7 @@ fn try_upgrade_v1_1_20_2_config(id: &str) -> Result { } pub fn try_upgrade_config(id: &str) -> Result<()> { + debug!("Attempting to upgrade config file for \"{id}\""); if try_upgrade_v1_1_13_config(id)? { return Ok(()); } diff --git a/nym-connect/desktop/src-tauri/src/error.rs b/nym-connect/desktop/src-tauri/src/error.rs index a6290280c3..5b324a8850 100644 --- a/nym-connect/desktop/src-tauri/src/error.rs +++ b/nym-connect/desktop/src-tauri/src/error.rs @@ -81,6 +81,13 @@ pub enum BackendError { CouldNotGetConfigFilename, #[error("could not load existing gateway configuration")] CouldNotLoadExistingGatewayConfiguration(std::io::Error), + #[error("could not upgrade `{file}` to latest version")] + CouldNotUpgradeExistingConfigurationFile { file: std::path::PathBuf }, + #[error("could not upgrade `{file}` to latest version (failed at {failed_at_version})")] + CouldNotUpgradeExistingConfigurationFileAtVersion { + file: std::path::PathBuf, + failed_at_version: String, + }, #[error("no gateways found in directory")] NoGatewaysFoundInDirectory, diff --git a/service-providers/network-requester/src/cli/mod.rs b/service-providers/network-requester/src/cli/mod.rs index 98106b3ca7..3df493c724 100644 --- a/service-providers/network-requester/src/cli/mod.rs +++ b/service-providers/network-requester/src/cli/mod.rs @@ -179,7 +179,7 @@ fn try_upgrade_v1_1_13_config(id: &str) -> Result { let updated_step1: ConfigV1_1_20 = old_config.into(); let updated_step2: ConfigV1_1_20_2 = updated_step1.into(); - let (updated, gateway_config) = updated_step2.upgrade(); + let (updated, gateway_config) = updated_step2.upgrade()?; persist_gateway_details(&updated, gateway_config)?; updated.save_to_default_location()?; @@ -201,7 +201,7 @@ fn try_upgrade_v1_1_20_config(id: &str) -> Result { info!("It is going to get updated to the current specification."); let updated_step1: ConfigV1_1_20_2 = old_config.into(); - let (updated, gateway_config) = updated_step1.upgrade(); + let (updated, gateway_config) = updated_step1.upgrade()?; persist_gateway_details(&updated, gateway_config)?; updated.save_to_default_location()?; @@ -220,7 +220,7 @@ fn try_upgrade_v1_1_20_2_config(id: &str) -> Result info!("It seems the client is using <= v1.1.20_2 config template."); info!("It is going to get updated to the current specification."); - let (updated, gateway_config) = old_config.upgrade(); + let (updated, gateway_config) = old_config.upgrade()?; persist_gateway_details(&updated, gateway_config)?; updated.save_to_default_location()?; diff --git a/service-providers/network-requester/src/config/old_config_v1_1_20_2.rs b/service-providers/network-requester/src/config/old_config_v1_1_20_2.rs index 280d6e1ec1..68cd8031ec 100644 --- a/service-providers/network-requester/src/config/old_config_v1_1_20_2.rs +++ b/service-providers/network-requester/src/config/old_config_v1_1_20_2.rs @@ -1,8 +1,14 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::config::persistence::NetworkRequesterPaths; -use crate::config::{default_config_filepath, Config, Debug, NetworkRequester}; +use crate::{ + config::{ + default_config_filepath, persistence::NetworkRequesterPaths, Config, Debug, + NetworkRequester, + }, + error::NetworkRequesterError, +}; + use log::trace; use nym_bin_common::logging::LoggingSettings; use nym_client_core::config::disk_persistence::old_v1_1_20_2::CommonClientPathsV1_1_20_2; @@ -58,7 +64,7 @@ impl ConfigV1_1_20_2 { // in this upgrade, gateway endpoint configuration was moved out of the config file, // so its returned to be stored elsewhere. - pub fn upgrade(self) -> (Config, GatewayEndpointConfig) { + pub fn upgrade(self) -> Result<(Config, GatewayEndpointConfig), NetworkRequesterError> { trace!("Upgrading from v1.1.20_2"); let gateway_details = self.base.client.gateway_endpoint.clone().into(); let nr_description = self @@ -72,7 +78,7 @@ impl ConfigV1_1_20_2 { let config = Config { base: self.base.into(), storage_paths: NetworkRequesterPaths { - common_paths: self.storage_paths.common_paths.upgrade_default(), + common_paths: self.storage_paths.common_paths.upgrade_default()?, allowed_list_location: self.storage_paths.allowed_list_location, unknown_list_location: self.storage_paths.unknown_list_location, nr_description, @@ -82,7 +88,7 @@ impl ConfigV1_1_20_2 { network_requester: self.network_requester.into(), }; - (config, gateway_details) + Ok((config, gateway_details)) } } From e336b9948e67468a0a6dc3d1162c74a251c5e5e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 6 Sep 2023 10:23:10 +0200 Subject: [PATCH 10/47] Collapse conditional --- nym-connect/desktop/src-tauri/src/config/mod.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/nym-connect/desktop/src-tauri/src/config/mod.rs b/nym-connect/desktop/src-tauri/src/config/mod.rs index 40de5d4827..267c970069 100644 --- a/nym-connect/desktop/src-tauri/src/config/mod.rs +++ b/nym-connect/desktop/src-tauri/src/config/mod.rs @@ -8,6 +8,7 @@ use crate::error::{BackendError, Result}; use nym_client_core::client::base_client::storage::gateway_details::OnDiskGatewayDetails; use nym_client_core::client::key_manager::persistence::OnDiskKeys; use nym_client_core::config::GatewayEndpointConfig; +use nym_client_core::error::ClientCoreError; use nym_client_core::init::GatewaySetup; use nym_config::{ must_get_home, read_config_from_toml_file, save_formatted_config_to_file, NymConfigTemplate, @@ -138,14 +139,11 @@ fn init_paths(id: &str) -> io::Result<()> { } fn try_extract_version_for_upgrade_failure(err: BackendError) -> Option { - if let BackendError::ClientCoreError { source } = err { - if let nym_client_core::error::ClientCoreError::UnableToUpgradeConfigFile { new_version } = - source - { - Some(new_version) - } else { - None - } + if let BackendError::ClientCoreError { + source: ClientCoreError::UnableToUpgradeConfigFile { new_version }, + } = err + { + Some(new_version) } else { None } From 499fd8a91dc1d091e6a676676ba453a4cc6e8d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 6 Sep 2023 11:24:17 +0200 Subject: [PATCH 11/47] Fix clippy unused import (#3848) --- explorer-api/explorer-client/src/lib.rs | 1 + nym-connect/desktop/Cargo.lock | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/explorer-api/explorer-client/src/lib.rs b/explorer-api/explorer-client/src/lib.rs index acb1cc7e67..6a8790bd34 100644 --- a/explorer-api/explorer-client/src/lib.rs +++ b/explorer-api/explorer-client/src/lib.rs @@ -1,3 +1,4 @@ +#[cfg(not(target_arch = "wasm32"))] use std::time::Duration; use reqwest::StatusCode; diff --git a/nym-connect/desktop/Cargo.lock b/nym-connect/desktop/Cargo.lock index e7c60df056..0181354c1d 100644 --- a/nym-connect/desktop/Cargo.lock +++ b/nym-connect/desktop/Cargo.lock @@ -3992,7 +3992,7 @@ dependencies = [ [[package]] name = "nym-connect" -version = "1.1.19" +version = "1.1.20" dependencies = [ "anyhow", "bip39", From 2a87533b12f725fd7e74410c5da4a8d394de613c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 6 Sep 2023 11:58:39 +0100 Subject: [PATCH 12/47] added 'open_proxy', 'enabled_statistics' and 'statistics_recipient' to NR config (#3839) * added 'open_proxy', 'enabled_statistics' and 'statistics_recipient' to NR config * Update template.rs fixed missing quotation marks --- .../network-requester/src/cli/init.rs | 17 ++++++++- .../network-requester/src/cli/mod.rs | 8 ++++ .../network-requester/src/cli/run.rs | 38 ++++++------------- .../network-requester/src/config/mod.rs | 34 +++++++++++++++++ .../network-requester/src/config/template.rs | 11 +++++- .../network-requester/src/core.rs | 34 ++++++++--------- 6 files changed, 96 insertions(+), 46 deletions(-) diff --git a/service-providers/network-requester/src/cli/init.rs b/service-providers/network-requester/src/cli/init.rs index 9cd092fc89..24b887c039 100644 --- a/service-providers/network-requester/src/cli/init.rs +++ b/service-providers/network-requester/src/cli/init.rs @@ -27,6 +27,19 @@ pub(crate) struct Init { #[arg(long)] id: String, + /// Specifies whether this network requester should run in 'open-proxy' mode + #[arg(long)] + open_proxy: Option, + + /// Enable service anonymized statistics that get sent to a statistics aggregator server + #[arg(long)] + enable_statistics: Option, + + /// Mixnet client address where a statistics aggregator is running. The default value is a Nym + /// aggregator client + #[arg(long)] + statistics_recipient: Option, + /// Id of the gateway we are going to connect to. #[arg(long)] gateway: Option, @@ -66,9 +79,11 @@ impl From for OverrideConfig { fastmode: false, no_cover: false, medium_toggle: false, - nyxd_urls: init_config.nyxd_urls, enabled_credentials_mode: init_config.enabled_credentials_mode, + open_proxy: init_config.open_proxy, + enable_statistics: init_config.enabled_credentials_mode, + statistics_recipient: init_config.statistics_recipient, } } } diff --git a/service-providers/network-requester/src/cli/mod.rs b/service-providers/network-requester/src/cli/mod.rs index 98106b3ca7..c844b4799d 100644 --- a/service-providers/network-requester/src/cli/mod.rs +++ b/service-providers/network-requester/src/cli/mod.rs @@ -19,6 +19,7 @@ use nym_client_core::client::base_client::storage::gateway_details::{ use nym_client_core::client::key_manager::persistence::OnDiskKeys; use nym_client_core::config::GatewayEndpointConfig; use nym_client_core::error::ClientCoreError; +use nym_config::OptionalSet; use nym_sphinx::params::PacketSize; mod build_info; @@ -81,6 +82,10 @@ pub(crate) struct OverrideConfig { medium_toggle: bool, nyxd_urls: Option>, enabled_credentials_mode: Option, + + open_proxy: Option, + enable_statistics: Option, + statistics_recipient: Option, } pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config { @@ -126,6 +131,9 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config { BaseClientConfig::with_disabled_credentials, args.enabled_credentials_mode.map(|b| !b), ) + .with_optional(Config::with_open_proxy, args.open_proxy) + .with_optional(Config::with_enabled_statistics, args.enable_statistics) + .with_optional(Config::with_statistics_recipient, args.statistics_recipient) } pub(crate) async fn execute(args: Cli) -> Result<(), NetworkRequesterError> { diff --git a/service-providers/network-requester/src/cli/run.rs b/service-providers/network-requester/src/cli/run.rs index 4e5cee9c47..a2ca949675 100644 --- a/service-providers/network-requester/src/cli/run.rs +++ b/service-providers/network-requester/src/cli/run.rs @@ -8,7 +8,6 @@ use crate::{ }; use clap::Args; use log::error; -use nym_sphinx::addressing::clients::Recipient; const ENABLE_STATISTICS: &str = "enable-statistics"; @@ -21,11 +20,11 @@ pub(crate) struct Run { /// Specifies whether this network requester should run in 'open-proxy' mode #[arg(long)] - open_proxy: bool, + open_proxy: Option, /// Enable service anonymized statistics that get sent to a statistics aggregator server #[arg(long)] - enable_statistics: bool, + enable_statistics: Option, /// Mixnet client address where a statistics aggregator is running. The default value is a Nym /// aggregator client @@ -61,12 +60,19 @@ impl From for OverrideConfig { medium_toggle: run_config.medium_toggle, nyxd_urls: None, enabled_credentials_mode: run_config.enabled_credentials_mode, + open_proxy: run_config.open_proxy, + enable_statistics: run_config.enabled_credentials_mode, + statistics_recipient: run_config.statistics_recipient, } } } pub(crate) async fn execute(args: &Run) -> Result<(), NetworkRequesterError> { - if args.open_proxy { + let mut config = try_load_current_config(&args.id)?; + config = override_config(config, OverrideConfig::from(args.clone())); + log::debug!("Using config: {:#?}", config); + + if config.network_requester.open_proxy { println!( "\n\nYOU HAVE STARTED IN 'OPEN PROXY' MODE. ANYONE WITH YOUR CLIENT ADDRESS \ CAN MAKE REQUESTS FROM YOUR MACHINE. PLEASE QUIT IF YOU DON'T UNDERSTAND WHAT \ @@ -74,7 +80,7 @@ pub(crate) async fn execute(args: &Run) -> Result<(), NetworkRequesterError> { ); } - if args.enable_statistics { + if config.network_requester.enabled_statistics { println!( "\n\nTHE NETWORK REQUESTER STATISTICS ARE ENABLED. IT WILL COLLECT AND SEND \ ANONYMIZED STATISTICS TO A CENTRAL SERVER. PLEASE QUIT IF YOU DON'T WANT \ @@ -82,32 +88,12 @@ pub(crate) async fn execute(args: &Run) -> Result<(), NetworkRequesterError> { ); } - let mut config = try_load_current_config(&args.id)?; - config = override_config(config, OverrideConfig::from(args.clone())); - log::debug!("Using config: {:#?}", config); - if !version_check(&config) { error!("failed the local version check"); return Err(NetworkRequesterError::FailedLocalVersionCheck); } - // TODO: consider incorporating statistics_recipient, open_proxy and enable_statistics in - // `Config`. - - let stats_provider_addr = args - .statistics_recipient - .as_ref() - .map(Recipient::try_from_base58_string) - .transpose() - .unwrap_or(None); - log::info!("Starting socks5 service provider"); - let server = crate::core::NRServiceProviderBuilder::new( - config, - args.open_proxy, - args.enable_statistics, - stats_provider_addr, - ) - .await; + let server = crate::core::NRServiceProviderBuilder::new(config).await; server.run_service_provider().await } diff --git a/service-providers/network-requester/src/config/mod.rs b/service-providers/network-requester/src/config/mod.rs index e4ba1fa9da..0298d6caaa 100644 --- a/service-providers/network-requester/src/config/mod.rs +++ b/service-providers/network-requester/src/config/mod.rs @@ -112,6 +112,24 @@ impl Config { self.base.validate() } + #[must_use] + pub fn with_open_proxy(mut self, open_proxy: bool) -> Self { + self.network_requester.open_proxy = open_proxy; + self + } + + #[must_use] + pub fn with_enabled_statistics(mut self, enabled_statistics: bool) -> Self { + self.network_requester.enabled_statistics = enabled_statistics; + self + } + + #[must_use] + pub fn with_statistics_recipient(mut self, statistics_recipient: String) -> Self { + self.network_requester.statistics_recipient = Some(statistics_recipient); + self + } + // poor man's 'builder' method pub fn with_base(mut self, f: F, val: T) -> Self where @@ -162,12 +180,28 @@ impl Config { #[derive(Debug, Clone, Deserialize, PartialEq, Serialize)] #[serde(default, deny_unknown_fields)] pub struct NetworkRequester { + /// specifies whether this network requester should run in 'open-proxy' mode + /// and thus would attempt to resolve **ANY** request it receives. + pub open_proxy: bool, + + /// specifies whether this network requester would send anonymized statistics to a statistics aggregator server + pub enabled_statistics: bool, + + /// in case of enabled statistics, specifies mixnet client address where a statistics aggregator is running + pub statistics_recipient: Option, + + /// Disable Poisson sending rate, and only send cover traffic occasionally as keepalive messages. + /// This is equivalent to setting debug.traffic.disable_main_poisson_packet_distribution = true, + /// and debug.cover_traffic.loop_cover_traffic_average_delay = 5s. pub disable_poisson_rate: bool, } impl Default for NetworkRequester { fn default() -> Self { NetworkRequester { + open_proxy: false, + enabled_statistics: false, + statistics_recipient: None, disable_poisson_rate: true, } } diff --git a/service-providers/network-requester/src/config/template.rs b/service-providers/network-requester/src/config/template.rs index 567793c064..1c701f5f94 100644 --- a/service-providers/network-requester/src/config/template.rs +++ b/service-providers/network-requester/src/config/template.rs @@ -81,12 +81,21 @@ nr_description = '{{ storage_paths.nr_description }}' [network_requester] +# specifies whether this network requester should run in 'open-proxy' mode +# and thus would attempt to resolve **ANY** request it receives. +open_proxy = {{ network_requester.open_proxy }} + +# specifies whether this network requester would send anonymized statistics to a statistics aggregator server +enabled_statistics = {{ network_requester.enabled_statistics }} + +# in case of enabled statistics, specifies mixnet client address where a statistics aggregator is running +statistics_recipient = '{{ network_requester.statistics_recipient }}' + # Disable Poisson sending rate, and only send cover traffic occasionally as keepalive messages. # This is equivalent to setting debug.traffic.disable_main_poisson_packet_distribution = true, # and debug.cover_traffic.loop_cover_traffic_average_delay = 5s. disable_poisson_rate = {{ network_requester.disable_poisson_rate }} - ##### logging configuration options ##### [logging] diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs index cd9b57f2dd..19685615e8 100644 --- a/service-providers/network-requester/src/core.rs +++ b/service-providers/network-requester/src/core.rs @@ -53,9 +53,6 @@ pub(crate) fn new_legacy_request_version() -> RequestVersion { pub struct NRServiceProviderBuilder { config: Config, outbound_request_filter: OutboundRequestFilter, - open_proxy: bool, - enable_statistics: bool, - stats_provider_addr: Option, standard_list: StandardList, allowed_hosts: StoredAllowedHosts, } @@ -64,7 +61,6 @@ struct NRServiceProvider { config: Config, outbound_request_filter: OutboundRequestFilter, - open_proxy: bool, mixnet_client: nym_sdk::mixnet::MixnetClient, controller_sender: ControllerSender, @@ -158,12 +154,7 @@ impl ServiceProvider for NRServiceProvider { } impl NRServiceProviderBuilder { - pub async fn new( - config: Config, - open_proxy: bool, - enable_statistics: bool, - stats_provider_addr: Option, - ) -> NRServiceProviderBuilder { + pub async fn new(config: Config) -> NRServiceProviderBuilder { let standard_list = StandardList::new(); let allowed_hosts = StoredAllowedHosts::new(&config.storage_paths.allowed_list_location); @@ -176,9 +167,6 @@ impl NRServiceProviderBuilder { NRServiceProviderBuilder { config, outbound_request_filter, - open_proxy, - enable_statistics, - stats_provider_addr, standard_list, allowed_hosts, } @@ -186,6 +174,15 @@ impl NRServiceProviderBuilder { /// Start all subsystems pub async fn run_service_provider(self) -> Result<(), NetworkRequesterError> { + let stats_provider_addr = self + .config + .network_requester + .statistics_recipient + .as_ref() + .map(Recipient::try_from_base58_string) + .transpose() + .unwrap_or(None); + // Connect to the mixnet let mixnet_client = create_mixnet_client(&self.config.base, &self.config.storage_paths.common_paths) @@ -208,9 +205,9 @@ impl NRServiceProviderBuilder { active_connections_controller.run().await; }); - let stats_collector = if self.enable_statistics { + let stats_collector = if self.config.network_requester.enabled_statistics { let stats_collector = - ServiceStatisticsCollector::new(self.stats_provider_addr, mix_input_sender.clone()) + ServiceStatisticsCollector::new(stats_provider_addr, mix_input_sender.clone()) .await .expect("Service statistics collector could not be bootstrapped"); let mut stats_sender = StatisticsSender::new(stats_collector.clone()); @@ -253,7 +250,6 @@ impl NRServiceProviderBuilder { let service_provider = NRServiceProvider { config: self.config, outbound_request_filter: self.outbound_request_filter, - open_proxy: self.open_proxy, mixnet_client, controller_sender, mix_input_sender, @@ -434,7 +430,8 @@ impl NRServiceProvider { let remote_addr = connect_req.remote_addr; let conn_id = connect_req.conn_id; - if !self.open_proxy && !self.outbound_request_filter.check(&remote_addr).await { + let open_proxy = self.config.network_requester.open_proxy; + if !open_proxy && !self.outbound_request_filter.check(&remote_addr).await { let log_msg = format!("Domain {remote_addr:?} failed filter check"); log::info!("{}", log_msg); let msg = MixnetMessage::new_connection_error( @@ -488,10 +485,11 @@ impl NRServiceProvider { query: QueryRequest, ) -> Result, NetworkRequesterError> { let protocol_version = Socks5ProtocolVersion::default(); + let response = match query { QueryRequest::OpenProxy => Socks5Response::new_query( protocol_version, - QueryResponse::OpenProxy(self.open_proxy), + QueryResponse::OpenProxy(self.config.network_requester.open_proxy), ), QueryRequest::Description => Socks5Response::new_query( protocol_version, From f6fe5d41ea04d2a122997d7949ab15fa41d8ce46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Tue, 5 Sep 2023 15:42:36 +0100 Subject: [PATCH 13/47] introduced named TaskClient and including the name for logs --- common/task/src/manager.rs | 74 ++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 6 deletions(-) diff --git a/common/task/src/manager.rs b/common/task/src/manager.rs index 358534e09b..a60ee39214 100644 --- a/common/task/src/manager.rs +++ b/common/task/src/manager.rs @@ -5,6 +5,7 @@ use std::future::Future; use std::{error::Error, time::Duration}; use futures::{future::pending, FutureExt, SinkExt, StreamExt}; +use log::{log, Level}; use tokio::{ sync::{ mpsc, @@ -207,8 +208,11 @@ impl TaskManager { /// Listen for shutdown notifications, and can send error and status messages back to the /// `TaskManager` -#[derive(Clone, Debug)] +#[derive(Debug)] pub struct TaskClient { + // optional name assigned to the shutdown handle + name: Option, + // If a shutdown notification has been registered shutdown: bool, @@ -229,7 +233,35 @@ pub struct TaskClient { mode: ClientOperatingMode, } +impl Clone for TaskClient { + fn clone(&self) -> Self { + // make sure to not accidentally overflow the stack if we keep cloning the handle + let name = if let Some(name) = &self.name { + if name != Self::OVERFLOW_NAME && name.len() < Self::MAX_NAME_LENGTH { + Some(format!("{name}-child")) + } else { + Some(Self::OVERFLOW_NAME.to_string()) + } + } else { + None + }; + + TaskClient { + name, + shutdown: self.shutdown, + notify: self.notify.clone(), + return_error: self.return_error.clone(), + drop_error: self.drop_error.clone(), + status_msg: self.status_msg.clone(), + mode: self.mode.clone(), + } + } +} + impl TaskClient { + const MAX_NAME_LENGTH: usize = 128; + const OVERFLOW_NAME: &'static str = "reached maximum TaskClient children name depth"; + #[cfg(not(target_arch = "wasm32"))] const SHUTDOWN_TIMEOUT_WAITING_FOR_SIGNAL_ON_EXIT: Duration = Duration::from_secs(5); @@ -240,6 +272,7 @@ impl TaskClient { status_msg: StatusSender, ) -> TaskClient { TaskClient { + name: None, shutdown: false, notify, return_error, @@ -249,6 +282,27 @@ impl TaskClient { } } + // just a convenience wrapper for including the shutdown name when logging + // I really didn't want to create macros for that... because that seemed like an overkill. + // but I guess it would have resolved needing to call `format!` for additional msg arguments + fn log>(&self, level: Level, msg: S) { + let msg = msg.into(); + + let target = &if let Some(name) = &self.name { + format!("TaskClient-{name}") + } else { + "unnamed-TaskClient".to_string() + }; + + log!(target: target, level, "{msg}") + } + + #[must_use] + pub fn named>(mut self, name: S) -> Self { + self.name = Some(name.into()); + self + } + pub async fn run_future(&mut self, fut: Fut) -> Option where Fut: Future, @@ -267,6 +321,7 @@ impl TaskClient { let (task_drop_tx, _task_drop_rx) = mpsc::unbounded_channel(); let (task_status_tx, _task_status_rx) = futures::channel::mpsc::channel(128); TaskClient { + name: None, shutdown: false, notify: notify_rx, return_error: task_halt_tx, @@ -336,8 +391,9 @@ impl TaskClient { has_changed } Err(err) => { - log::error!("Polling shutdown failed: {err}"); - log::error!("Assuming this means we should shutdown..."); + self.log(Level::Error, format!("Polling shutdown failed: {err}")); + self.log(Level::Error, "Assuming this means we should shutdown..."); + true } } @@ -354,9 +410,11 @@ impl TaskClient { if self.mode.is_dummy() { return; } - log::trace!("Notifying we stopped: {err}"); + + self.log(Level::Trace, format!("Notifying we stopped: {err}")); + if self.return_error.send(err).is_err() { - log::error!("Failed to send back error message"); + self.log(Level::Error, "failed to send back error message"); } } @@ -372,11 +430,15 @@ impl TaskClient { impl Drop for TaskClient { fn drop(&mut self) { + self.log(Level::Debug, "the shutdown is getting dropped"); + if !self.mode.should_signal_on_drop() { return; } + if !self.is_shutdown_poll() { - log::trace!("Notifying stop on unexpected drop"); + self.log(Level::Trace, "Notifying stop on unexpected drop"); + // If we can't send, well then there is not much to do self.drop_error .send(Box::new(TaskError::UnexpectedHalt)) From a8f70fe4a28927618244b7669ce81468a31a89e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Tue, 5 Sep 2023 15:52:42 +0100 Subject: [PATCH 14/47] few named examples for mixnode --- common/mixnode-common/src/verloc/mod.rs | 6 +++--- common/mixnode-common/src/verloc/sender.rs | 2 +- common/task/src/manager.rs | 14 ++++++++++++++ mixnode/src/node/mod.rs | 15 +++++++++------ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/common/mixnode-common/src/verloc/mod.rs b/common/mixnode-common/src/verloc/mod.rs index 8535b98100..3872f8002e 100644 --- a/common/mixnode-common/src/verloc/mod.rs +++ b/common/mixnode-common/src/verloc/mod.rs @@ -197,12 +197,12 @@ impl VerlocMeasurer { config.packet_timeout, config.connection_timeout, config.delay_between_packets, - shutdown_listener.clone(), + shutdown_listener.clone().named("VerlocPacketSender"), )), packet_listener: Arc::new(PacketListener::new( config.listening_address, Arc::clone(&identity), - shutdown_listener.clone(), + shutdown_listener.clone().named("VerlocPacketListener"), )), shutdown_listener, currently_used_api: 0, @@ -241,7 +241,7 @@ impl VerlocMeasurer { return MeasurementOutcome::Done; } - let mut shutdown_listener = self.shutdown_listener.clone(); + let mut shutdown_listener = self.shutdown_listener.clone().named("VerlocMeasurement"); shutdown_listener.mark_as_success(); for chunk in nodes_to_test.chunks(self.config.tested_nodes_batch_size) { diff --git a/common/mixnode-common/src/verloc/sender.rs b/common/mixnode-common/src/verloc/sender.rs index 665acc3145..8940738bcf 100644 --- a/common/mixnode-common/src/verloc/sender.rs +++ b/common/mixnode-common/src/verloc/sender.rs @@ -83,7 +83,7 @@ impl PacketSender { self: Arc, tested_node: TestedNode, ) -> Result { - let mut shutdown_listener = self.shutdown_listener.clone(); + let mut shutdown_listener = self.shutdown_listener.fork(tested_node.address.to_string()); shutdown_listener.mark_as_success(); let mut conn = match tokio::time::timeout( diff --git a/common/task/src/manager.rs b/common/task/src/manager.rs index a60ee39214..a99e036231 100644 --- a/common/task/src/manager.rs +++ b/common/task/src/manager.rs @@ -282,6 +282,20 @@ impl TaskClient { } } + // TODO: not convinced about the name... + pub fn fork>(&self, child_suffix: S) -> Self { + let mut child = self.clone(); + let suffix = child_suffix.into(); + let child_name = if let Some(base) = &self.name { + format!("{base}-{suffix}") + } else { + format!("unknown-{suffix}") + }; + + child.name = Some(child_name); + child + } + // just a convenience wrapper for including the shutdown name when logging // I really didn't want to create macros for that... because that seemed like an overkill. // but I guess it would have resolved needing to call `format!` for additional msg arguments diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index a6571adbd5..98b0c769dc 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -274,16 +274,19 @@ impl MixNode { let shutdown = TaskManager::default(); - let (node_stats_pointer, node_stats_update_sender) = - self.start_node_stats_controller(shutdown.subscribe()); - let delay_forwarding_channel = self - .start_packet_delay_forwarder(node_stats_update_sender.clone(), shutdown.subscribe()); + let (node_stats_pointer, node_stats_update_sender) = self + .start_node_stats_controller(shutdown.subscribe().named("node_statistics::Controller")); + let delay_forwarding_channel = self.start_packet_delay_forwarder( + node_stats_update_sender.clone(), + shutdown.subscribe().named("DelayForwarder"), + ); self.start_socket_listener( node_stats_update_sender, delay_forwarding_channel, - shutdown.subscribe(), + shutdown.subscribe().named("Listener"), ); - let atomic_verloc_results = self.start_verloc_measurements(shutdown.subscribe()); + let atomic_verloc_results = + self.start_verloc_measurements(shutdown.subscribe().named("VerlocMeasurer")); // Rocket handles shutdown on it's own, but its shutdown handling should be incorporated // with that of the rest of the tasks. From 32ee16bf0bd996dd58d3a00d0d1e048c870f10e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Tue, 5 Sep 2023 16:25:49 +0100 Subject: [PATCH 15/47] added task name to 'UnexpectedHalt' error --- common/task/src/manager.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/common/task/src/manager.rs b/common/task/src/manager.rs index a99e036231..a2a7cdd087 100644 --- a/common/task/src/manager.rs +++ b/common/task/src/manager.rs @@ -24,10 +24,18 @@ pub type SentStatus = Box; pub type StatusSender = futures::channel::mpsc::Sender; pub type StatusReceiver = futures::channel::mpsc::Receiver; +fn try_recover_name(name: &Option) -> String { + if let Some(name) = name { + name.clone() + } else { + "unknown".to_string() + } +} + #[derive(thiserror::Error, Debug)] enum TaskError { - #[error("Task halted unexpectedly")] - UnexpectedHalt, + #[error("Task '{}' halted unexpectedly", try_recover_name(.shutdown_name))] + UnexpectedHalt { shutdown_name: Option }, } // TODO: possibly we should create a `Status` trait instead of reusing `Error` @@ -455,7 +463,9 @@ impl Drop for TaskClient { // If we can't send, well then there is not much to do self.drop_error - .send(Box::new(TaskError::UnexpectedHalt)) + .send(Box::new(TaskError::UnexpectedHalt { + shutdown_name: self.name.clone(), + })) .ok(); } } From 0efa78c4a8e786f78beff02a33aad84b54fa35c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 6 Sep 2023 12:50:52 +0100 Subject: [PATCH 16/47] adjusted logging on TaskClient Drop --- common/task/src/manager.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/common/task/src/manager.rs b/common/task/src/manager.rs index a2a7cdd087..670f9c7bb6 100644 --- a/common/task/src/manager.rs +++ b/common/task/src/manager.rs @@ -452,10 +452,11 @@ impl TaskClient { impl Drop for TaskClient { fn drop(&mut self) { - self.log(Level::Debug, "the shutdown is getting dropped"); - if !self.mode.should_signal_on_drop() { + self.log(Level::Debug, "the task client is getting dropped"); return; + } else { + self.log(Level::Info, "the task client is getting dropped"); } if !self.is_shutdown_poll() { From 33bf344d631010ca7c9a1df08962cea279a9eaf9 Mon Sep 17 00:00:00 2001 From: serinko <97586125+serinko@users.noreply.github.com> Date: Wed, 6 Sep 2023 12:34:24 +0200 Subject: [PATCH 17/47] initialized faq section, moved existing faqs, started general faq page --- documentation/dev-portal/src/SUMMARY.md | 8 +++- .../dev-portal/src/faq/general-faq.md | 45 +++++++++++++++++++ .../faq.md => faq/integrations-faq.md} | 0 .../rewards-faq.md | 2 +- 4 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 documentation/dev-portal/src/faq/general-faq.md rename documentation/dev-portal/src/{integrations/faq.md => faq/integrations-faq.md} (100%) rename documentation/dev-portal/src/{community-resources => faq}/rewards-faq.md (99%) diff --git a/documentation/dev-portal/src/SUMMARY.md b/documentation/dev-portal/src/SUMMARY.md index 2095d6bc30..6ee7eec1de 100644 --- a/documentation/dev-portal/src/SUMMARY.md +++ b/documentation/dev-portal/src/SUMMARY.md @@ -25,7 +25,6 @@ # Integrations - [Integration Options](integrations/integration-options.md) -- [Integration FAQ](integrations/faq.md) - [Mixnet Integration](integrations/mixnet-integration.md) - [Payment Integration](integrations/payment-integration.md) @@ -51,12 +50,17 @@ - [Sending a Message Through the Mixnet](tutorials/simple-service-provider/sending-message.md) +# FAQ + +- [General](faq/general-faq.md) +- [Integrations](faq/integrations-faq.md) +- [Rewards & Token](faq/rewards-faq.md) + # Community Resources - [Nym DevRel AMAs](community-resources/ama.md) - [Community Applications and Guides](community-resources/community-applications-and-guides.md) - [Change Service Grantee Information](info-request.md) -- [Rewards FAQ](community-resources/rewards-faq.md) --- # Misc. diff --git a/documentation/dev-portal/src/faq/general-faq.md b/documentation/dev-portal/src/faq/general-faq.md new file mode 100644 index 0000000000..a6192b2d1d --- /dev/null +++ b/documentation/dev-portal/src/faq/general-faq.md @@ -0,0 +1,45 @@ +# Nym General FAQ + +> If you have questions which are not answered below, please share them at our [DevRel AMAs](../community-resources/ama.md) or seek support in [Nym's community](https://nymtech.net/community) + +### What is Nym? + +Nym is a privacy platform that secures user data and protects against surveillance at the network level. + +The platform does so by leveraging different technological components: + +- **Nym Mixnet**, a type of overlay network that makes both content and metadata of transactions private through mixing, network-level obfuscation and incentivisation (using Sphinx); +- A blockchain called **Nyx**, our Cosmos SDK blockchain, to allow for us to use payment tokens in the form of NYM, as well as smart contracts, in order to create a robust, decentralized, and secure environment incentives for the Mixnet; +- **Coconut**, a zero-knowledge signature scheme, that creates an application-level private access control layer to power Zk-Nyms; +- A utility token **NYM**, to pay for usage, measure reputation and serve as rewards for the privacy infrastructure. + +Simply put, the [Nym network ("Nym")](https://www.feat-nym-update-nym-web.websites.dev.nymte.ch/nym-whitepaper.pdf) is a decentralized and incentivized infrastructure to provision privacy to a broad range of message-based applications and services. Think of it as a [*"Layer 0" privacy infrastructure*](https://blog.nymtech.net/nym-layer-0-privacy-infrastructure-for-the-whole-internet-e53238f9b8e7) for the entire internet. + +**Related articles:** +- [*Nym is not a blockchain, but is powered by one*](https://blog.nymtech.net/nym-is-not-a-blockchain-but-it-is-powered-by-one-4bb16ef16587) +- [*Nym tokens*](https://blog.nymtech.net/nym-tokens-where-do-they-live-and-how-are-they-distributed-cross-chain-8d134bf9c41f) +- [*A breakdown of the smart contracts that run the Nym token economics*](https://blog.nymtech.net/a-breakdown-of-the-smart-contracts-that-run-the-nym-token-economics-3a61b4139f95) +- [*Zk-Nyms are here*](https://blog.nymtech.net/a-breakdown-of-the-smart-contracts-that-run-the-nym-token-economics-3a61b4139f95) +- [*Sphinx: the anonymous data format that powers Nym*](https://blog.nymtech.net/sphinx-tl-dr-the-data-packet-that-can-anonymize-bitcoin-and-the-internet-18d152c6e4dc) + + +### What's the difference between Nym and VPNs? + +Nym is not an onion routing system, it is not a decentralized VPN - it’s much more than that. Nym is a mixnet meant to stop precisely the traffic analysis attacks that Tor and dVPNs are vulnerable to. + +It is an orthogonal design that maintains better privacy and can support anonymity, although usually with a cost in terms of latency. +It basically is an infrastructure on which privacy preserving apps can be built, leveraging the Mixnet and Coconut credentials, amongst others. +The **Nym mixnet and VPNs differ** because VPNs do not mix nor do they protect metadata from an adversary who may be able to watch the entire network. + +**Related articles:** +- [*VPNs, Tor, I2P, how does Nym compare? *](https://blog.nymtech.net/vpns-tor-i2p-how-does-nym-compare-8576824617b8) + + +### What is Nym’s VPN? + +Since Q2 2023 the Nym core team has been working on launching the **first major consumer facing product** that runs on top of the Nym mixnet: a high speed, trustless and decentralized VPN, paid for via the NYM token - facilitating anonymous payments if wished. +The product positions itself as a full-network protection service available across all of a user’s devices, **leveraging the Nym Mixnet** and other primitives to offer split tunneling and traffic obfuscation techniques to protect against censorship. + +**Related articles:** +- [*What does it take to build the most powerful VPN?*](https://blog.nymtech.net/what-does-it-take-to-build-the-worlds-most-powerful-vpn-d351a76ec4e6) + diff --git a/documentation/dev-portal/src/integrations/faq.md b/documentation/dev-portal/src/faq/integrations-faq.md similarity index 100% rename from documentation/dev-portal/src/integrations/faq.md rename to documentation/dev-portal/src/faq/integrations-faq.md diff --git a/documentation/dev-portal/src/community-resources/rewards-faq.md b/documentation/dev-portal/src/faq/rewards-faq.md similarity index 99% rename from documentation/dev-portal/src/community-resources/rewards-faq.md rename to documentation/dev-portal/src/faq/rewards-faq.md index 78cd37be84..5e16571066 100644 --- a/documentation/dev-portal/src/community-resources/rewards-faq.md +++ b/documentation/dev-portal/src/faq/rewards-faq.md @@ -1,4 +1,4 @@ -## Rewards FAQ +# Rewards FAQ On this page you will find important information about participation in community activities which involve NYM token rewards, such as contests, giveaways, and promotions. Before participating in any such activity, make sure to read this page carefully. From 8d2e8b3d26d9f6295b4b489bdfd07884427acb9e Mon Sep 17 00:00:00 2001 From: pierre Date: Wed, 6 Sep 2023 18:36:01 +0200 Subject: [PATCH 18/47] init --- nym-vpn/android/.gitignore | 71 +++ nym-vpn/android/.gitkeep | 0 nym-vpn/android/LICENSE | 21 + nym-vpn/android/README.md | 42 ++ nym-vpn/android/app/.gitignore | 2 + nym-vpn/android/app/build.gradle.kts | 159 +++++++ .../android/app/objectbox-models/default.json | 99 +++++ .../app/objectbox-models/default.json.bak | 94 ++++ nym-vpn/android/app/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.kt | 24 + .../android/app/src/main/AndroidManifest.xml | 115 +++++ .../app/src/main/ic_launcher-playstore.png | Bin 0 -> 39338 bytes .../wireguardautotunnel/Constants.kt | 6 + .../WireGuardAutoTunnel.kt | 27 ++ .../wireguardautotunnel/module/BoxModule.kt | 40 ++ .../module/RepositoryModule.kt | 25 ++ .../module/ServiceModule.kt | 29 ++ .../module/TunnelModule.kt | 31 ++ .../receiver/BootReceiver.kt | 39 ++ .../receiver/NotificationActionReceiver.kt | 39 ++ .../repository/Repository.kt | 16 + .../repository/SettingsBox.kt | 63 +++ .../repository/TunnelBox.kt | 57 +++ .../service/foreground/Action.kt | 6 + .../service/foreground/ForegroundService.kt | 64 +++ .../service/foreground/ServiceManager.kt | 90 ++++ .../service/foreground/ServiceState.kt | 6 + .../WireGuardConnectivityWatcherService.kt | 210 +++++++++ .../foreground/WireGuardTunnelService.kt | 154 +++++++ .../service/network/BaseNetworkService.kt | 117 +++++ .../service/network/MobileDataService.kt | 10 + .../service/network/NetworkService.kt | 10 + .../service/network/NetworkStatus.kt | 10 + .../service/network/WifiService.kt | 10 + .../notification/NotificationService.kt | 21 + .../notification/WireGuardNotification.kt | 77 ++++ .../service/shortcut/ShortcutsActivity.kt | 28 ++ .../service/shortcut/ShortcutsManager.kt | 73 +++ .../service/tile/TunnelControlTile.kt | 142 ++++++ .../service/tunnel/HandshakeStatus.kt | 14 + .../service/tunnel/VpnService.kt | 18 + .../service/tunnel/WireGuardTunnel.kt | 131 ++++++ .../service/tunnel/model/Settings.kt | 15 + .../service/tunnel/model/TunnelConfig.kt | 89 ++++ .../wireguardautotunnel/ui/MainActivity.kt | 201 +++++++++ .../wireguardautotunnel/ui/Routes.kt | 36 ++ .../wireguardautotunnel/ui/ViewState.kt | 9 + .../ui/common/ClickableIconButton.kt | 31 ++ .../common/PermissionRequestFailedScreen.kt | 35 ++ .../ui/common/RowListItem.kt | 55 +++ .../ui/common/SearchBar.kt | 80 ++++ .../ui/common/navigation/BottomNavBar.kt | 42 ++ .../ui/common/navigation/BottomNavItem.kt | 9 + .../ui/screens/config/ConfigScreen.kt | 241 ++++++++++ .../ui/screens/config/ConfigViewModel.kt | 152 +++++++ .../ui/screens/detail/DetailScreen.kt | 139 ++++++ .../ui/screens/detail/DetailViewModel.kt | 45 ++ .../ui/screens/main/MainScreen.kt | 336 ++++++++++++++ .../ui/screens/main/MainViewModel.kt | 179 ++++++++ .../ui/screens/settings/SettingsScreen.kt | 415 ++++++++++++++++++ .../ui/screens/settings/SettingsViewModel.kt | 124 ++++++ .../ui/screens/support/SupportScreen.kt | 83 ++++ .../wireguardautotunnel/ui/theme/Color.kt | 17 + .../wireguardautotunnel/ui/theme/Theme.kt | 80 ++++ .../ui/theme/TransparentSystemBars.kt | 22 + .../wireguardautotunnel/ui/theme/Type.kt | 34 ++ .../wireguardautotunnel/util/NumberUtils.kt | 25 ++ .../app/src/main/res/drawable/discord.xml | 10 + .../app/src/main/res/drawable/github.xml | 12 + .../res/drawable/ic_launcher_background.xml | 170 +++++++ .../res/drawable/ic_launcher_foreground.xml | 30 ++ .../app/src/main/res/drawable/shield.xml | 5 + .../app/src/main/res/drawable/vpn_off.xml | 5 + .../app/src/main/res/drawable/vpn_on.xml | 5 + .../main/res/mipmap-anydpi-v26/ic_banner.xml | 5 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 2004 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 2936 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 3568 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1268 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 1926 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 2242 bytes .../src/main/res/mipmap-xhdpi/ic_banner.png | Bin 0 -> 3578 bytes .../res/mipmap-xhdpi/ic_banner_foreground.png | Bin 0 -> 3770 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 2728 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 3956 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 5030 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 4246 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 6154 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 5854 bytes .../ic_launcher_foreground.webp | Bin 0 -> 8314 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 10402 bytes .../app/src/main/res/values/colors.xml | 11 + .../main/res/values/ic_banner_background.xml | 4 + .../res/values/ic_launcher_background.xml | 4 + .../app/src/main/res/values/strings.xml | 90 ++++ .../app/src/main/res/values/themes.xml | 6 + .../app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../wireguardautotunnel/ExampleUnitTest.kt | 17 + nym-vpn/android/build.gradle.kts | 19 + nym-vpn/android/gradle.properties | 25 ++ .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + nym-vpn/android/gradlew | 185 ++++++++ nym-vpn/android/gradlew.bat | 89 ++++ nym-vpn/android/settings.gradle.kts | 18 + 109 files changed, 5463 insertions(+) create mode 100644 nym-vpn/android/.gitignore delete mode 100644 nym-vpn/android/.gitkeep create mode 100644 nym-vpn/android/LICENSE create mode 100644 nym-vpn/android/README.md create mode 100644 nym-vpn/android/app/.gitignore create mode 100644 nym-vpn/android/app/build.gradle.kts create mode 100644 nym-vpn/android/app/objectbox-models/default.json create mode 100644 nym-vpn/android/app/objectbox-models/default.json.bak create mode 100644 nym-vpn/android/app/proguard-rules.pro create mode 100644 nym-vpn/android/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt create mode 100644 nym-vpn/android/app/src/main/AndroidManifest.xml create mode 100644 nym-vpn/android/app/src/main/ic_launcher-playstore.png create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/BootReceiver.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/NotificationActionReceiver.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceManager.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsActivity.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsManager.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile/TunnelControlTile.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/HandshakeStatus.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/SearchBar.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigScreen.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigViewModel.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailScreen.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailViewModel.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt create mode 100644 nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/NumberUtils.kt create mode 100644 nym-vpn/android/app/src/main/res/drawable/discord.xml create mode 100644 nym-vpn/android/app/src/main/res/drawable/github.xml create mode 100644 nym-vpn/android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 nym-vpn/android/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 nym-vpn/android/app/src/main/res/drawable/shield.xml create mode 100644 nym-vpn/android/app/src/main/res/drawable/vpn_off.xml create mode 100644 nym-vpn/android/app/src/main/res/drawable/vpn_on.xml create mode 100644 nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml create mode 100644 nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner.png create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 nym-vpn/android/app/src/main/res/values/colors.xml create mode 100644 nym-vpn/android/app/src/main/res/values/ic_banner_background.xml create mode 100644 nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 nym-vpn/android/app/src/main/res/values/strings.xml create mode 100644 nym-vpn/android/app/src/main/res/values/themes.xml create mode 100644 nym-vpn/android/app/src/main/res/xml/backup_rules.xml create mode 100644 nym-vpn/android/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 nym-vpn/android/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt create mode 100644 nym-vpn/android/build.gradle.kts create mode 100644 nym-vpn/android/gradle.properties create mode 100644 nym-vpn/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 nym-vpn/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 nym-vpn/android/gradlew create mode 100644 nym-vpn/android/gradlew.bat create mode 100644 nym-vpn/android/settings.gradle.kts diff --git a/nym-vpn/android/.gitignore b/nym-vpn/android/.gitignore new file mode 100644 index 0000000000..31caa0cedf --- /dev/null +++ b/nym-vpn/android/.gitignore @@ -0,0 +1,71 @@ +# Built application files +*.apk +*.aar +*.ap_ +*.aab +# Files for the ART/Dalvik VM +*.dex +# Java class files +*.class +# Generated files +bin/ +gen/ +out/ +release/ +build/ +# Gradle files +.gradle/ +# Local configuration file (sdk path, etc) +local.properties +# Proguard folder generated by Eclipse +proguard/ +# Log Files +*.log +# Android Studio Navigation editor temp files +.navigation/ +# Android Studio captures folder +captures/ +# IntelliJ +*.iml +.idea/ +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/gradle.xml +# .idea/assetWizardSettings.xml +# .idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +*.jks +*.keystore +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ +# Freeline +freeline.py +freeline/ +freeline_project_description.json +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md +# Version control +vcs.xml +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ +# MacOS +.DS_Store +# App Specific cases +app/release/output.json +.idea/codeStyles/ diff --git a/nym-vpn/android/.gitkeep b/nym-vpn/android/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/nym-vpn/android/LICENSE b/nym-vpn/android/LICENSE new file mode 100644 index 0000000000..51f3844dba --- /dev/null +++ b/nym-vpn/android/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 NymConnect + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/nym-vpn/android/README.md b/nym-vpn/android/README.md new file mode 100644 index 0000000000..e4a334e993 --- /dev/null +++ b/nym-vpn/android/README.md @@ -0,0 +1,42 @@ +## NymConnect for Android + +### Prerequisites + +_TODO_ + +### Getting started + +[Install](https://developer.android.com/studio/install) Android Studio and open +the project.\ +Setup an android emulator using AVD.\ +[Run](https://developer.android.com/studio/run/emulator) the project. + +**⚠ NOTE**: be sure +to [set](https://developer.android.com/studio/run#changing-variant) +the build variant to `x86_64Debug` when running on emulator + +### Features + +* Add tunnels via .conf file +* Auto connect to VPN based on Wi-Fi SSID +* Split tunneling by application with search +* Always-on VPN for Android support +* Quick tile support for vpn toggling +* Dynamic shortcuts support for automation integration +* Configurable Trusted Network list +* Optional auto connect on mobile data +* Automatic service restart after reboot +* Service will stay running in background after app has been closed + +### Building + +_TODO_ + +### Credits + +This project is based on the "WG Tunnel" project made by Zane Schepke +https://github.com/zaneschepke/wgtunnel + +### License + +MIT diff --git a/nym-vpn/android/app/.gitignore b/nym-vpn/android/app/.gitignore new file mode 100644 index 0000000000..956c004dc0 --- /dev/null +++ b/nym-vpn/android/app/.gitignore @@ -0,0 +1,2 @@ +/build +/release \ No newline at end of file diff --git a/nym-vpn/android/app/build.gradle.kts b/nym-vpn/android/app/build.gradle.kts new file mode 100644 index 0000000000..bc158e58e9 --- /dev/null +++ b/nym-vpn/android/app/build.gradle.kts @@ -0,0 +1,159 @@ +val rExtra = rootProject.extra + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + kotlin("kapt") + id("com.google.dagger.hilt.android") + id("org.jetbrains.kotlin.plugin.serialization") + id("io.objectbox") +} + +android { + namespace = "net.nymtech.nymconnect" + compileSdk = 34 + + val versionMajor = 1 + val versionMinor = 0 + val versionPatch = 0 + val versionBuild = 0 + + defaultConfig { + applicationId = "net.nymtech.nymconnect" + minSdk = 28 + targetSdk = 34 + versionCode = versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild + versionName = "${versionMajor}.${versionMinor}.${versionPatch}" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + release { + isDebuggable = false + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = "17" + } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.4.8" + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } + + /* flavorDimensions += "abi" + productFlavors { + create("universal") { + dimension = "abi" + ndk { + abiFilters += listOf("arm64-v8a", "armeabi-v7a", "x86_64", "x86") + } + } + create("arch64") { + dimension = "abi" + ndk { + abiFilters += listOf("arm64-v8a", "x86_64") + } + } + create("arm64") { + dimension = "abi" + ndk { + abiFilters += "arm64-v8a" + } + } + create("arm") { + dimension = "abi" + ndk { + abiFilters += "armeabi-v7a" + } + } + create("x86_64") { + dimension = "abi" + ndk { + abiFilters += "x86_64" + } + } + create("x86") { + dimension = "abi" + ndk { + abiFilters += "x86" + } + } + } */ +} + +dependencies { + implementation("androidx.core:core-ktx:1.10.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") + implementation("androidx.activity:activity-compose:1.7.2") + implementation(platform("androidx.compose:compose-bom:2023.03.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material3:material3:1.1.1") + implementation("androidx.appcompat:appcompat:1.6.1") + + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) + androidTestImplementation("androidx.compose.ui:ui-test-junit4") + debugImplementation("androidx.compose.ui:ui-tooling") + debugImplementation("androidx.compose.ui:ui-test-manifest") + + //wireguard tunnel + implementation("com.wireguard.android:tunnel:1.0.20230706") + + //logging + implementation("com.jakewharton.timber:timber:5.0.1") + + // compose navigation + implementation("androidx.navigation:navigation-compose:2.7.1") + implementation("androidx.hilt:hilt-navigation-compose:1.0.0") + + // hilt + implementation("com.google.dagger:hilt-android:${rExtra.get("hiltVersion")}") + kapt("com.google.dagger:hilt-android-compiler:${rExtra.get("hiltVersion")}") + + //accompanist + implementation("com.google.accompanist:accompanist-systemuicontroller:${rExtra.get("accompanistVersion")}") + implementation("com.google.accompanist:accompanist-permissions:${rExtra.get("accompanistVersion")}") + implementation("com.google.accompanist:accompanist-flowlayout:${rExtra.get("accompanistVersion")}") + implementation("com.google.accompanist:accompanist-navigation-animation:${rExtra.get("accompanistVersion")}") + implementation("com.google.accompanist:accompanist-drawablepainter:${rExtra.get("accompanistVersion")}") + + //db + implementation("io.objectbox:objectbox-kotlin:${rExtra.get("objectBoxVersion")}") + + //lifecycle + implementation("androidx.lifecycle:lifecycle-runtime-compose:2.6.1") + + //icons + implementation("androidx.compose.material:material-icons-extended:1.5.0") + + + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") +} + +kapt { + correctErrorTypes = true +} \ No newline at end of file diff --git a/nym-vpn/android/app/objectbox-models/default.json b/nym-vpn/android/app/objectbox-models/default.json new file mode 100644 index 0000000000..dd7a8ab78e --- /dev/null +++ b/nym-vpn/android/app/objectbox-models/default.json @@ -0,0 +1,99 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "1:2692736974585027589", + "lastPropertyId": "15:5057486545428188436", + "name": "TunnelConfig", + "properties": [ + { + "id": "1:1985347930017457084", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "12:2409068226744965585", + "name": "name", + "indexId": "1:4811206443952699137", + "type": 9, + "flags": 34848 + }, + { + "id": "13:8987443291286312275", + "name": "wgQuick", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "2:8887605597748372702", + "lastPropertyId": "9:4468844863383145378", + "name": "Settings", + "properties": [ + { + "id": "1:7485739868216068651", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:5814013113141456749", + "name": "isAutoTunnelEnabled", + "type": 1 + }, + { + "id": "4:5645665441196906014", + "name": "trustedNetworkSSIDs", + "type": 30 + }, + { + "id": "5:4989886999117763881", + "name": "isTunnelOnMobileDataEnabled", + "type": 1 + }, + { + "id": "6:3370284381040192129", + "name": "defaultTunnel", + "type": 9 + }, + { + "id": "9:4468844863383145378", + "name": "isAlwaysOnVpnEnabled", + "type": 1 + } + ], + "relations": [] + } + ], + "lastEntityId": "2:8887605597748372702", + "lastIndexId": "1:4811206443952699137", + "lastRelationId": "0:0", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [ + 1763475292291320186, + 6483820955437198310, + 8323071516033820771, + 5904440563612311217, + 1408037976996390989, + 7737847485212546994, + 8215616901775229364, + 8021610768066328637, + 6174306582797008721, + 2175939938544485767, + 7555225587864607050, + 969146862000617878, + 5057486545428188436, + 2814640993034665120, + 4981008812459251156 + ], + "retiredRelationUids": [], + "version": 1 +} \ No newline at end of file diff --git a/nym-vpn/android/app/objectbox-models/default.json.bak b/nym-vpn/android/app/objectbox-models/default.json.bak new file mode 100644 index 0000000000..d4084866ef --- /dev/null +++ b/nym-vpn/android/app/objectbox-models/default.json.bak @@ -0,0 +1,94 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "1:2692736974585027589", + "lastPropertyId": "15:5057486545428188436", + "name": "TunnelConfig", + "properties": [ + { + "id": "1:1985347930017457084", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "12:2409068226744965585", + "name": "name", + "indexId": "1:4811206443952699137", + "type": 9, + "flags": 34848 + }, + { + "id": "13:8987443291286312275", + "name": "wgQuick", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "2:8887605597748372702", + "lastPropertyId": "8:4981008812459251156", + "name": "Settings", + "properties": [ + { + "id": "1:7485739868216068651", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:5814013113141456749", + "name": "isAutoTunnelEnabled", + "type": 1 + }, + { + "id": "4:5645665441196906014", + "name": "trustedNetworkSSIDs", + "type": 30 + }, + { + "id": "5:4989886999117763881", + "name": "isTunnelOnMobileDataEnabled", + "type": 1 + }, + { + "id": "6:3370284381040192129", + "name": "defaultTunnel", + "type": 9 + } + ], + "relations": [] + } + ], + "lastEntityId": "2:8887605597748372702", + "lastIndexId": "1:4811206443952699137", + "lastRelationId": "0:0", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [ + 1763475292291320186, + 6483820955437198310, + 8323071516033820771, + 5904440563612311217, + 1408037976996390989, + 7737847485212546994, + 8215616901775229364, + 8021610768066328637, + 6174306582797008721, + 2175939938544485767, + 7555225587864607050, + 969146862000617878, + 5057486545428188436, + 2814640993034665120, + 4981008812459251156 + ], + "retiredRelationUids": [], + "version": 1 +} \ No newline at end of file diff --git a/nym-vpn/android/app/proguard-rules.pro b/nym-vpn/android/app/proguard-rules.pro new file mode 100644 index 0000000000..481bb43481 --- /dev/null +++ b/nym-vpn/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/nym-vpn/android/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt b/nym-vpn/android/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt new file mode 100644 index 0000000000..c006861187 --- /dev/null +++ b/nym-vpn/android/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package net.nymtech.nymconnect + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("net.nymtech.nymconnect", appContext.packageName) + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/AndroidManifest.xml b/nym-vpn/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..2ff4f063bb --- /dev/null +++ b/nym-vpn/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/ic_launcher-playstore.png b/nym-vpn/android/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..e5d8e99564658add3373147cb1504f3eb1e9776f GIT binary patch literal 39338 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 UitnrlZu;iLF&ndYM?E6{2jO2F=>Px# literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt new file mode 100644 index 0000000000..c34ccaa493 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt @@ -0,0 +1,6 @@ +package net.nymtech.nymconnect + +object Constants { + const val VPN_CONNECTIVITY_CHECK_INTERVAL = 3000L; + const val VPN_STATISTIC_CHECK_INTERVAL = 10000L; +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt new file mode 100644 index 0000000000..f0d53e5162 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt @@ -0,0 +1,27 @@ +package net.nymtech.nymconnect + +import android.app.Application +import android.content.Context +import android.content.pm.PackageManager +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.tunnel.model.Settings +import dagger.hilt.android.HiltAndroidApp +import javax.inject.Inject + +@HiltAndroidApp +class WireGuardAutoTunnel : Application() { + + @Inject + lateinit var settingsRepo : Repository + + override fun onCreate() { + super.onCreate() + settingsRepo.init() + } + + companion object { + fun isRunningOnAndroidTv(context : Context) : Boolean { + return context.packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt new file mode 100644 index 0000000000..032232369b --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt @@ -0,0 +1,40 @@ +package net.nymtech.nymconnect.module + +import android.content.Context +import net.nymtech.nymconnect.service.tunnel.model.MyObjectBox +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import io.objectbox.Box +import io.objectbox.BoxStore +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class BoxModule { + + @Provides + @Singleton + fun provideBoxStore(@ApplicationContext context : Context) : BoxStore { + return MyObjectBox.builder() + .androidContext(context.applicationContext) + .build() + } + + @Provides + @Singleton + fun provideBoxForSettings(store : BoxStore) : Box { + return store.boxFor(Settings::class.java) + } + + @Provides + @Singleton + fun provideBoxForTunnels(store : BoxStore) : Box { + return store.boxFor(TunnelConfig::class.java) + } + +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt new file mode 100644 index 0000000000..e402249cba --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt @@ -0,0 +1,25 @@ +package net.nymtech.nymconnect.module + +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.repository.SettingsBox +import net.nymtech.nymconnect.repository.TunnelBox +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +abstract class RepositoryModule { + + @Binds + @Singleton + abstract fun provideSettingsRepository(settingsBox: SettingsBox) : Repository + + @Binds + @Singleton + abstract fun provideTunnelRepository(tunnelBox: TunnelBox) : Repository +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt new file mode 100644 index 0000000000..fa043ec549 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt @@ -0,0 +1,29 @@ +package net.nymtech.nymconnect.module + +import net.nymtech.nymconnect.service.network.MobileDataService +import net.nymtech.nymconnect.service.network.NetworkService +import net.nymtech.nymconnect.service.network.WifiService +import net.nymtech.nymconnect.service.notification.NotificationService +import net.nymtech.nymconnect.service.notification.WireGuardNotification +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ServiceComponent +import dagger.hilt.android.scopes.ServiceScoped + +@Module +@InstallIn(ServiceComponent::class) +abstract class ServiceModule { + + @Binds + @ServiceScoped + abstract fun provideNotificationService(wireGuardNotification: WireGuardNotification) : NotificationService + + @Binds + @ServiceScoped + abstract fun provideWifiService(wifiService: WifiService) : NetworkService + + @Binds + @ServiceScoped + abstract fun provideMobileDataService(mobileDataService : MobileDataService) : NetworkService +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt new file mode 100644 index 0000000000..b5962a39d9 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt @@ -0,0 +1,31 @@ +package net.nymtech.nymconnect.module + +import android.content.Context +import com.wireguard.android.backend.Backend +import com.wireguard.android.backend.GoBackend +import net.nymtech.nymconnect.service.tunnel.VpnService +import net.nymtech.nymconnect.service.tunnel.WireGuardTunnel +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class TunnelModule { + + @Provides + @Singleton + fun provideBackend(@ApplicationContext context : Context) : Backend { + return GoBackend(context) + } + + @Provides + @Singleton + fun provideVpnService(backend: Backend) : VpnService { + return WireGuardTunnel(backend) + } + +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/BootReceiver.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/BootReceiver.kt new file mode 100644 index 0000000000..8fcf823c4f --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/BootReceiver.kt @@ -0,0 +1,39 @@ +package net.nymtech.nymconnect.receiver + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.foreground.ServiceManager +import net.nymtech.nymconnect.service.tunnel.model.Settings +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@AndroidEntryPoint +class BootReceiver : BroadcastReceiver() { + + @Inject + lateinit var settingsRepo : Repository + + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == Intent.ACTION_BOOT_COMPLETED) { + CoroutineScope(Dispatchers.IO).launch { + try { + val settings = settingsRepo.getAll() + if (!settings.isNullOrEmpty()) { + val setting = settings.first() + if (setting.isAutoTunnelEnabled && setting.defaultTunnel != null) { + ServiceManager.startWatcherService(context, setting.defaultTunnel!!) + } + } + } finally { + cancel() + } + } + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/NotificationActionReceiver.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/NotificationActionReceiver.kt new file mode 100644 index 0000000000..97033a8f63 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/receiver/NotificationActionReceiver.kt @@ -0,0 +1,39 @@ +package net.nymtech.nymconnect.receiver + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.foreground.ServiceManager +import net.nymtech.nymconnect.service.tunnel.model.Settings +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import javax.inject.Inject + +@AndroidEntryPoint +class NotificationActionReceiver : BroadcastReceiver() { + + @Inject + lateinit var settingsRepo : Repository + override fun onReceive(context: Context, intent: Intent?) { + CoroutineScope(Dispatchers.IO).launch { + try { + val settings = settingsRepo.getAll() + if (!settings.isNullOrEmpty()) { + val setting = settings.first() + if (setting.defaultTunnel != null) { + ServiceManager.stopVpnService(context) + delay(1000) + ServiceManager.startVpnService(context, setting.defaultTunnel.toString()) + } + } + } finally { + cancel() + } + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt new file mode 100644 index 0000000000..187957132c --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt @@ -0,0 +1,16 @@ +package net.nymtech.nymconnect.repository + +import kotlinx.coroutines.flow.Flow + +interface Repository { + suspend fun save(t : T) + suspend fun saveAll(t : List) + suspend fun getById(id : Long) : T? + suspend fun getAll() : List? + suspend fun delete(t : T) : Boolean? + suspend fun count() : Long? + + val itemFlow : Flow> + + fun init() +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt new file mode 100644 index 0000000000..f56247463c --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt @@ -0,0 +1,63 @@ +package net.nymtech.nymconnect.repository + +import net.nymtech.nymconnect.service.tunnel.model.Settings +import io.objectbox.Box +import io.objectbox.BoxStore +import io.objectbox.kotlin.awaitCallInTx +import io.objectbox.kotlin.toFlow +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.launch +import javax.inject.Inject + + +class SettingsBox @Inject constructor(private val box : Box, private val boxStore : BoxStore) : Repository { + + @OptIn(ExperimentalCoroutinesApi::class) + override val itemFlow = box.query().build().subscribe().toFlow() + + override fun init() { + CoroutineScope(Dispatchers.IO).launch { + if(getAll().isNullOrEmpty()) { + save(Settings()) + } + } + } + + override suspend fun save(t : Settings) { + boxStore.awaitCallInTx { + box.put(t) + } + } + + override suspend fun saveAll(t : List) { + boxStore.awaitCallInTx { + box.put(t) + } + } + + override suspend fun getById(id: Long): Settings? { + return boxStore.awaitCallInTx { + box[id] + } + } + + override suspend fun getAll(): List? { + return boxStore.awaitCallInTx { + box.all + } + } + + override suspend fun delete(t : Settings): Boolean? { + return boxStore.awaitCallInTx { + box.remove(t) + } + } + + override suspend fun count() : Long? { + return boxStore.awaitCallInTx { + box.count() + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt new file mode 100644 index 0000000000..c57621d53c --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt @@ -0,0 +1,57 @@ +package net.nymtech.nymconnect.repository + +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import io.objectbox.Box +import io.objectbox.BoxStore +import io.objectbox.kotlin.awaitCallInTx +import io.objectbox.kotlin.toFlow +import kotlinx.coroutines.ExperimentalCoroutinesApi +import timber.log.Timber +import javax.inject.Inject + +class TunnelBox @Inject constructor(private val box : Box,private val boxStore : BoxStore) : Repository { + + @OptIn(ExperimentalCoroutinesApi::class) + override val itemFlow = box.query().build().subscribe().toFlow() + override fun init() { + + } + + override suspend fun save(t : TunnelConfig) { + Timber.d("Saving tunnel config") + boxStore.awaitCallInTx { + box.put(t) + } + + } + + override suspend fun saveAll(t : List) { + boxStore.awaitCallInTx { + box.put(t) + } + } + + override suspend fun getById(id: Long): TunnelConfig? { + return boxStore.awaitCallInTx { + box[id] + } + } + + override suspend fun getAll(): List? { + return boxStore.awaitCallInTx { + box.all + } + } + + override suspend fun delete(t : TunnelConfig): Boolean? { + return boxStore.awaitCallInTx { + box.remove(t) + } + } + + override suspend fun count() : Long? { + return boxStore.awaitCallInTx { + box.count() + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt new file mode 100644 index 0000000000..ba4f930b12 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt @@ -0,0 +1,6 @@ +package net.nymtech.nymconnect.service.foreground + +enum class Action { + START, + STOP +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt new file mode 100644 index 0000000000..9aaf0b93d8 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt @@ -0,0 +1,64 @@ +package net.nymtech.nymconnect.service.foreground + +import android.app.Service +import android.content.Intent +import android.os.Bundle +import android.os.IBinder +import timber.log.Timber + + +open class ForegroundService : Service() { + + private var isServiceStarted = false + + override fun onBind(intent: Intent): IBinder? { + // We don't provide binding, so return null + return null + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + Timber.d("onStartCommand executed with startId: $startId") + if (intent != null) { + val action = intent.action + Timber.d("using an intent with action $action") + when (action) { + Action.START.name -> startService(intent.extras) + Action.STOP.name -> stopService(intent.extras) + "android.net.VpnService" -> { + Timber.d("Always-on VPN starting service") + startService(intent.extras) + } + else -> Timber.d("This should never happen. No action in the received intent") + } + } else { + Timber.d( + "with a null intent. It has been probably restarted by the system." + ) + } + // by returning this we make sure the service is restarted if the system kills the service + return START_STICKY + } + + + override fun onDestroy() { + super.onDestroy() + Timber.d("The service has been destroyed") + } + + protected open fun startService(extras : Bundle?) { + if (isServiceStarted) return + Timber.d("Starting ${this.javaClass.simpleName}") + isServiceStarted = true + } + + protected open fun stopService(extras : Bundle?) { + Timber.d("Stopping ${this.javaClass.simpleName}") + try { + stopForeground(STOP_FOREGROUND_REMOVE) + stopSelf() + } catch (e: Exception) { + Timber.d("Service stopped without being started: ${e.message}") + } + isServiceStarted = false + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceManager.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceManager.kt new file mode 100644 index 0000000000..c00a796453 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceManager.kt @@ -0,0 +1,90 @@ +package net.nymtech.nymconnect.service.foreground + +import android.app.ActivityManager +import android.app.Application +import android.app.Service +import android.content.Context +import android.content.Context.ACTIVITY_SERVICE +import android.content.Intent +import net.nymtech.nymconnect.R +import timber.log.Timber + +object ServiceManager { + @Suppress("DEPRECATION") + private // Deprecated for third party Services. + fun Context.isServiceRunning(service: Class) = + (getSystemService(ACTIVITY_SERVICE) as ActivityManager) + .getRunningServices(Integer.MAX_VALUE) + .any { it.service.className == service.name } + + fun getServiceState(context: Context, cls : Class): ServiceState { + val isServiceRunning = context.isServiceRunning(cls) + return if(isServiceRunning) ServiceState.STARTED else ServiceState.STOPPED + } + + private fun actionOnService(action: Action, context: Context, cls : Class, extras : Map? = null) { + if (getServiceState(context, cls) == ServiceState.STOPPED && action == Action.STOP) return + if (getServiceState(context, cls) == ServiceState.STARTED && action == Action.START) return + val intent = Intent(context, cls).also { + it.action = action.name + extras?.forEach {(k, v) -> + it.putExtra(k, v) + } + } + intent.component?.javaClass + try { + when(action) { + Action.START -> { + try { + context.startForegroundService(intent) + } catch (e : Exception) { + Timber.e("Unable to start service foreground ${e.message}") + context.startService(intent) + } + } + Action.STOP -> context.startService(intent) + } + } catch (e : Exception) { + Timber.tag("ServiceManager").e(e) + } + } + + fun startVpnService(context : Context, tunnelConfig : String) { + actionOnService( + Action.START, + context, + WireGuardTunnelService::class.java, + mapOf(context.getString(R.string.tunnel_extras_key) to tunnelConfig)) + } + fun stopVpnService(context : Context) { + actionOnService( + Action.STOP, + context, + WireGuardTunnelService::class.java + ) + } + + fun startWatcherService(context : Context, tunnelConfig : String) { + actionOnService( + Action.START, context, + WireGuardConnectivityWatcherService::class.java, mapOf(context. + getString(R.string.tunnel_extras_key) to + tunnelConfig)) + } + + fun stopWatcherService(context : Context) { + actionOnService( + Action.STOP, context, + WireGuardConnectivityWatcherService::class.java) + } + + fun toggleWatcherService(context: Context, tunnelConfig : String) { + when(getServiceState( + context, + WireGuardConnectivityWatcherService::class.java, + )) { + ServiceState.STARTED -> stopWatcherService(context) + ServiceState.STOPPED -> startWatcherService(context, tunnelConfig) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt new file mode 100644 index 0000000000..9c26fa0795 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt @@ -0,0 +1,6 @@ +package net.nymtech.nymconnect.service.foreground + +enum class ServiceState { + STARTED, + STOPPED, +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt new file mode 100644 index 0000000000..fcfa811ea2 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt @@ -0,0 +1,210 @@ +package net.nymtech.nymconnect.service.foreground + +import android.app.AlarmManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.os.PowerManager +import android.os.SystemClock +import com.wireguard.android.backend.Tunnel +import net.nymtech.nymconnect.Constants +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.network.MobileDataService +import net.nymtech.nymconnect.service.network.NetworkService +import net.nymtech.nymconnect.service.network.NetworkStatus +import net.nymtech.nymconnect.service.network.WifiService +import net.nymtech.nymconnect.service.notification.NotificationService +import net.nymtech.nymconnect.service.tunnel.VpnService +import net.nymtech.nymconnect.service.tunnel.model.Settings +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@AndroidEntryPoint +class WireGuardConnectivityWatcherService : ForegroundService() { + + private val foregroundId = 122; + + @Inject + lateinit var wifiService : NetworkService + + @Inject + lateinit var mobileDataService : NetworkService + + @Inject + lateinit var settingsRepo: Repository + + @Inject + lateinit var notificationService : NotificationService + + @Inject + lateinit var vpnService : VpnService + + private var isWifiConnected = false; + private var isMobileDataConnected = false; + private var currentNetworkSSID = ""; + + private lateinit var watcherJob : Job; + private lateinit var setting : Settings + private lateinit var tunnelConfig: String + + private var wakeLock: PowerManager.WakeLock? = null + private val tag = this.javaClass.name; + + + override fun startService(extras: Bundle?) { + super.startService(extras) + val tunnelId = extras?.getString(getString(R.string.tunnel_extras_key)) + if (tunnelId != null) { + this.tunnelConfig = tunnelId + } + // we need this lock so our service gets not affected by Doze Mode + initWakeLock() + cancelWatcherJob() + launchWatcherNotification() + if(this::tunnelConfig.isInitialized) { + startWatcherJob() + } else { + stopService(extras) + } + } + + override fun stopService(extras: Bundle?) { + super.stopService(extras) + wakeLock?.let { + if (it.isHeld) { + it.release() + } + } + cancelWatcherJob() + stopSelf() + } + + private fun launchWatcherNotification() { + val notification = notificationService.createNotification( + channelId = getString(R.string.watcher_channel_id), + channelName = getString(R.string.watcher_channel_name), + description = getString(R.string.watcher_notification_text)) + super.startForeground(foregroundId, notification) + } + + //try to start task again if killed + override fun onTaskRemoved(rootIntent: Intent) { + Timber.d("Task Removed called") + val restartServiceIntent = Intent(rootIntent) + val restartServicePendingIntent: PendingIntent = PendingIntent.getService(this, 1, restartServiceIntent, + PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE); + applicationContext.getSystemService(Context.ALARM_SERVICE); + val alarmService: AlarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager; + alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent); + } + + private fun initWakeLock() { + wakeLock = + (getSystemService(Context.POWER_SERVICE) as PowerManager).run { + newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "$tag::lock").apply { + acquire() + } + } + } + + private fun cancelWatcherJob() { + if(this::watcherJob.isInitialized) { + watcherJob.cancel() + } + } + + private fun startWatcherJob() { + watcherJob = CoroutineScope(Dispatchers.IO).launch { + val settings = settingsRepo.getAll(); + if(!settings.isNullOrEmpty()) { + setting = settings[0] + } + launch { + watchForWifiConnectivityChanges() + } + if(setting.isTunnelOnMobileDataEnabled) { + launch { + watchForMobileDataConnectivityChanges() + } + } + launch { + manageVpn() + } + } + } + + private suspend fun watchForMobileDataConnectivityChanges() { + mobileDataService.networkStatus.collect { + when(it) { + is NetworkStatus.Available -> { + Timber.d("Gained Mobile data connection") + isMobileDataConnected = true + } + is NetworkStatus.CapabilitiesChanged -> { + isMobileDataConnected = true + Timber.d("Mobile data capabilities changed") + } + is NetworkStatus.Unavailable -> { + isMobileDataConnected = false + Timber.d("Lost mobile data connection") + } + + else -> {} + } + } + } + + private suspend fun watchForWifiConnectivityChanges() { + wifiService.networkStatus.collect { + when (it) { + is NetworkStatus.Available -> { + Timber.d("Gained Wi-Fi connection") + isWifiConnected = true + } + is NetworkStatus.CapabilitiesChanged -> { + Timber.d("Wifi capabilities changed") + isWifiConnected = true + currentNetworkSSID = wifiService.getNetworkName(it.networkCapabilities) ?: ""; + } + is NetworkStatus.Unavailable -> { + isWifiConnected = false + Timber.d("Lost Wi-Fi connection") + } + + else -> {} + } + } + } + + private suspend fun manageVpn() { + while(watcherJob.isActive) { + if(setting.isTunnelOnMobileDataEnabled && + !isWifiConnected && + isMobileDataConnected + && vpnService.getState() == Tunnel.State.DOWN) { + ServiceManager.startVpnService(this, tunnelConfig) + } else if(!setting.isTunnelOnMobileDataEnabled && + !isWifiConnected && + vpnService.getState() == Tunnel.State.UP) { + ServiceManager.stopVpnService(this) + } else if(isWifiConnected && + !setting.trustedNetworkSSIDs.contains(currentNetworkSSID) && + (vpnService.getState() != Tunnel.State.UP)) { + ServiceManager.startVpnService(this, tunnelConfig) + } else if((isWifiConnected && + setting.trustedNetworkSSIDs.contains(currentNetworkSSID)) && + (vpnService.getState() == Tunnel.State.UP)) { + ServiceManager.stopVpnService(this) + } + delay(Constants.VPN_CONNECTIVITY_CHECK_INTERVAL) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt new file mode 100644 index 0000000000..776928e649 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt @@ -0,0 +1,154 @@ +package net.nymtech.nymconnect.service.foreground + +import android.app.PendingIntent +import android.content.Intent +import android.os.Bundle +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.receiver.NotificationActionReceiver +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.notification.NotificationService +import net.nymtech.nymconnect.service.tunnel.HandshakeStatus +import net.nymtech.nymconnect.service.tunnel.VpnService +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@AndroidEntryPoint +class WireGuardTunnelService : ForegroundService() { + + private val foregroundId = 123; + + @Inject + lateinit var vpnService : VpnService + + @Inject + lateinit var settingsRepo: Repository + + @Inject + lateinit var notificationService : NotificationService + + private lateinit var job : Job + + private var tunnelName : String = "" + + override fun startService(extras : Bundle?) { + super.startService(extras) + val tunnelConfigString = extras?.getString(getString(R.string.tunnel_extras_key)) + cancelJob() + job = CoroutineScope(Dispatchers.IO).launch { + if(tunnelConfigString != null) { + try { + val tunnelConfig = TunnelConfig.from(tunnelConfigString) + tunnelName = tunnelConfig.name + vpnService.startTunnel(tunnelConfig) + launchVpnStartingNotification() + } catch (e : Exception) { + Timber.e("Problem starting tunnel: ${e.message}") + stopService(extras) + } + } else { + Timber.d("Tunnel config null, starting default tunnel") + val settings = settingsRepo.getAll(); + if(!settings.isNullOrEmpty()) { + val setting = settings[0] + if(setting.defaultTunnel != null && setting.isAlwaysOnVpnEnabled) { + val tunnelConfig = TunnelConfig.from(setting.defaultTunnel!!) + tunnelName = tunnelConfig.name + vpnService.startTunnel(tunnelConfig) + launchVpnStartingNotification() + } + } + } + } + CoroutineScope(job).launch { + var didShowConnected = false + var didShowFailedHandshakeNotification = false + vpnService.handshakeStatus.collect { + when(it) { + HandshakeStatus.NOT_STARTED -> { + } + HandshakeStatus.NEVER_CONNECTED -> { + if(!didShowFailedHandshakeNotification) { + launchVpnConnectionFailedNotification(getString(R.string.initial_connection_failure_message)) + didShowFailedHandshakeNotification = true + didShowConnected = false + } + } + HandshakeStatus.HEALTHY -> { + if(!didShowConnected) { + launchVpnConnectedNotification() + didShowConnected = true + } + } + HandshakeStatus.UNHEALTHY -> { + if(!didShowFailedHandshakeNotification) { + launchVpnConnectionFailedNotification(getString(R.string.lost_connection_failure_message)) + didShowFailedHandshakeNotification = true + didShowConnected = false + } + } + } + } + } + } + + override fun stopService(extras : Bundle?) { + super.stopService(extras) + CoroutineScope(Dispatchers.IO).launch() { + vpnService.stopTunnel() + } + cancelJob() + stopSelf() + } + + private fun launchVpnConnectedNotification() { + val notification = notificationService.createNotification( + channelId = getString(R.string.vpn_channel_id), + channelName = getString(R.string.vpn_channel_name), + title = getString(R.string.tunnel_start_title), + onGoing = false, + showTimestamp = true, + description = "${getString(R.string.tunnel_start_text)} $tunnelName" + ) + super.startForeground(foregroundId, notification) + } + + private fun launchVpnStartingNotification() { + val notification = notificationService.createNotification( + channelId = getString(R.string.vpn_channel_id), + channelName = getString(R.string.vpn_channel_name), + title = getString(R.string.vpn_starting), + onGoing = false, + showTimestamp = true, + description = getString(R.string.attempt_connection) + ) + super.startForeground(foregroundId, notification) + } + + private fun launchVpnConnectionFailedNotification(message : String) { + val notification = notificationService.createNotification( + channelId = getString(R.string.vpn_channel_id), + channelName = getString(R.string.vpn_channel_name), + action = PendingIntent.getBroadcast(this,0,Intent(this, NotificationActionReceiver::class.java),PendingIntent.FLAG_IMMUTABLE), + actionText = getString(R.string.restart), + title = getString(R.string.vpn_connection_failed), + onGoing = false, + showTimestamp = true, + description = message + ) + super.startForeground(foregroundId, notification) + } + + + private fun cancelJob() { + if(this::job.isInitialized) { + job.cancel() + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt new file mode 100644 index 0000000000..9574d659ef --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt @@ -0,0 +1,117 @@ +package net.nymtech.nymconnect.service.network + +import android.content.Context +import android.net.ConnectivityManager +import android.net.Network +import android.net.NetworkCapabilities +import android.net.NetworkRequest +import android.net.wifi.SupplicantState +import android.net.wifi.WifiInfo +import android.net.wifi.WifiManager +import android.os.Build +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.map + + +abstract class BaseNetworkService>(val context: Context, networkCapability : Int) : NetworkService { + private val connectivityManager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + + private val wifiManager = + context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager + + override val networkStatus = callbackFlow { + val networkStatusCallback = when (Build.VERSION.SDK_INT) { + in Build.VERSION_CODES.S..Int.MAX_VALUE -> { + object : ConnectivityManager.NetworkCallback( + FLAG_INCLUDE_LOCATION_INFO + ) { + override fun onAvailable(network: Network) { + trySend(NetworkStatus.Available(network)) + } + + override fun onLost(network: Network) { + trySend(NetworkStatus.Unavailable(network)) + } + + override fun onCapabilitiesChanged( + network: Network, + networkCapabilities: NetworkCapabilities + ) { + trySend(NetworkStatus.CapabilitiesChanged(network, networkCapabilities)) + } + } + } + + else -> { + object : ConnectivityManager.NetworkCallback() { + + override fun onAvailable(network: Network) { + trySend(NetworkStatus.Available(network)) + } + + override fun onLost(network: Network) { + trySend(NetworkStatus.Unavailable(network)) + } + + override fun onCapabilitiesChanged( + network: Network, + networkCapabilities: NetworkCapabilities + ) { + trySend(NetworkStatus.CapabilitiesChanged(network, networkCapabilities)) + } + } + } + } + val request = NetworkRequest.Builder() + .addTransportType(networkCapability) + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) + .build() + connectivityManager.registerNetworkCallback(request, networkStatusCallback) + + awaitClose { + connectivityManager.unregisterNetworkCallback(networkStatusCallback) + } + } + + + override fun getNetworkName(networkCapabilities: NetworkCapabilities): String? { + var ssid: String? = getWifiNameFromCapabilities(networkCapabilities) + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { + val info = wifiManager.connectionInfo + if (info.supplicantState === SupplicantState.COMPLETED) { + ssid = info.ssid + } + } + return ssid?.trim('"') + } + + + companion object { + private fun getWifiNameFromCapabilities(networkCapabilities: NetworkCapabilities): String? { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + val info: WifiInfo + if (networkCapabilities.transportInfo is WifiInfo) { + info = networkCapabilities.transportInfo as WifiInfo + return info.ssid + } + } + return null + } + } +} + +inline fun Flow.map( + crossinline onUnavailable: suspend (network : Network) -> Result, + crossinline onAvailable: suspend (network : Network) -> Result, + crossinline onCapabilitiesChanged: suspend (network : Network, networkCapabilities : NetworkCapabilities) -> Result, +): Flow = map { status -> + when (status) { + is NetworkStatus.Unavailable -> onUnavailable(status.network) + is NetworkStatus.Available -> onAvailable(status.network) + is NetworkStatus.CapabilitiesChanged -> onCapabilitiesChanged(status.network, status.networkCapabilities) + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt new file mode 100644 index 0000000000..a067af06cf --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt @@ -0,0 +1,10 @@ +package net.nymtech.nymconnect.service.network + +import android.content.Context +import android.net.NetworkCapabilities +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class MobileDataService @Inject constructor(@ApplicationContext context: Context) : + BaseNetworkService(context, NetworkCapabilities.TRANSPORT_CELLULAR) { +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt new file mode 100644 index 0000000000..6c274dab03 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt @@ -0,0 +1,10 @@ +package net.nymtech.nymconnect.service.network + +import android.net.NetworkCapabilities +import kotlinx.coroutines.flow.Flow + +interface NetworkService { + fun getNetworkName(networkCapabilities: NetworkCapabilities) : String? + val networkStatus : Flow + +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt new file mode 100644 index 0000000000..5446ce52a6 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt @@ -0,0 +1,10 @@ +package net.nymtech.nymconnect.service.network + +import android.net.Network +import android.net.NetworkCapabilities + +sealed class NetworkStatus { + class Available(val network : Network) : NetworkStatus() + class Unavailable(val network : Network) : NetworkStatus() + class CapabilitiesChanged(val network : Network, val networkCapabilities : NetworkCapabilities) : NetworkStatus() +} diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt new file mode 100644 index 0000000000..a01ebba746 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt @@ -0,0 +1,10 @@ +package net.nymtech.nymconnect.service.network + +import android.content.Context +import android.net.NetworkCapabilities +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class WifiService @Inject constructor(@ApplicationContext context: Context) : + BaseNetworkService(context, NetworkCapabilities.TRANSPORT_WIFI) { +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt new file mode 100644 index 0000000000..4071e64202 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt @@ -0,0 +1,21 @@ +package net.nymtech.nymconnect.service.notification + +import android.app.Notification +import android.app.NotificationManager +import android.app.PendingIntent + +interface NotificationService { + fun createNotification( + channelId: String, + channelName: String, + title: String = "", + action: PendingIntent? = null, + actionText: String? = null, + description: String, + showTimestamp : Boolean = false, + importance: Int = NotificationManager.IMPORTANCE_HIGH, + vibration: Boolean = true, + onGoing: Boolean = true, + lights: Boolean = true + ): Notification +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt new file mode 100644 index 0000000000..4e4cdb3e1b --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt @@ -0,0 +1,77 @@ +package net.nymtech.nymconnect.service.notification + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.graphics.Color +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.ui.MainActivity +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class WireGuardNotification @Inject constructor(@ApplicationContext private val context: Context) : NotificationService { + + private val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager; + + override fun createNotification( + channelId: String, + channelName: String, + title: String, + action: PendingIntent?, + actionText: String?, + description: String, + showTimestamp: Boolean, + importance: Int, + vibration: Boolean, + onGoing: Boolean, + lights: Boolean + ): Notification { + val channel = NotificationChannel( + channelId, + channelName, + importance + ).let { + it.description = title + it.enableLights(lights) + it.lightColor = Color.RED + it.enableVibration(vibration) + it.vibrationPattern = longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400) + it + } + notificationManager.createNotificationChannel(channel) + val pendingIntent: PendingIntent = + Intent(context, MainActivity::class.java).let { notificationIntent -> + PendingIntent.getActivity( + context, + 0, + notificationIntent, + PendingIntent.FLAG_IMMUTABLE + ) + } + + val builder: Notification.Builder = + Notification.Builder( + context, + channelId + ) + return builder.let { + if(action != null && actionText != null) { + //TODO find a not deprecated way to do this + it.addAction( + Notification.Action.Builder(0, actionText, action) + .build()) + it.setAutoCancel(true) + } + it.setContentTitle(title) + .setContentText(description) + .setContentIntent(pendingIntent) + .setOngoing(onGoing) + .setShowWhen(showTimestamp) + .setSmallIcon(R.mipmap.ic_launcher_foreground) + .build() + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsActivity.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsActivity.kt new file mode 100644 index 0000000000..c88825e71e --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsActivity.kt @@ -0,0 +1,28 @@ +package net.nymtech.nymconnect.service.shortcut + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.service.foreground.Action +import net.nymtech.nymconnect.service.foreground.ServiceManager +import net.nymtech.nymconnect.service.foreground.WireGuardTunnelService +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class ShortcutsActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if(intent.getStringExtra(ShortcutsManager.CLASS_NAME_EXTRA_KEY) + .equals(WireGuardTunnelService::class.java.name)) { + intent.getStringExtra(getString(R.string.tunnel_extras_key))?.let { + ServiceManager.toggleWatcherService(this, it) + } + when(intent.action){ + Action.STOP.name -> ServiceManager.stopVpnService(this) + Action.START.name -> intent.getStringExtra(getString(R.string.tunnel_extras_key)) + ?.let { ServiceManager.startVpnService(this, it) } + } + } + finish() + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsManager.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsManager.kt new file mode 100644 index 0000000000..13df427ebd --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/shortcut/ShortcutsManager.kt @@ -0,0 +1,73 @@ +package net.nymtech.nymconnect.service.shortcut + +import android.content.Context +import android.content.Intent +import androidx.core.content.pm.ShortcutInfoCompat +import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.graphics.drawable.IconCompat +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.service.foreground.Action +import net.nymtech.nymconnect.service.foreground.WireGuardTunnelService +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig + +object ShortcutsManager { + + private const val SHORT_LABEL_MAX_SIZE = 10; + private const val LONG_LABEL_MAX_SIZE = 25; + private const val APPEND_ON = " On"; + private const val APPEND_OFF = " Off" + const val CLASS_NAME_EXTRA_KEY = "className" + + private fun createAndPushShortcut(context : Context, intent : Intent, id : String, shortLabel : String, + longLabel : String, drawable : Int ) { + val shortcut = ShortcutInfoCompat.Builder(context, id) + .setShortLabel(shortLabel) + .setLongLabel(longLabel) + .setIcon(IconCompat.createWithResource(context, drawable)) + .setIntent(intent) + .build() + ShortcutManagerCompat.pushDynamicShortcut(context, shortcut) + } + + fun createTunnelShortcuts(context : Context, tunnelConfig : TunnelConfig) { + createAndPushShortcut(context, + createTunnelOnIntent(context, mapOf(context.getString(R.string.tunnel_extras_key) to tunnelConfig.toString())), + tunnelConfig.id.toString() + APPEND_ON, + tunnelConfig.name.take((SHORT_LABEL_MAX_SIZE - APPEND_ON.length)) + APPEND_ON, + tunnelConfig.name.take((LONG_LABEL_MAX_SIZE - APPEND_ON.length)) + APPEND_ON, + R.drawable.vpn_on + ) + createAndPushShortcut(context, + createTunnelOffIntent(context, mapOf(context.getString(R.string.tunnel_extras_key) to tunnelConfig.toString())), + tunnelConfig.id.toString() + APPEND_OFF, + tunnelConfig.name.take((SHORT_LABEL_MAX_SIZE - APPEND_OFF.length)) + APPEND_OFF, + tunnelConfig.name.take((LONG_LABEL_MAX_SIZE - APPEND_OFF.length)) + APPEND_OFF, + R.drawable.vpn_off + ) + } + + fun removeTunnelShortcuts(context : Context, tunnelConfig : TunnelConfig) { + ShortcutManagerCompat.removeDynamicShortcuts(context, listOf(tunnelConfig.id.toString() + APPEND_ON, + tunnelConfig.id.toString() + APPEND_OFF )) + } + + private fun createTunnelOnIntent(context: Context, extras : Map) : Intent { + return Intent(context, ShortcutsActivity::class.java).also { + it.action = Action.START.name + it.putExtra(CLASS_NAME_EXTRA_KEY, WireGuardTunnelService::class.java.name) + extras.forEach {(k, v) -> + it.putExtra(k, v) + } + } + } + + private fun createTunnelOffIntent(context : Context, extras : Map) : Intent { + return Intent(context, ShortcutsActivity::class.java).also { + it.action = Action.STOP.name + it.putExtra(CLASS_NAME_EXTRA_KEY, WireGuardTunnelService::class.java.name) + extras.forEach {(k, v) -> + it.putExtra(k, v) + } + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile/TunnelControlTile.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile/TunnelControlTile.kt new file mode 100644 index 0000000000..38c774c963 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile/TunnelControlTile.kt @@ -0,0 +1,142 @@ +package net.nymtech.nymconnect.service.tile + +import android.os.Build +import android.service.quicksettings.Tile +import android.service.quicksettings.TileService +import com.wireguard.android.backend.Tunnel +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.foreground.ServiceManager +import net.nymtech.nymconnect.service.tunnel.VpnService +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@AndroidEntryPoint +class TunnelControlTile : TileService() { + + @Inject + lateinit var settingsRepo : Repository + + @Inject + lateinit var configRepo : Repository + + @Inject + lateinit var vpnService : VpnService + + private val scope = CoroutineScope(Dispatchers.Main); + + private lateinit var job : Job + + override fun onStartListening() { + job = scope.launch { + updateTileState() + } + super.onStartListening() + } + + override fun onTileAdded() { + super.onTileAdded() + qsTile.contentDescription = this.resources.getString(R.string.toggle_vpn) + scope.launch { + updateTileState(); + } + } + + override fun onTileRemoved() { + super.onTileRemoved() + cancelJob() + } + + override fun onClick() { + super.onClick() + unlockAndRun { + scope.launch { + try { + val tunnel = determineTileTunnel(); + if(tunnel != null) { + attemptWatcherServiceToggle(tunnel.toString()) + if(vpnService.getState() == Tunnel.State.UP) { + ServiceManager.stopVpnService(this@TunnelControlTile) + } else { + ServiceManager.startVpnService(this@TunnelControlTile, tunnel.toString()) + } + } + } catch (e : Exception) { + Timber.e(e.message) + } finally { + cancel() + } + } + } + } + + private suspend fun determineTileTunnel() : TunnelConfig? { + var tunnelConfig : TunnelConfig? = null; + val settings = settingsRepo.getAll() + if (!settings.isNullOrEmpty()) { + val setting = settings.first() + tunnelConfig = if (setting.defaultTunnel != null) { + TunnelConfig.from(setting.defaultTunnel!!); + } else { + val config = configRepo.getAll()?.first(); + config; + } + } + return tunnelConfig; + } + + + private fun attemptWatcherServiceToggle(tunnelConfig : String) { + scope.launch { + val settings = settingsRepo.getAll() + if (!settings.isNullOrEmpty()) { + val setting = settings.first() + if(setting.isAutoTunnelEnabled) { + ServiceManager.toggleWatcherService(this@TunnelControlTile, tunnelConfig) + } + } + } + } + + private suspend fun updateTileState() { + vpnService.state.collect { + when(it) { + Tunnel.State.UP -> { + qsTile.state = Tile.STATE_ACTIVE + } + Tunnel.State.DOWN -> { + qsTile.state = Tile.STATE_INACTIVE; + } + else -> { + qsTile.state = Tile.STATE_UNAVAILABLE + } + } + val config = determineTileTunnel(); + setTileDescription(config?.name ?: this.resources.getString(R.string.no_tunnel_available)) + qsTile.updateTile() + } + } + + private fun setTileDescription(description : String) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + qsTile.subtitle = description + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + qsTile.stateDescription = description; + } + } + + private fun cancelJob() { + if(this::job.isInitialized) { + job.cancel(); + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/HandshakeStatus.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/HandshakeStatus.kt new file mode 100644 index 0000000000..1d2fa54ea7 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/HandshakeStatus.kt @@ -0,0 +1,14 @@ +package net.nymtech.nymconnect.service.tunnel + +enum class HandshakeStatus { + HEALTHY, + UNHEALTHY, + NEVER_CONNECTED, + NOT_STARTED; + + companion object { + private const val WG_TYPICAL_HANDSHAKE_INTERVAL_WHEN_HEALTHY_SEC = 120 + const val UNHEALTHY_TIME_LIMIT_SEC = WG_TYPICAL_HANDSHAKE_INTERVAL_WHEN_HEALTHY_SEC + 60 + const val NEVER_CONNECTED_TO_UNHEALTHY_TIME_LIMIT_SEC = 30 + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt new file mode 100644 index 0000000000..15c8c1b676 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt @@ -0,0 +1,18 @@ +package net.nymtech.nymconnect.service.tunnel + +import com.wireguard.android.backend.Statistics +import com.wireguard.android.backend.Tunnel +import com.wireguard.crypto.Key +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import kotlinx.coroutines.flow.SharedFlow + +interface VpnService : Tunnel { + suspend fun startTunnel(tunnelConfig : TunnelConfig) : Tunnel.State + suspend fun stopTunnel() + val state : SharedFlow + val tunnelName : SharedFlow + val statistics : SharedFlow + val lastHandshake : SharedFlow> + val handshakeStatus : SharedFlow + fun getState() : Tunnel.State +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt new file mode 100644 index 0000000000..ae9a3c233d --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt @@ -0,0 +1,131 @@ +package net.nymtech.nymconnect.service.tunnel + +import com.wireguard.android.backend.Backend +import com.wireguard.android.backend.BackendException +import com.wireguard.android.backend.Statistics +import com.wireguard.android.backend.Tunnel +import com.wireguard.crypto.Key +import net.nymtech.nymconnect.Constants +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import net.nymtech.nymconnect.util.NumberUtils +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + + +class WireGuardTunnel @Inject constructor(private val backend : Backend, +) : VpnService { + + private val _tunnelName = MutableStateFlow("") + override val tunnelName get() = _tunnelName.asStateFlow() + + private val _state = MutableSharedFlow( + onBufferOverflow = BufferOverflow.DROP_OLDEST, + replay = 1) + + private val _handshakeStatus = MutableSharedFlow(replay = 1, + onBufferOverflow = BufferOverflow.DROP_OLDEST) + override val state get() = _state.asSharedFlow() + + private val _statistics = MutableSharedFlow(replay = 1) + override val statistics get() = _statistics.asSharedFlow() + + private val _lastHandshake = MutableSharedFlow>(replay = 1) + override val lastHandshake get() = _lastHandshake.asSharedFlow() + + override val handshakeStatus: SharedFlow + get() = _handshakeStatus.asSharedFlow() + + private lateinit var statsJob : Job + + + override suspend fun startTunnel(tunnelConfig: TunnelConfig) : Tunnel.State{ + return try { + if(getState() == Tunnel.State.UP && _tunnelName.value != tunnelConfig.name) { + stopTunnel() + } + _tunnelName.emit(tunnelConfig.name) + val config = TunnelConfig.configFromQuick(tunnelConfig.wgQuick) + val state = backend.setState( + this, Tunnel.State.UP, config) + _state.emit(state) + state; + } catch (e : Exception) { + Timber.e("Failed to start tunnel with error: ${e.message}") + Tunnel.State.DOWN + } + } + + override fun getName(): String { + return _tunnelName.value + } + + override suspend fun stopTunnel() { + try { + if(getState() == Tunnel.State.UP) { + val state = backend.setState(this, Tunnel.State.DOWN, null) + _state.emit(state) + } + } catch (e : BackendException) { + Timber.e("Failed to stop tunnel with error: ${e.message}") + } + } + + override fun getState(): Tunnel.State { + return backend.getState(this) + } + + override fun onStateChange(state : Tunnel.State) { + val tunnel = this; + _state.tryEmit(state) + if(state == Tunnel.State.UP) { + statsJob = CoroutineScope(Dispatchers.IO).launch { + val handshakeMap = HashMap() + var neverHadHandshakeCounter = 0 + while (true) { + val statistics = backend.getStatistics(tunnel) + _statistics.emit(statistics) + statistics.peers().forEach { + val handshakeEpoch = statistics.peer(it)?.latestHandshakeEpochMillis ?: 0L + handshakeMap[it] = handshakeEpoch + if(handshakeEpoch == 0L) { + if(neverHadHandshakeCounter >= HandshakeStatus.NEVER_CONNECTED_TO_UNHEALTHY_TIME_LIMIT_SEC) { + _handshakeStatus.emit(HandshakeStatus.NEVER_CONNECTED) + } else { + _handshakeStatus.emit(HandshakeStatus.NOT_STARTED) + } + if(neverHadHandshakeCounter <= HandshakeStatus.NEVER_CONNECTED_TO_UNHEALTHY_TIME_LIMIT_SEC) { + neverHadHandshakeCounter += 10 + } + return@forEach + } + if(NumberUtils.getSecondsBetweenTimestampAndNow(handshakeEpoch) >= HandshakeStatus.UNHEALTHY_TIME_LIMIT_SEC) { + _handshakeStatus.emit(HandshakeStatus.UNHEALTHY) + } else { + _handshakeStatus.emit(HandshakeStatus.HEALTHY) + } + } + _lastHandshake.emit(handshakeMap) + delay(Constants.VPN_STATISTIC_CHECK_INTERVAL) + } + } + } + if(state == Tunnel.State.DOWN) { + if(this::statsJob.isInitialized) { + statsJob.cancel() + } + _handshakeStatus.tryEmit(HandshakeStatus.NOT_STARTED) + _lastHandshake.tryEmit(emptyMap()) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt new file mode 100644 index 0000000000..2aff4e9f11 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt @@ -0,0 +1,15 @@ +package net.nymtech.nymconnect.service.tunnel.model + +import io.objectbox.annotation.Entity +import io.objectbox.annotation.Id + +@Entity +data class Settings( + @Id + var id : Long = 0, + var isAutoTunnelEnabled : Boolean = false, + var isTunnelOnMobileDataEnabled : Boolean = false, + var trustedNetworkSSIDs : MutableList = mutableListOf(), + var defaultTunnel : String? = null, + var isAlwaysOnVpnEnabled : Boolean = false, +) diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt new file mode 100644 index 0000000000..91f7440d0d --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt @@ -0,0 +1,89 @@ +package net.nymtech.nymconnect.service.tunnel.model + +import com.wireguard.config.Config +import io.objectbox.annotation.ConflictStrategy +import io.objectbox.annotation.Entity +import io.objectbox.annotation.Id +import io.objectbox.annotation.Unique +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import java.io.InputStream + + +@Entity +@Serializable +data class TunnelConfig( + @Id + var id : Long = 0, + @Unique(onConflict = ConflictStrategy.REPLACE) + var name : String, + var wgQuick : String +) { + + + override fun toString(): String { + return Json.encodeToString(serializer(), this) + } + + companion object { + private const val INCLUDED_APPLICATIONS = "IncludedApplications = " + private const val EXCLUDED_APPLICATIONS = "ExcludedApplications = " + private const val INTERFACE = "[Interface]" + private const val NEWLINE_CHAR = "\n" + private const val APP_CONFIG_SEPARATOR = ", " + + private fun addApplicationsToConfig(appConfig : String, wgQuick : String) : String { + val configList = wgQuick.split(NEWLINE_CHAR).toMutableList() + val interfaceIndex = configList.indexOf(INTERFACE) + configList.add(interfaceIndex + 1, appConfig) + return configList.joinToString(NEWLINE_CHAR) + } + + fun clearAllApplicationsFromConfig(wgQuick : String) : String { + val configList = wgQuick.split(NEWLINE_CHAR).toMutableList() + val itr = configList.iterator() + while (itr.hasNext()) { + val next = itr.next() + if(next.contains(INCLUDED_APPLICATIONS) || next.contains(EXCLUDED_APPLICATIONS)) { + itr.remove() + } + } + return configList.joinToString(NEWLINE_CHAR) + } + + + fun setExcludedApplicationsOnQuick(packages : List, wgQuick: String) : String { + if(packages.isEmpty()) { + return wgQuick + } + val clearedWgQuick = clearAllApplicationsFromConfig(wgQuick) + val excludeConfig = buildExcludedApplicationsString(packages) + return addApplicationsToConfig(excludeConfig, clearedWgQuick) + } + + fun setIncludedApplicationsOnQuick(packages : List, wgQuick: String) : String { + if(packages.isEmpty()) { + return wgQuick + } + val clearedWgQuick = clearAllApplicationsFromConfig(wgQuick) + val includeConfig = buildIncludedApplicationsString(packages) + return addApplicationsToConfig(includeConfig, clearedWgQuick) + } + + private fun buildExcludedApplicationsString(packages : List) : String { + return EXCLUDED_APPLICATIONS + packages.joinToString(APP_CONFIG_SEPARATOR) + } + + private fun buildIncludedApplicationsString(packages : List) : String { + return INCLUDED_APPLICATIONS + packages.joinToString(APP_CONFIG_SEPARATOR) + } + fun from(string : String) : TunnelConfig { + return Json.decodeFromString(string) + } + fun configFromQuick(wgQuick: String): Config { + val inputStream: InputStream = wgQuick.byteInputStream() + val reader = inputStream.bufferedReader(Charsets.UTF_8) + return Config.parse(reader) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt new file mode 100644 index 0000000000..edb82cc213 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt @@ -0,0 +1,201 @@ +package net.nymtech.nymconnect.ui + +import android.Manifest +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.Settings +import android.view.KeyEvent +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.compose.setContent +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.slideInHorizontally +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.input.key.onKeyEvent +import com.google.accompanist.navigation.animation.AnimatedNavHost +import com.google.accompanist.navigation.animation.composable +import com.google.accompanist.navigation.animation.rememberAnimatedNavController +import com.google.accompanist.permissions.ExperimentalPermissionsApi +import com.google.accompanist.permissions.isGranted +import com.google.accompanist.permissions.rememberPermissionState +import com.wireguard.android.backend.GoBackend +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.ui.common.PermissionRequestFailedScreen +import net.nymtech.nymconnect.ui.common.navigation.BottomNavBar +import net.nymtech.nymconnect.ui.screens.config.ConfigScreen +import net.nymtech.nymconnect.ui.screens.detail.DetailScreen +import net.nymtech.nymconnect.ui.screens.main.MainScreen +import net.nymtech.nymconnect.ui.screens.settings.SettingsScreen +import net.nymtech.nymconnect.ui.screens.support.SupportScreen +import net.nymtech.nymconnect.ui.theme.TransparentSystemBars +import net.nymtech.nymconnect.ui.theme.WireguardAutoTunnelTheme +import dagger.hilt.android.AndroidEntryPoint +import timber.log.Timber +import java.lang.IllegalStateException + +@AndroidEntryPoint +class MainActivity : AppCompatActivity() { + + @OptIn(ExperimentalAnimationApi::class, + ExperimentalPermissionsApi::class + ) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + val navController = rememberAnimatedNavController() + val focusRequester = remember { FocusRequester() } + + WireguardAutoTunnelTheme { + TransparentSystemBars() + + val snackbarHostState = remember { SnackbarHostState() } + + val notificationPermissionState = + rememberPermissionState(Manifest.permission.POST_NOTIFICATIONS) + + fun requestNotificationPermission() { + if (!notificationPermissionState.status.isGranted && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + notificationPermissionState.launchPermissionRequest() + } + } + + var vpnIntent by remember { mutableStateOf(GoBackend.VpnService.prepare(this)) } + val vpnActivityResultState = rememberLauncherForActivityResult( + ActivityResultContracts.StartActivityForResult(), + onResult = { + val accepted = (it.resultCode == RESULT_OK) + if (accepted) { + vpnIntent = null + } + }) + LaunchedEffect(vpnIntent) { + if (vpnIntent != null) { + vpnActivityResultState.launch(vpnIntent) + } else requestNotificationPermission() + } + + Scaffold(snackbarHost = { SnackbarHost(snackbarHostState)}, + modifier = Modifier.onKeyEvent { + if (it.nativeKeyEvent.action == KeyEvent.ACTION_UP) { + when (it.nativeKeyEvent.keyCode) { + KeyEvent.KEYCODE_DPAD_UP -> { + try { + focusRequester.requestFocus() + } catch(e : IllegalStateException) { + Timber.e("No D-Pad focus request modifier added to element on screen") + } + false + } else -> { + false; + } + } + } else { + false + } + }, + bottomBar = if (vpnIntent == null && notificationPermissionState.status.isGranted) { + { BottomNavBar(navController, Routes.navItems) } + } else { + {} + }, + ) + { padding -> + if (vpnIntent != null) { + PermissionRequestFailedScreen( + padding = padding, + onRequestAgain = { vpnActivityResultState.launch(vpnIntent) }, + message = getString(R.string.vpn_permission_required), + getString(R.string.retry) + ) + return@Scaffold + } + if (!notificationPermissionState.status.isGranted) { + PermissionRequestFailedScreen( + padding = padding, + onRequestAgain = { + val intentSettings = + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intentSettings.data = + Uri.fromParts("package", this.packageName, null) + startActivity(intentSettings); + }, + message = getString(R.string.notification_permission_required), + getString(R.string.open_settings) + ) + return@Scaffold + } + AnimatedNavHost(navController, startDestination = Routes.Main.name) { + composable(Routes.Main.name, enterTransition = { + when (initialState.destination.route) { + Routes.Settings.name, Routes.Support.name -> + slideInHorizontally( + initialOffsetX = { -1000 }, + animationSpec = tween(500) + ) + + else -> { + fadeIn(animationSpec = tween(1000)) + } + } + }) { + MainScreen(padding = padding, snackbarHostState = snackbarHostState, navController = navController) + } + composable(Routes.Settings.name, enterTransition = { + when (initialState.destination.route) { + Routes.Main.name -> + slideInHorizontally( + initialOffsetX = { 1000 }, + animationSpec = tween(500) + ) + + Routes.Support.name -> { + slideInHorizontally( + initialOffsetX = { -1000 }, + animationSpec = tween(500) + ) + } + + else -> { + fadeIn(animationSpec = tween(1000)) + } + } + }) { SettingsScreen(padding = padding, snackbarHostState = snackbarHostState, navController = navController, focusRequester = focusRequester) } + composable(Routes.Support.name, enterTransition = { + when (initialState.destination.route) { + Routes.Settings.name, Routes.Main.name -> + slideInHorizontally( + initialOffsetX = { 1000 }, + animationSpec = tween(500) + ) + + else -> { + fadeIn(animationSpec = tween(1000)) + } + } + }) { SupportScreen(padding = padding, focusRequester) } + composable("${Routes.Config.name}/{id}", enterTransition = { + fadeIn(animationSpec = tween(1000)) + }) { ConfigScreen(padding = padding, navController = navController, id = it.arguments?.getString("id"), focusRequester = focusRequester)} + composable("${Routes.Detail.name}/{id}", enterTransition = { + fadeIn(animationSpec = tween(1000)) + }) { DetailScreen(padding = padding, id = it.arguments?.getString("id")) } + } + } + } + } + } +} diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt new file mode 100644 index 0000000000..589fa5fbbf --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt @@ -0,0 +1,36 @@ +package net.nymtech.nymconnect.ui + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Home +import androidx.compose.material.icons.rounded.QuestionMark +import androidx.compose.material.icons.rounded.Settings +import net.nymtech.nymconnect.ui.common.navigation.BottomNavItem + +enum class Routes { + Main, + Settings, + Support, + Config, + Detail; + + + companion object { + val navItems = listOf( + BottomNavItem( + name = "Tunnels", + route = Main.name, + icon = Icons.Rounded.Home, + ), + BottomNavItem( + name = "Settings", + route = Settings.name, + icon = Icons.Rounded.Settings, + ), + BottomNavItem( + name = "Support", + route = Support.name, + icon = Icons.Rounded.QuestionMark, + ) + ) + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt new file mode 100644 index 0000000000..66aa0b8790 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt @@ -0,0 +1,9 @@ +package net.nymtech.nymconnect.ui + +data class ViewState( + val showSnackbarMessage : Boolean = false, + val snackbarMessage : String = "", + val snackbarActionText : String = "", + val onSnackbarActionClick : () -> Unit = {}, + val isLoading : Boolean = false +) diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt new file mode 100644 index 0000000000..2ddd1f27b2 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt @@ -0,0 +1,31 @@ +package net.nymtech.nymconnect.ui.common + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector + +@Composable +fun ClickableIconButton(onIconClick : () -> Unit, text : String, icon : ImageVector, enabled : Boolean) { + Button(onClick = {}, + enabled = enabled + ) { + Text(text) + Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) + Icon( + imageVector = icon, + contentDescription = "Delete", + modifier = Modifier.size(ButtonDefaults.IconSize).clickable { + if(enabled) { + onIconClick() + } + } + ) + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt new file mode 100644 index 0000000000..a0f81b5745 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt @@ -0,0 +1,35 @@ +package net.nymtech.nymconnect.ui.common + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.launch + +@Composable +fun PermissionRequestFailedScreen(padding : PaddingValues, onRequestAgain : () -> Unit, message : String, buttonText : String ) { + val scope = rememberCoroutineScope() + Column(horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding)) { + Text(message, textAlign = TextAlign.Center, modifier = Modifier.padding(15.dp)) + Button(onClick = { + scope.launch { + onRequestAgain() + } + }) { + Text(buttonText) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt new file mode 100644 index 0000000000..33fb6d0bf6 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt @@ -0,0 +1,55 @@ +package net.nymtech.nymconnect.ui.common + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.unit.dp + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun RowListItem(leadingIcon : ImageVector? = null, leadingIconColor : Color = Color.Gray, text : String, onHold : () -> Unit, onClick: () -> Unit, rowButton : @Composable() () -> Unit ) { + Box( + modifier = Modifier + .combinedClickable( + onClick = { + onClick() + }, + onLongClick = { + onHold() + } + ) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Row(verticalAlignment = Alignment.CenterVertically,) { + if(leadingIcon != null) { + Icon( + leadingIcon, "status", + tint = leadingIconColor, + modifier = Modifier.padding(end = 10.dp).size(15.dp) + ) + } + Text(text) + } + + rowButton() + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/SearchBar.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/SearchBar.kt new file mode 100644 index 0000000000..cec26f5b09 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/SearchBar.kt @@ -0,0 +1,80 @@ +package net.nymtech.nymconnect.ui.common + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Clear +import androidx.compose.material.icons.rounded.Search +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.KeyboardType +import net.nymtech.nymconnect.R + +@Composable +fun SearchBar( + onQuery : (queryString : String) -> Unit +) { + // Immediately update and keep track of query from text field changes. + var query: String by rememberSaveable { mutableStateOf("") } + var showClearIcon by rememberSaveable { mutableStateOf(false) } + + if (query.isEmpty()) { + showClearIcon = false + } else if (query.isNotEmpty()) { + showClearIcon = true + } + + TextField( + value = query, + onValueChange = { onQueryChanged -> + // If user makes changes to text, immediately updated it. + query = onQueryChanged + onQuery(onQueryChanged) + }, + leadingIcon = { + Icon( + imageVector = Icons.Rounded.Search, + tint = MaterialTheme.colorScheme.onBackground, + contentDescription = stringResource(id = R.string.search_icon) + ) + }, + trailingIcon = { + if (showClearIcon) { + IconButton(onClick = { query = "" }) { + Icon( + imageVector = Icons.Rounded.Clear, + tint = MaterialTheme.colorScheme.onBackground, + contentDescription = stringResource(id = R.string.clear_icon) + ) + } + } + }, + maxLines = 1, + colors = TextFieldDefaults.colors( + focusedContainerColor = Color.Transparent, + unfocusedContainerColor = Color.Transparent, + disabledContainerColor = Color.Transparent, + ), + placeholder = { Text(text = stringResource(R.string.hint_search_packages)) }, + textStyle = MaterialTheme.typography.bodySmall, + singleLine = true, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text), + modifier = Modifier + .fillMaxWidth() + .background(color = MaterialTheme.colorScheme.background, shape = RectangleShape) + ) +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt new file mode 100644 index 0000000000..957228eece --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt @@ -0,0 +1,42 @@ +package net.nymtech.nymconnect.ui.common.navigation + +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.text.font.FontWeight +import androidx.navigation.NavController +import androidx.navigation.compose.currentBackStackEntryAsState + +@Composable +fun BottomNavBar(navController : NavController, bottomNavItems : List) { + + val backStackEntry = navController.currentBackStackEntryAsState() + + NavigationBar( + containerColor = MaterialTheme.colorScheme.background, + ) { + bottomNavItems.forEach { item -> + val selected = item.route == backStackEntry.value?.destination?.route + + NavigationBarItem( + selected = selected, + onClick = { navController.navigate(item.route) }, + label = { + Text( + text = item.name, + fontWeight = FontWeight.SemiBold, + ) + }, + icon = { + Icon( + imageVector = item.icon, + contentDescription = "${item.name} Icon", + ) + } + ) + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt new file mode 100644 index 0000000000..a4a585ce5e --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt @@ -0,0 +1,9 @@ +package net.nymtech.nymconnect.ui.common.navigation + +import androidx.compose.ui.graphics.vector.ImageVector + +data class BottomNavItem( + val name: String, + val route: String, + val icon: ImageVector, +) diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigScreen.kt new file mode 100644 index 0000000000..1ecfaf6570 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigScreen.kt @@ -0,0 +1,241 @@ +package net.nymtech.nymconnect.ui.screens.config + +import android.widget.Toast +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Android +import androidx.compose.material3.Button +import androidx.compose.material3.Checkbox +import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.navigation.NavController +import com.google.accompanist.drawablepainter.DrawablePainter +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.ui.Routes +import net.nymtech.nymconnect.ui.common.SearchBar +import kotlinx.coroutines.launch + +@OptIn(ExperimentalComposeUiApi::class) +@Composable +fun ConfigScreen( + viewModel: ConfigViewModel = hiltViewModel(), + padding: PaddingValues, + focusRequester: FocusRequester, + navController: NavController, + id : String? +) { + + val context = LocalContext.current + val focusManager = LocalFocusManager.current + + val keyboardController = LocalSoftwareKeyboardController.current + val scope = rememberCoroutineScope() + val tunnel by viewModel.tunnel.collectAsStateWithLifecycle(null) + val tunnelName = viewModel.tunnelName.collectAsStateWithLifecycle() + val packages by viewModel.packages.collectAsStateWithLifecycle() + val checkedPackages by viewModel.checkedPackages.collectAsStateWithLifecycle() + val include by viewModel.include.collectAsStateWithLifecycle() + val allApplications by viewModel.allApplications.collectAsStateWithLifecycle() + + LaunchedEffect(Unit) { + viewModel.getTunnelById(id) + viewModel.emitQueriedPackages("") + viewModel.emitCurrentPackageConfigurations(id) + } + + if(tunnel != null) { + LazyColumn( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + item { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = 7.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + OutlinedTextField( + modifier = Modifier.focusRequester(focusRequester), + value = tunnelName.value, + onValueChange = { + viewModel.onTunnelNameChange(it) + }, + label = { Text(stringResource(id = R.string.tunnel_name)) }, + maxLines = 1, + keyboardOptions = KeyboardOptions( + capitalization = KeyboardCapitalization.None, + imeAction = ImeAction.Done + ), + keyboardActions = KeyboardActions( + onDone = { + focusManager.clearFocus() + keyboardController?.hide() + viewModel.onTunnelNameChange(tunnelName.value) + } + ), + ) + } + } + item { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = 7.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(id = R.string.tunnel_all)) + Switch( + checked = allApplications, + onCheckedChange = { + viewModel.onAllApplicationsChange(!allApplications) + } + ) + } + } + if (!allApplications) { + item { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = 7.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(id = R.string.include)) + Checkbox( + checked = include, + onCheckedChange = { + viewModel.onIncludeChange(!include) + } + ) + } + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(id = R.string.exclude)) + Checkbox( + checked = !include, + onCheckedChange = { + viewModel.onIncludeChange(!include) + } + ) + } + } + } + item { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = 7.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween) { + SearchBar(viewModel::emitQueriedPackages); + } + } + items(packages) { pack -> + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Row( + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(5.dp) + ) { + val drawable = + pack.applicationInfo?.loadIcon(context.packageManager) + if (drawable != null) { + Image( + painter = DrawablePainter(drawable), + stringResource(id = R.string.icon), + modifier = Modifier.size(50.dp, 50.dp) + ) + } else { + Icon( + Icons.Rounded.Android, + stringResource(id = R.string.edit), + modifier = Modifier.size(50.dp, 50.dp) + ) + } + Text( + pack.applicationInfo.loadLabel(context.packageManager) + .toString(), modifier = Modifier.padding(5.dp) + ) + } + Checkbox( + checked = (checkedPackages.contains(pack.packageName)), + onCheckedChange = { + if (it) viewModel.onAddCheckedPackage(pack.packageName) else viewModel.onRemoveCheckedPackage( + pack.packageName + ) + } + ) + } + } + } + item { + Row( + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth() + ) { + Button(onClick = { + scope.launch { + viewModel.onSaveAllChanges() + Toast.makeText( + context, + context.resources.getString(R.string.config_changes_saved), + Toast.LENGTH_LONG + ).show() + navController.navigate(Routes.Main.name) + } + }, Modifier.padding(25.dp)) { + Text(stringResource(id = R.string.save_changes)) + } + } + } + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigViewModel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigViewModel.kt new file mode 100644 index 0000000000..325e5a49bd --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/config/ConfigViewModel.kt @@ -0,0 +1,152 @@ +package net.nymtech.nymconnect.ui.screens.config + +import android.Manifest +import android.app.Application +import android.content.pm.PackageInfo +import android.content.pm.PackageManager +import android.os.Build +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.toMutableStateList +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class ConfigViewModel @Inject constructor(private val application : Application, + private val tunnelRepo : Repository, + private val settingsRepo : Repository) : ViewModel() { + + private val _tunnel = MutableStateFlow(null) + private val _tunnelName = MutableStateFlow("") + val tunnelName get() = _tunnelName.asStateFlow() + val tunnel get() = _tunnel.asStateFlow() + private val _packages = MutableStateFlow(emptyList()) + val packages get() = _packages.asStateFlow() + private val packageManager = application.packageManager + + private val _checkedPackages = MutableStateFlow(mutableStateListOf()) + val checkedPackages get() = _checkedPackages.asStateFlow() + private val _include = MutableStateFlow(true) + val include get() = _include.asStateFlow() + + private val _allApplications = MutableStateFlow(true) + val allApplications get() = _allApplications.asStateFlow() + + suspend fun getTunnelById(id : String?) : TunnelConfig? { + return try { + if(id != null) { + val config = tunnelRepo.getById(id.toLong()) + if (config != null) { + _tunnel.emit(config) + _tunnelName.emit(config.name) + + } + return config + } + return null + } catch (e : Exception) { + Timber.e(e.message) + null + } + } + + fun onTunnelNameChange(name : String) { + _tunnelName.value = name + } + + fun onIncludeChange(include : Boolean) { + _include.value = include + } + fun onAddCheckedPackage(packageName : String) { + _checkedPackages.value.add(packageName) + } + + fun onAllApplicationsChange(allApplications : Boolean) { + _allApplications.value = allApplications + } + + fun onRemoveCheckedPackage(packageName : String) { + _checkedPackages.value.remove(packageName) + } + + suspend fun emitCurrentPackageConfigurations(id : String?) { + val tunnelConfig = getTunnelById(id) + if(tunnelConfig != null) { + val config = TunnelConfig.configFromQuick(tunnelConfig.wgQuick) + val excludedApps = config.`interface`.excludedApplications + val includedApps = config.`interface`.includedApplications + if(excludedApps.isNullOrEmpty() && includedApps.isNullOrEmpty()) { + _allApplications.emit(true) + return + } + if(excludedApps.isEmpty()) { + _include.emit(true) + _checkedPackages.emit(includedApps.toMutableStateList()) + } else { + _include.emit(false) + _checkedPackages.emit(excludedApps.toMutableStateList()) + } + _allApplications.emit(false) + } + } + + fun emitQueriedPackages(query : String) { + viewModelScope.launch { + _packages.emit(getAllInternetCapablePackages().filter { + it.packageName.contains(query) + }) + } + } + + private fun getAllInternetCapablePackages() : List { + return getPackagesHoldingPermissions(arrayOf(Manifest.permission.INTERNET)) + } + + private fun getPackagesHoldingPermissions(permissions: Array): List { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + packageManager.getPackagesHoldingPermissions(permissions, PackageManager.PackageInfoFlags.of(0L)) + } else { + @Suppress("DEPRECATION") + packageManager.getPackagesHoldingPermissions(permissions, 0) + } + } + + suspend fun onSaveAllChanges() { + var wgQuick = _tunnel.value?.wgQuick + if(wgQuick != null) { + wgQuick = if(_include.value) { + TunnelConfig.setIncludedApplicationsOnQuick(_checkedPackages.value, wgQuick) + } else { + TunnelConfig.setExcludedApplicationsOnQuick(_checkedPackages.value, wgQuick) + } + if(_allApplications.value) { + wgQuick = TunnelConfig.clearAllApplicationsFromConfig(wgQuick) + } + _tunnel.value?.copy( + name = _tunnelName.value, + wgQuick = wgQuick + )?.let { + tunnelRepo.save(it) + val settings = settingsRepo.getAll() + if(settings != null) { + val setting = settings[0] + if(setting.defaultTunnel != null) { + if(it.id == TunnelConfig.from(setting.defaultTunnel!!).id) { + settingsRepo.save(setting.copy( + defaultTunnel = it.toString() + )) + } + } + } + } + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailScreen.kt new file mode 100644 index 0000000000..bdf77a5e56 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailScreen.kt @@ -0,0 +1,139 @@ +package net.nymtech.nymconnect.ui.screens.detail + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ClipboardManager +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.util.NumberUtils +import java.time.Duration +import java.time.Instant + +@Composable +fun DetailScreen( + viewModel: DetailViewModel = hiltViewModel(), + padding: PaddingValues, + id : String? +) { + + val clipboardManager: ClipboardManager = LocalClipboardManager.current + val tunnelStats by viewModel.tunnelStats.collectAsStateWithLifecycle(null) + val tunnel by viewModel.tunnel.collectAsStateWithLifecycle(null) + val tunnelName by viewModel.tunnelName.collectAsStateWithLifecycle() + val lastHandshake by viewModel.lastHandshake.collectAsStateWithLifecycle(emptyMap()) + + + LaunchedEffect(Unit) { + viewModel.getTunnelById(id) + } + + if(tunnel != null) { + val interfaceKey = tunnel?.`interface`?.keyPair?.publicKey?.toBase64().toString() + val addresses = tunnel?.`interface`?.addresses!!.joinToString() + val dnsServers = tunnel?.`interface`?.dnsServers!!.joinToString() + val optionalMtu = tunnel?.`interface`?.mtu + val mtu = if(optionalMtu?.isPresent == true) optionalMtu.get().toString() else "None" + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .padding(padding) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = 7.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Column { + Text(stringResource(R.string.config_interface), fontWeight = FontWeight.Bold, fontSize = 20.sp) + Text(stringResource(R.string.name), fontStyle = FontStyle.Italic) + Text(text = tunnelName, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(tunnelName)) + }) + Text(stringResource(R.string.public_key), fontStyle = FontStyle.Italic) + Text(text = interfaceKey, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(interfaceKey)) + }) + Text(stringResource(R.string.addresses), fontStyle = FontStyle.Italic) + Text(text = addresses, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(addresses)) + }) + Text(stringResource(R.string.dns_servers), fontStyle = FontStyle.Italic) + Text(text = dnsServers, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(dnsServers)) + }) + Text(stringResource(R.string.mtu), fontStyle = FontStyle.Italic) + Text(text = mtu, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(mtu)) + }) + Box(modifier = Modifier.padding(10.dp)) + tunnel?.peers?.forEach{ + val peerKey = it.publicKey.toBase64().toString() + val allowedIps = it.allowedIps.joinToString() + val endpoint = if(it.endpoint.isPresent) it.endpoint.get().toString() else "None" + Text(stringResource(R.string.peer), fontWeight = FontWeight.Bold, fontSize = 20.sp) + Text(stringResource(R.string.public_key), fontStyle = FontStyle.Italic) + Text(text = peerKey, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(peerKey)) + }) + Text(stringResource(id = R.string.allowed_ips), fontStyle = FontStyle.Italic) + Text(text = allowedIps, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(allowedIps)) + }) + Text(stringResource(R.string.endpoint), fontStyle = FontStyle.Italic) + Text(text = endpoint, modifier = Modifier.clickable { + clipboardManager.setText(AnnotatedString(endpoint)) + }) + if (tunnelStats != null) { + val totalRx = tunnelStats?.totalRx() ?: 0 + val totalTx = tunnelStats?.totalTx() ?: 0 + if((totalRx + totalTx != 0L)) { + val rxKB = NumberUtils.bytesToKB(tunnelStats!!.totalRx()) + val txKB = NumberUtils.bytesToKB(tunnelStats!!.totalTx()) + Text(stringResource(R.string.transfer), fontStyle = FontStyle.Italic) + Text("rx: ${NumberUtils.formatDecimalTwoPlaces(rxKB)} KB tx: ${NumberUtils.formatDecimalTwoPlaces(txKB)} KB") + Text(stringResource(R.string.last_handshake), fontStyle = FontStyle.Italic) + val handshakeEpoch = lastHandshake[it.publicKey] + if(handshakeEpoch != null) { + if(handshakeEpoch == 0L) { + Text("Never") + } else { + val time = Instant.ofEpochMilli(handshakeEpoch) + Text("${Duration.between(time, Instant.now()).seconds} seconds ago") + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailViewModel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailViewModel.kt new file mode 100644 index 0000000000..cf83878a0b --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/detail/DetailViewModel.kt @@ -0,0 +1,45 @@ +package net.nymtech.nymconnect.ui.screens.detail + +import androidx.lifecycle.ViewModel +import com.wireguard.config.Config +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.tunnel.VpnService +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class DetailViewModel @Inject constructor(private val tunnelRepo : Repository, private val vpnService : VpnService + +) : ViewModel() { + + private val _tunnel = MutableStateFlow(null) + val tunnel get() = _tunnel.asStateFlow() + + private val _tunnelName = MutableStateFlow("") + val tunnelName = _tunnelName.asStateFlow() + val tunnelStats get() = vpnService.statistics + val lastHandshake get() = vpnService.lastHandshake + + private var config : TunnelConfig? = null + + suspend fun getTunnelById(id : String?) : TunnelConfig? { + return try { + if(id != null) { + config = tunnelRepo.getById(id.toLong()) + if (config != null) { + _tunnel.emit(TunnelConfig.configFromQuick(config!!.wgQuick)) + _tunnelName.emit(config!!.name) + } + return config + } + return null + } catch (e : Exception) { + Timber.e(e.message) + null + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt new file mode 100644 index 0000000000..e2abdd07b7 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt @@ -0,0 +1,336 @@ +package net.nymtech.nymconnect.ui.screens.main + +import android.annotation.SuppressLint +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.foundation.clickable +import androidx.compose.foundation.focusable +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.FileOpen +import androidx.compose.material.icons.rounded.Add +import androidx.compose.material.icons.rounded.Circle +import androidx.compose.material.icons.rounded.Delete +import androidx.compose.material.icons.rounded.Edit +import androidx.compose.material.icons.rounded.Info +import androidx.compose.material3.Divider +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FabPosition +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.SnackbarResult +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.navigation.NavController +import com.wireguard.android.backend.Tunnel +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.WireGuardAutoTunnel +import net.nymtech.nymconnect.service.tunnel.HandshakeStatus +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import net.nymtech.nymconnect.ui.Routes +import net.nymtech.nymconnect.ui.common.RowListItem +import net.nymtech.nymconnect.ui.theme.brickRed +import net.nymtech.nymconnect.ui.theme.mint +import kotlinx.coroutines.launch + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun MainScreen( + viewModel: MainViewModel = hiltViewModel(), padding: PaddingValues, + snackbarHostState: SnackbarHostState, navController: NavController +) { + + val haptic = LocalHapticFeedback.current + val context = LocalContext.current + val isVisible = rememberSaveable { mutableStateOf(true) } + val scope = rememberCoroutineScope() + + val sheetState = rememberModalBottomSheetState() + var showBottomSheet by remember { mutableStateOf(false) } + val tunnels by viewModel.tunnels.collectAsStateWithLifecycle(mutableListOf()) + val handshakeStatus by viewModel.handshakeStatus.collectAsStateWithLifecycle(HandshakeStatus.NOT_STARTED) + val viewState = viewModel.viewState.collectAsStateWithLifecycle() + var selectedTunnel by remember { mutableStateOf(null) } + val state by viewModel.state.collectAsStateWithLifecycle(Tunnel.State.DOWN) + val tunnelName by viewModel.tunnelName.collectAsStateWithLifecycle("") + + // Nested scroll for control FAB + val nestedScrollConnection = remember { + object : NestedScrollConnection { + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + // Hide FAB + if (available.y < -1) { + isVisible.value = false + } + // Show FAB + if (available.y > 1) { + isVisible.value = true + } + return Offset.Zero + } + } + } + + LaunchedEffect(viewState.value) { + if (viewState.value.showSnackbarMessage) { + val result = snackbarHostState.showSnackbar( + message = viewState.value.snackbarMessage, + actionLabel = viewState.value.snackbarActionText, + duration = SnackbarDuration.Long, + ) + when (result) { + SnackbarResult.ActionPerformed -> viewState.value.onSnackbarActionClick + SnackbarResult.Dismissed -> viewState.value.onSnackbarActionClick + } + } + } + + val pickFileLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.GetContent() + ) { file -> + if (file != null) { + viewModel.onTunnelFileSelected(file) + } + } + + Scaffold( + modifier = Modifier.pointerInput(Unit) { + detectTapGestures(onTap = { + selectedTunnel = null + }) + }, + floatingActionButtonPosition = FabPosition.End, + floatingActionButton = { + AnimatedVisibility( + visible = isVisible.value, + enter = slideInVertically(initialOffsetY = { it * 2 }), + exit = slideOutVertically(targetOffsetY = { it * 2 }), + ) { + FloatingActionButton( + modifier = Modifier.padding(bottom = 90.dp), + onClick = { + showBottomSheet = true + }, + containerColor = MaterialTheme.colorScheme.secondary, + shape = RoundedCornerShape(16.dp), + ) { + Icon( + imageVector = Icons.Rounded.Add, + contentDescription = stringResource(id = R.string.add_tunnel), + tint = Color.DarkGray, + ) + } + } + } + ) { + if (tunnels.isEmpty()) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + Text(text = stringResource(R.string.no_tunnels), fontStyle = FontStyle.Italic) + } + } + if (showBottomSheet) { + ModalBottomSheet( + onDismissRequest = { + showBottomSheet = false + }, + sheetState = sheetState + ) { + // Sheet content + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { + showBottomSheet = false + pickFileLauncher.launch("*/*") + } + .padding(10.dp) + ) { + Icon( + Icons.Filled.FileOpen, + contentDescription = stringResource(id = R.string.open_file), + modifier = Modifier.padding(10.dp) + ) + Text( + stringResource(id = R.string.add_from_file), + modifier = Modifier.padding(10.dp) + ) + } + Divider() + } + } + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + + LazyColumn( + modifier = Modifier.fillMaxSize() + .nestedScroll(nestedScrollConnection), + ) { + itemsIndexed(tunnels.toList()) { index, tunnel -> + val focusRequester = FocusRequester(); + RowListItem(leadingIcon = Icons.Rounded.Circle, + leadingIconColor = if (tunnelName == tunnel.name) when (handshakeStatus) { + HandshakeStatus.HEALTHY -> mint + HandshakeStatus.UNHEALTHY -> brickRed + HandshakeStatus.NOT_STARTED -> Color.Gray + HandshakeStatus.NEVER_CONNECTED -> brickRed + } else Color.Gray, + text = tunnel.name, + onHold = { + if (state == Tunnel.State.UP && tunnel.name == tunnelName) { + scope.launch { + viewModel.showSnackBarMessage(context.resources.getString(R.string.turn_off_tunnel)) + } + return@RowListItem + } + haptic.performHapticFeedback(HapticFeedbackType.LongPress) + selectedTunnel = tunnel; + }, + onClick = { + if (!WireGuardAutoTunnel.isRunningOnAndroidTv(context)) { + navController.navigate("${Routes.Detail.name}/${tunnel.id}") + } else { + focusRequester.requestFocus() + } + }, + rowButton = { + if (tunnel.id == selectedTunnel?.id) { + Row { + IconButton(onClick = { + navController.navigate("${Routes.Config.name}/${selectedTunnel?.id}") + }) { + Icon(Icons.Rounded.Edit, stringResource(id = R.string.edit)) + } + IconButton( + modifier = Modifier.focusable(), + onClick = { viewModel.onDelete(tunnel) }) { + Icon( + Icons.Rounded.Delete, + stringResource(id = R.string.delete) + ) + } + } + } else { + if (WireGuardAutoTunnel.isRunningOnAndroidTv(context)) { + Row { + IconButton( + modifier = Modifier.focusRequester(focusRequester), + onClick = { + navController.navigate("${Routes.Detail.name}/${tunnel.id}") + }) { + Icon(Icons.Rounded.Info, "Info") + } + IconButton(onClick = { + if (state == Tunnel.State.UP && tunnel.name == tunnelName) + scope.launch { + viewModel.showSnackBarMessage( + context.resources.getString( + R.string.turn_off_tunnel + ) + ) + } else { + navController.navigate("${Routes.Config.name}/${tunnel.id}") + } + }) { + Icon( + Icons.Rounded.Edit, + stringResource(id = R.string.edit) + ) + } + IconButton(onClick = { + if (state == Tunnel.State.UP && tunnel.name == tunnelName) + scope.launch { + viewModel.showSnackBarMessage( + context.resources.getString( + R.string.turn_off_tunnel + ) + ) + } else { + viewModel.onDelete(tunnel) + } + }) { + Icon( + Icons.Rounded.Delete, + stringResource(id = R.string.delete) + ) + } + Switch( + checked = (state == Tunnel.State.UP && tunnel.name == tunnelName), + onCheckedChange = { checked -> + if (checked) viewModel.onTunnelStart(tunnel) else viewModel.onTunnelStop() + } + ) + } + } else { + Switch( + checked = (state == Tunnel.State.UP && tunnel.name == tunnelName), + onCheckedChange = { checked -> + if (checked) viewModel.onTunnelStart(tunnel) else viewModel.onTunnelStop() + } + ) + } + } + }) + } + } + } + } +} diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt new file mode 100644 index 0000000000..a88b5adcb9 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt @@ -0,0 +1,179 @@ +package net.nymtech.nymconnect.ui.screens.main + +import android.annotation.SuppressLint +import android.app.Application +import android.content.Context +import android.net.Uri +import android.provider.OpenableColumns +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.wireguard.config.BadConfigException +import com.wireguard.config.Config +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.foreground.ServiceState +import net.nymtech.nymconnect.service.foreground.ServiceManager +import net.nymtech.nymconnect.service.foreground.WireGuardConnectivityWatcherService +import net.nymtech.nymconnect.service.shortcut.ShortcutsManager +import net.nymtech.nymconnect.service.tunnel.VpnService +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import net.nymtech.nymconnect.ui.ViewState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + + +@HiltViewModel +class MainViewModel @Inject constructor(private val application : Application, + private val tunnelRepo : Repository, + private val settingsRepo : Repository, + private val vpnService: VpnService, +) : ViewModel() { + + private val _viewState = MutableStateFlow(ViewState()) + val viewState get() = _viewState.asStateFlow() + val tunnels get() = tunnelRepo.itemFlow + val state get() = vpnService.state + + val handshakeStatus get() = vpnService.handshakeStatus + val tunnelName get() = vpnService.tunnelName + private val _settings = MutableStateFlow(Settings()) + val settings get() = _settings.asStateFlow() + + private val defaultConfigName = { + "tunnel${(Math.random() * 100000).toInt()}" + } + + + init { + viewModelScope.launch { + settingsRepo.itemFlow.collect { + val settings = it.first() + validateWatcherServiceState(settings) + _settings.emit(settings) + } + } + } + + private fun validateWatcherServiceState(settings: Settings) { + val watcherState = ServiceManager.getServiceState(application.applicationContext, WireGuardConnectivityWatcherService::class.java) + if(settings.isAutoTunnelEnabled && watcherState == ServiceState.STOPPED && settings.defaultTunnel != null) { + ServiceManager.startWatcherService(application.applicationContext, settings.defaultTunnel!!) + } + } + + + fun onDelete(tunnel : TunnelConfig) { + viewModelScope.launch { + if(tunnelRepo.count() == 1L) { + ServiceManager.stopWatcherService(application.applicationContext) + val settings = settingsRepo.getAll() + if(!settings.isNullOrEmpty()) { + val setting = settings[0] + setting.defaultTunnel = null + setting.isAutoTunnelEnabled = false + setting.isAlwaysOnVpnEnabled = false + settingsRepo.save(setting) + } + } + tunnelRepo.delete(tunnel) + ShortcutsManager.removeTunnelShortcuts(application.applicationContext, tunnel) + } + } + + fun onTunnelStart(tunnelConfig : TunnelConfig) = viewModelScope.launch { + ServiceManager.startVpnService(application.applicationContext, tunnelConfig.toString()) + } + + fun onTunnelStop() { + ServiceManager.stopVpnService(application.applicationContext) + } + + fun onTunnelFileSelected(uri : Uri) { + try { + val fileName = getFileName(application.applicationContext, uri) + val extension = getFileExtensionFromFileName(fileName) + if(extension != ".conf") { + viewModelScope.launch { + showSnackBarMessage(application.resources.getString(R.string.file_extension_message)) + } + return + } + val stream = application.applicationContext.contentResolver.openInputStream(uri) + stream ?: return + val bufferReader = stream.bufferedReader(charset = Charsets.UTF_8) + val config = Config.parse(bufferReader) + val tunnelName = getNameFromFileName(fileName) + saveTunnel(TunnelConfig(name = tunnelName, wgQuick = config.toWgQuickString())) + stream.close() + } catch(_: BadConfigException) { + viewModelScope.launch { + showSnackBarMessage(application.applicationContext.getString(R.string.bad_config)) + } + } + } + + private fun saveTunnel(tunnelConfig : TunnelConfig) { + viewModelScope.launch { + tunnelRepo.save(tunnelConfig) + ShortcutsManager.createTunnelShortcuts(application.applicationContext, tunnelConfig) + } + } + + @SuppressLint("Range") + private fun getFileName(context: Context, uri: Uri): String { + if (uri.scheme == "content") { + val cursor = try { + context.contentResolver.query(uri, null, null, null, null) + } catch (e : Exception) { + Timber.d("Exception getting config name") + null + } + cursor ?: return defaultConfigName() + cursor.use { + if(cursor.moveToFirst()) { + return cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)) + } + } + } + return defaultConfigName() + } + + suspend fun showSnackBarMessage(message : String) { + _viewState.emit(_viewState.value.copy( + showSnackbarMessage = true, + snackbarMessage = message, + snackbarActionText = "Okay", + onSnackbarActionClick = { + viewModelScope.launch { + dismissSnackBar() + } + } + )) + delay(3000) + dismissSnackBar() + } + + private suspend fun dismissSnackBar() { + _viewState.emit(_viewState.value.copy( + showSnackbarMessage = false + )) + } + + private fun getNameFromFileName(fileName : String) : String { + return fileName.substring(0 , fileName.lastIndexOf('.') ) + } + + private fun getFileExtensionFromFileName(fileName : String) : String { + return try { + fileName.substring(fileName.lastIndexOf('.')) + } catch (e : Exception) { + "" + } + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt new file mode 100644 index 0000000000..4616a8fd9a --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt @@ -0,0 +1,415 @@ +package net.nymtech.nymconnect.ui.screens.settings + +import android.Manifest +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.provider.Settings +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.outlined.Add +import androidx.compose.material.icons.rounded.LocationOff +import androidx.compose.material3.Button +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.SnackbarResult +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.navigation.NavController +import com.google.accompanist.permissions.ExperimentalPermissionsApi +import com.google.accompanist.permissions.isGranted +import com.google.accompanist.permissions.rememberPermissionState +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.WireGuardAutoTunnel +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import net.nymtech.nymconnect.ui.Routes +import net.nymtech.nymconnect.ui.common.ClickableIconButton +import kotlinx.coroutines.launch + +@OptIn(ExperimentalMaterial3Api::class, ExperimentalPermissionsApi::class, + ExperimentalLayoutApi::class +) +@Composable +fun SettingsScreen( + viewModel: SettingsViewModel = hiltViewModel(), + padding: PaddingValues, + navController: NavController, + focusRequester: FocusRequester, + snackbarHostState: SnackbarHostState = remember { SnackbarHostState() } +) { + + val scope = rememberCoroutineScope() + val context = LocalContext.current + val focusManager = LocalFocusManager.current + val interactionSource = remember { MutableInteractionSource() } + + var expanded by remember { mutableStateOf(false) } + val viewState by viewModel.viewState.collectAsStateWithLifecycle() + val settings by viewModel.settings.collectAsStateWithLifecycle() + val trustedSSIDs by viewModel.trustedSSIDs.collectAsStateWithLifecycle() + val tunnels by viewModel.tunnels.collectAsStateWithLifecycle(mutableListOf()) + val backgroundLocationState = + rememberPermissionState(Manifest.permission.ACCESS_BACKGROUND_LOCATION) + val fineLocationState = rememberPermissionState(Manifest.permission.ACCESS_FINE_LOCATION) + var currentText by remember { mutableStateOf("") } + val scrollState = rememberScrollState() + var isLocationServicesEnabled by remember { mutableStateOf(viewModel.checkLocationServicesEnabled())} + + LaunchedEffect(viewState) { + if (viewState.showSnackbarMessage) { + val result = snackbarHostState.showSnackbar( + message = viewState.snackbarMessage, + actionLabel = viewState.snackbarActionText, + duration = SnackbarDuration.Long, + ) + when (result) { + SnackbarResult.ActionPerformed -> viewState.onSnackbarActionClick + SnackbarResult.Dismissed -> viewState.onSnackbarActionClick + } + } + } + + fun saveTrustedSSID() { + if (currentText.isNotEmpty()) { + scope.launch { + viewModel.onSaveTrustedSSID(currentText) + currentText = "" + } + } + } + + fun openSettings() { + scope.launch { + val intentSettings = + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intentSettings.data = + Uri.fromParts("package", context.packageName, null) + context.startActivity(intentSettings) + } + } + + if(!backgroundLocationState.status.isGranted && Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + Column(horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .verticalScroll(scrollState) + .padding(padding)) { + Icon(Icons.Rounded.LocationOff, contentDescription = stringResource(id = R.string.map), modifier = Modifier + .padding(30.dp) + .size(128.dp)) + Text(stringResource(R.string.prominent_background_location_title), textAlign = TextAlign.Center, modifier = Modifier.padding(30.dp), fontSize = 20.sp) + Text(stringResource(R.string.prominent_background_location_message), textAlign = TextAlign.Center, modifier = Modifier.padding(30.dp), fontSize = 15.sp) + Row( + modifier = if(WireGuardAutoTunnel.isRunningOnAndroidTv(context)) Modifier + .fillMaxWidth() + .padding(10.dp) else Modifier + .fillMaxWidth() + .padding(30.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly + ) { + Button(onClick = { + navController.navigate(Routes.Main.name) + }) { + Text(stringResource(id = R.string.no_thanks)) + } + Button(modifier = Modifier.focusRequester(focusRequester), onClick = { + openSettings() + }) { + Text(stringResource(id = R.string.turn_on)) + } + } + } + return + } + + if(!fineLocationState.status.isGranted) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + Text( + stringResource(id = R.string.precise_location_message), + textAlign = TextAlign.Center, + modifier = Modifier.padding(15.dp), + fontStyle = FontStyle.Italic + ) + Button(modifier = Modifier.focusRequester(focusRequester),onClick = { + fineLocationState.launchPermissionRequest() + }) { + Text(stringResource(id = R.string.request)) + } + + } + return + } + + if (tunnels.isEmpty()) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + Text( + stringResource(R.string.one_tunnel_required), + textAlign = TextAlign.Center, + modifier = Modifier.padding(15.dp), + fontStyle = FontStyle.Italic + ) + } + return + } + if(!isLocationServicesEnabled && Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + Text( + stringResource(id = R.string.location_services_not_detected), + textAlign = TextAlign.Center, + modifier = Modifier.padding(15.dp), + fontStyle = FontStyle.Italic + ) + Button(modifier = Modifier.focusRequester(focusRequester), onClick = { + val locationServicesEnabled = viewModel.checkLocationServicesEnabled() + isLocationServicesEnabled = locationServicesEnabled + if(!locationServicesEnabled) { + scope.launch { + viewModel.showSnackBarMessage(context.getString(R.string.detecting_location_services_disabled)) + } + } + }) { + Text(stringResource(id = R.string.check_again)) + } + } + return + } + val screenPadding = if(WireGuardAutoTunnel.isRunningOnAndroidTv(context)) 5.dp else 15.dp + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Top, + modifier = if(WireGuardAutoTunnel.isRunningOnAndroidTv(context)) Modifier + .fillMaxHeight(.85f) + .fillMaxWidth() + .verticalScroll(scrollState) + .clickable(indication = null, interactionSource = interactionSource) { + focusManager.clearFocus() + } + .padding(padding) else Modifier + .fillMaxSize() + .verticalScroll(scrollState) + .clickable(indication = null, interactionSource = interactionSource) { + focusManager.clearFocus() + } + .padding(padding) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(screenPadding), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(R.string.enable_auto_tunnel)) + Switch( + modifier = Modifier.focusRequester(focusRequester), + enabled = !settings.isAlwaysOnVpnEnabled, + checked = settings.isAutoTunnelEnabled, + onCheckedChange = { + scope.launch { + viewModel.toggleAutoTunnel() + } + } + ) + } + Text( + stringResource(id = R.string.select_tunnel), + textAlign = TextAlign.Center, + modifier = Modifier.padding(screenPadding, bottom = 5.dp, top = 5.dp) + ) + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { + if(!(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled)) { + expanded = !expanded }}, + modifier = Modifier.padding(start = 15.dp, top = 5.dp, bottom = 10.dp).clickable { + expanded = !expanded + }, + ) { + TextField( + enabled = !(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled), + value = settings.defaultTunnel?.let { + TunnelConfig.from(it).name } + ?: "", + readOnly = true, + modifier = Modifier.menuAnchor(), + label = { Text(stringResource(R.string.tunnels)) }, + onValueChange = { }, + trailingIcon = { + ExposedDropdownMenuDefaults.TrailingIcon( + expanded = expanded + ) + } + ) + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { + expanded = false + } + ) { + tunnels.forEach() { tunnel -> + DropdownMenuItem( + onClick = { + scope.launch { + viewModel.onDefaultTunnelSelected(tunnel) + } + expanded = false + }, + text = { Text(text = tunnel.name) } + ) + } + } + } + Text( + stringResource(R.string.trusted_ssid), + textAlign = TextAlign.Center, + modifier = Modifier.padding(screenPadding, bottom = 5.dp, top = 5.dp) + ) + FlowRow( + modifier = Modifier.padding(screenPadding), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.SpaceEvenly + ) { + trustedSSIDs.forEach { ssid -> + ClickableIconButton(onIconClick = { + scope.launch { + viewModel.onDeleteTrustedSSID(ssid) + } + }, text = ssid, icon = Icons.Filled.Close, enabled = !(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled)) + } + } + OutlinedTextField( + enabled = !(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled), + value = currentText, + onValueChange = { currentText = it }, + label = { Text(stringResource(R.string.add_trusted_ssid)) }, + modifier = Modifier.padding(start = screenPadding, top = 5.dp), + maxLines = 1, + keyboardOptions = KeyboardOptions( + capitalization = KeyboardCapitalization.None, + imeAction = ImeAction.Done + ), + keyboardActions = KeyboardActions( + onDone = { + saveTrustedSSID() + } + ), + trailingIcon = { + IconButton(onClick = { saveTrustedSSID() }) { + Icon( + imageVector = Icons.Outlined.Add, + contentDescription = if (currentText == "") stringResource(id = R.string.trusted_ssid_empty_description) else stringResource( + id = R.string.trusted_ssid_value_description + ), + tint = if(currentText == "") Color.Transparent else Color.Green + ) + } + }, + ) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(screenPadding), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(R.string.tunnel_mobile_data)) + Switch( + enabled = !(settings.isAutoTunnelEnabled || settings.isAlwaysOnVpnEnabled), + checked = settings.isTunnelOnMobileDataEnabled, + onCheckedChange = { + scope.launch { + viewModel.onToggleTunnelOnMobileData() + } + } + ) + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(screenPadding), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(R.string.always_on_vpn_support)) + Switch( + enabled = !settings.isAutoTunnelEnabled, + checked = settings.isAlwaysOnVpnEnabled, + onCheckedChange = { + scope.launch { + viewModel.onToggleAlwaysOnVPN() + } + } + ) + } + } +} + + diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt new file mode 100644 index 0000000000..7143c1b4b6 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt @@ -0,0 +1,124 @@ +package net.nymtech.nymconnect.ui.screens.settings + +import android.app.Application +import android.content.Context +import android.location.LocationManager +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import net.nymtech.nymconnect.R +import net.nymtech.nymconnect.repository.Repository +import net.nymtech.nymconnect.service.foreground.ServiceManager +import net.nymtech.nymconnect.service.tunnel.model.Settings +import net.nymtech.nymconnect.service.tunnel.model.TunnelConfig +import net.nymtech.nymconnect.ui.ViewState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + + +@HiltViewModel +class SettingsViewModel @Inject constructor(private val application : Application, + private val tunnelRepo : Repository, private val settingsRepo : Repository +) : ViewModel() { + + private val _trustedSSIDs = MutableStateFlow(emptyList()) + val trustedSSIDs = _trustedSSIDs.asStateFlow() + private val _settings = MutableStateFlow(Settings()) + val settings get() = _settings.asStateFlow() + val tunnels get() = tunnelRepo.itemFlow + private val _viewState = MutableStateFlow(ViewState()) + val viewState get() = _viewState.asStateFlow() + + init { + checkLocationServicesEnabled() + viewModelScope.launch { + settingsRepo.itemFlow.collect { + val settings = it.first() + _settings.emit(settings) + _trustedSSIDs.emit(settings.trustedNetworkSSIDs.toList()) + } + } + } + + suspend fun onSaveTrustedSSID(ssid: String) { + val trimmed = ssid.trim() + if (!_settings.value.trustedNetworkSSIDs.contains(trimmed)) { + _settings.value.trustedNetworkSSIDs.add(trimmed) + settingsRepo.save(_settings.value) + } else { + showSnackBarMessage("SSID already exists.") + } + } + + suspend fun onDefaultTunnelSelected(tunnelConfig: TunnelConfig) { + settingsRepo.save(_settings.value.copy( + defaultTunnel = tunnelConfig.toString() + )) + } + + suspend fun onToggleTunnelOnMobileData() { + settingsRepo.save(_settings.value.copy( + isTunnelOnMobileDataEnabled = !_settings.value.isTunnelOnMobileDataEnabled + )) + } + + suspend fun onDeleteTrustedSSID(ssid: String) { + _settings.value.trustedNetworkSSIDs.remove(ssid) + settingsRepo.save(_settings.value) + } + + suspend fun toggleAutoTunnel() { + if(_settings.value.defaultTunnel.isNullOrEmpty() && !_settings.value.isAutoTunnelEnabled) { + showSnackBarMessage(application.getString(R.string.select_tunnel_message)) + return + } + if(_settings.value.isAutoTunnelEnabled) { + ServiceManager.stopWatcherService(application) + } else { + if(_settings.value.defaultTunnel != null) { + val defaultTunnel = _settings.value.defaultTunnel + ServiceManager.startWatcherService(application, defaultTunnel!!) + } + } + settingsRepo.save(_settings.value.copy( + isAutoTunnelEnabled = !_settings.value.isAutoTunnelEnabled + )) + } + + suspend fun showSnackBarMessage(message : String) { + _viewState.emit(_viewState.value.copy( + showSnackbarMessage = true, + snackbarMessage = message, + snackbarActionText = "Okay", + onSnackbarActionClick = { + viewModelScope.launch { + dismissSnackBar() + } + } + )) + } + + private suspend fun dismissSnackBar() { + _viewState.emit(_viewState.value.copy( + showSnackbarMessage = false + )) + } + + suspend fun onToggleAlwaysOnVPN() { + if(_settings.value.defaultTunnel != null) { + _settings.emit( + _settings.value.copy(isAlwaysOnVpnEnabled = !_settings.value.isAlwaysOnVpnEnabled) + ) + settingsRepo.save(_settings.value) + } else { + showSnackBarMessage(application.getString(R.string.select_tunnel_message)) + } + } + fun checkLocationServicesEnabled() : Boolean { + val locationManager = + application.getSystemService(Context.LOCATION_SERVICE) as LocationManager + return locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt new file mode 100644 index 0000000000..31fc9dbf6a --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt @@ -0,0 +1,83 @@ +package net.nymtech.nymconnect.ui.screens.support + +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import androidx.compose.foundation.clickable +import androidx.compose.foundation.focusable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import net.nymtech.nymconnect.R + +@Composable +fun SupportScreen(padding : PaddingValues, focusRequester: FocusRequester) { + + val context = LocalContext.current + + fun openWebPage(url: String) { + val webpage: Uri = Uri.parse(url) + val intent = Intent(Intent.ACTION_VIEW, webpage) + context.startActivity(intent) + } + + Column(horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .focusable() + .padding(padding)) { + Text(stringResource(R.string.support_text), textAlign = TextAlign.Center, modifier = Modifier.padding(30.dp), fontSize = 15.sp) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly + ) { + IconButton(onClick = { + openWebPage(context.resources.getString(R.string.discord_url)) + }) { + Icon(imageVector = ImageVector.vectorResource(R.drawable.discord), "Discord") + } + IconButton(modifier = Modifier.focusRequester(focusRequester),onClick = { + openWebPage(context.resources.getString(R.string.github_url)) + }) { + Icon(imageVector = ImageVector.vectorResource(R.drawable.github), "Github") + } + } + Spacer(modifier = Modifier.weight(1f)) + Text(stringResource(id = R.string.privacy_policy), style = TextStyle(textDecoration = TextDecoration.Underline), + modifier = Modifier.clickable { + openWebPage(context.resources.getString(R.string.privacy_policy_url)) + }) + Text("App version: ${net.nymtech.nymconnect.BuildConfig.VERSION_NAME}", Modifier.padding(25.dp)) + } + } \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt new file mode 100644 index 0000000000..3561a75512 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt @@ -0,0 +1,17 @@ +package net.nymtech.nymconnect.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFF492532) +val virdigris = Color(0xFF5BC0BE) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFFFFFFFF) + +//status colors +val brickRed = Color(0xFFCE4257) +val pinkRed = Color(0xFFEF476F) +val mint = Color(0xFF52B788) diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt new file mode 100644 index 0000000000..647ad9f2ad --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt @@ -0,0 +1,80 @@ +package net.nymtech.nymconnect.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat + +private val DarkColorScheme = darkColorScheme( + //primary = Purple80, + primary = virdigris, + secondary = virdigris, + // secondary = PurpleGrey80, + tertiary = virdigris + //tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 + + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +@Composable +fun WireguardAutoTunnelTheme( + //force dark theme + darkTheme : Boolean = true, + //darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + //turning off dynamic color for now + dynamicColor: Boolean = false, + content: @Composable () -> Unit +) { + + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as Activity).window + WindowCompat.setDecorFitsSystemWindows(window, false) + window.statusBarColor = Color.Transparent.toArgb() + window.navigationBarColor = Color.Transparent.toArgb() + WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars = !darkTheme + WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightNavigationBars = !darkTheme + } + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt new file mode 100644 index 0000000000..6a1c35331c --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt @@ -0,0 +1,22 @@ +package net.nymtech.nymconnect.ui.theme + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.ui.graphics.Color +import com.google.accompanist.systemuicontroller.rememberSystemUiController + +@Composable +fun TransparentSystemBars() { + val systemUiController = rememberSystemUiController() + val useDarkIcons = !isSystemInDarkTheme() + + DisposableEffect(systemUiController, useDarkIcons) { + systemUiController.setSystemBarsColor( + color = Color.Transparent, + darkIcons = useDarkIcons + ) + + onDispose {} + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt new file mode 100644 index 0000000000..6b89a8e327 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package net.nymtech.nymconnect.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/NumberUtils.kt b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/NumberUtils.kt new file mode 100644 index 0000000000..aa240e6eb2 --- /dev/null +++ b/nym-vpn/android/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/NumberUtils.kt @@ -0,0 +1,25 @@ +package net.nymtech.nymconnect.util + +import java.math.BigDecimal +import java.text.DecimalFormat +import java.time.Duration +import java.time.Instant + +object NumberUtils { + + private const val BYTES_IN_KB = 1024L + + fun bytesToKB(bytes : Long) : BigDecimal { + return bytes.toBigDecimal().divide(BYTES_IN_KB.toBigDecimal()) + } + + fun formatDecimalTwoPlaces(bigDecimal: BigDecimal) : String { + val df = DecimalFormat("#.##") + return df.format(bigDecimal) + } + + fun getSecondsBetweenTimestampAndNow(epoch : Long) : Long { + val time = Instant.ofEpochMilli(epoch) + return Duration.between(time, Instant.now()).seconds + } +} \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/drawable/discord.xml b/nym-vpn/android/app/src/main/res/drawable/discord.xml new file mode 100644 index 0000000000..df43339353 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/discord.xml @@ -0,0 +1,10 @@ + + + diff --git a/nym-vpn/android/app/src/main/res/drawable/github.xml b/nym-vpn/android/app/src/main/res/drawable/github.xml new file mode 100644 index 0000000000..32f8254ebe --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/github.xml @@ -0,0 +1,12 @@ + + + diff --git a/nym-vpn/android/app/src/main/res/drawable/ic_launcher_background.xml b/nym-vpn/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000000..07d5da9cbf --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nym-vpn/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/nym-vpn/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000000..2b068d1146 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/drawable/shield.xml b/nym-vpn/android/app/src/main/res/drawable/shield.xml new file mode 100644 index 0000000000..e49a1f265d --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/shield.xml @@ -0,0 +1,5 @@ + + + diff --git a/nym-vpn/android/app/src/main/res/drawable/vpn_off.xml b/nym-vpn/android/app/src/main/res/drawable/vpn_off.xml new file mode 100644 index 0000000000..d33949b74b --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/vpn_off.xml @@ -0,0 +1,5 @@ + + + diff --git a/nym-vpn/android/app/src/main/res/drawable/vpn_on.xml b/nym-vpn/android/app/src/main/res/drawable/vpn_on.xml new file mode 100644 index 0000000000..1339fb3b8b --- /dev/null +++ b/nym-vpn/android/app/src/main/res/drawable/vpn_on.xml @@ -0,0 +1,5 @@ + + + diff --git a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml new file mode 100644 index 0000000000..cf3108b364 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000000..036d09bc5f --- /dev/null +++ b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000000..036d09bc5f --- /dev/null +++ b/nym-vpn/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..52206777aa3245f61ae885e0825057c0550c2f0e GIT binary patch literal 2004 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 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..106e0e13cc5996f9e412a6277c365a55550b330d GIT binary patch literal 1926 zcmV;12YL8XNk&F~2LJ$9MM6+kP&iC+2LJ#sYrq;1HPN;9|Mca|eZ;nt+O}=mw(T6- z=FBnvzwa-;fn1OFckexG?S0zhH|S3HX`|8=FJii^wPUu^#kmICcDk%oPAYY?(wViZ zL6vIyu(QqDMrYeem7H$6X_MBr*`_pZVpgssg>2il)3!=}vVUWCm?K-Z&OTC@p}ow^ z%*;$r%pkdqBuSFII;#X9Ay+8~ZQHi7c`|3)wr$(C-A#a+ ze1MX4A@*7zUGomf$xZN?0Ku1WqTgBa3c<-na3h`RWi}EF1bZfQe}&}@0;x&x3?FuH zRuK&dcIEVwY&&Bm|4R^WyO>3SO$nWR1j`8i11^-iQve8_3r@$0yq_SOA#w(icH{Ym zrj=^z6Racn0{}S+Pp_aQxF%R%(My6EnWVHZDQ77nw*Z0tKx@r~mq$|f+El2_>TBr8_=TmTU5DT$@t!9*@I9f239cRr0P|Uj*lP~HL1jq52lUn;!{)msrILQ54~sK6Y9(CT?Gyu9*oaITovtP1i&IVYxTxX8sDO6H%$?3W4z&emFRS$Ce^^WzM7^MlVuWk|8TCCQ{Oi z8F6jm>%`U=Az3|-UmU>&OA$OmOotw)BfMM@<%%p5S*>2WV+5?2Do2c9)|mZa4wdqO zOo^`#fcQp5l#3(SVW~Bcrt$2oG8>%`S7RW#JSEY!imKM&Sfl8rm(s7{4#$wkB4$>M zhg-P{AYGPU0D!nUk(J^ImRL$+4}yO+BL;}6Rdf}d!H-{R`tztN`*5nxK03Sok*fjl zj*9?F`sWJ3u6uF><18h(D~rl7N22P?!>Rt?qqd(n$7%b~k)zl!2MpZAg$1MvUIMV^ zuAEfc+)@NHb^L<*-#}`gT7TV~)}9_|y%NlzCoa`w9!~emi@RIHRA_tkN;UvRLB_}vw4`vmRb9-hK@!R#)>Eh#gUu7L=5A zbQaZnxw`)kCwx&FwEFCD`n+&q5}SmT3cxQ(nw*rZgu;rT?!ukcQUnjpC5+2?B}c>b zcJbo0|KNiuvmFeQ+C~;5SjG9}%0Se-oNE6+zz%%!;;`g_j58x2*syTZ$7f zQrTiff_vr+2Coa)ZR92?5{BUY1mYWK4@#=-%@vUhC)QeXR|rz z?=6O4va-o(|6^i#bvAi-eyzc?LtY~_RIl(0RSGa^T(sM zUyp^W7>HaH^ob2uw)qpm2~B2#k6++tiKuYPW=W%pomSMm21z4i8IkjXKEa(dk#PG^ z!lWF*UjSJt!!(x833owzi6CH5a2hH*6)+1xil&3*>kgewm@yp$FmQ~r)y!d{4+HQG z_*s|?rrpJBq~_Yor$i64SCTS|rMzSO1{uC{JL%UJA%n|1^f{4yFJo@6jJwyg=|#PzotK9*6$q*a`eBn=o!R z&~7VfYAbu*o7ih^Yvvm_yEFvuKI*1{jatJELsbvSmkW(c$cMFt83me`ViC z|D%aDD-tV3u=2_)CrAcvuW#@rVS6b%U+G!s=Mo-nf#9pqX{zk~{HyeG6rOJVe5SH{ z(MyD+-KevSo0a{7lTF!wMS_{@XilTll$ebK7s@0cPn4t$!583d7pIQOD_uxYNqbh( MZk0*0tH~@60R0}G`2YX_ literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..c388f6dae5a66dd7133c1c43af5f493e7a735579 GIT binary patch literal 2242 zcmV;z2tD^wNk&Gx2mkZJ3xp?HvjcF#*l+iB`GU z{x_2H$9uQCvpXZ<2?=R}R_MQiyBld|JNP%iLwc7}1QAvIo{e$wnUoIh3Lv}`8`DBT14|`|@XYBo4*t zBX%{Y~f&bDoOkFCv|_2QVBr3|--%yKfVfCjj(4{L%BsNgh! zM-=m>hnx-^I*lZ-{|ApikZt1+@>?!d{mcB*U;r#xt}Gh9FJnHm*|rc)B}|BR(bbvt&dEKg+-jz{};aX!q7 zXx~<8{RxPd5o#!c-b1G$N%(rKmasjSOpq*PtJ&|VvhT<7It$`h8hK9F^zgnz6zT6w zPjk1bt;j2b2Md&ml}ssEIJ`5X(X6DuS#ds&;Q0SL1rJy3j}4-Jg`Byf7CMTA+KxU5 z3Sv}cbQzR-ebQz`di9Rcm7xg(01O0-3IJfk=*fP5Hhe5}7e4@O2pO*pbqH!RptX3GgOz|9K&{7Q+)ytVt!8v5;bOtb z#^68zfW)LqmWD|H@K(yqV5X4CfRRA17689QrM@$u$txVCv2AI*4GBQ?=LI1ahF>xj zp&SBZ000-N%4<*b?-T9k6h3$YVvt<*l1vmn3J@yS3V>U_622Ocz~5etTTb^>7)$dK za>{Nk0FWzqs6+780ayU-MR##=W6MIhRY2>~#v zuUxLQvtVz?r?~Iu0N+gFsUx*@SZx6BlRa7YegVI01o#Wg4Wv+uD89D{Kn=bba_#Iy z?SvKO$GkHGz-NK|HqUGUns9w zB@WpU_sz)Oc61DCj(tQeCIvwV3KRHcq6i(HACZ2KSjM(wp5n~G~w>TnFW9bb7B|sc}O5J`C|wee+{alSf8eh0?>2x;=kMdgCoJC*+>wr`i90r z079S#KpU=jZ->P4IYz+Rit~>0VGP1lUwPJIo=hpQq3S#+O=hI}W2S$m2v zKIPY!bFl!xBx;K|KbbUhTIQP1;bd6_$9d9tu|Ci6+JK2;CJR?T^F%sw!!dy(xQ+x0xlR`sgv5Bk^Ec}qq=68wHoPpjghIlm)g+R@=N5s^ zj%~wJfi61ZFD&>hFarP~xLRNd)CevvAbpwn4;0D#H))1t4a*$!7)V8Gp?QDj{DgiT znPcE^7NN9CWx~OQk^+z^HID@h2}H<^ZYZk5mu@r^p@+s22p-E@H6D^at<$#@9BRAN z7MvWYNbo{9h&36nALvTwteS5&{EiWX{yNoVQ{rb^91J*<@OJQ9%1_r#(c)duM zpFcV$NR+48mM5EFQD3?wTgnG>D33XidBGqktqQa-0EK}ClSHnwWw*8_@@tZbAmGUl z%N#ZYhG#XUrV5oL&o;O@1gYtub8ck5S|pCDNwcQytJQtd2%@|hPjBcKYyNlOn5K>11Zgg(2u9@w>uHn;ifq#+@)JfE(1i>HKQptvuc&2?3Aj}g zO-#X@rZ7oW`!O`t#2|e?(ZsFV)gI+LPQEw-lVF~+>I+Mo0=Q9AxB(!&p0yeX76+~4 zNIWhR1SG2|v)nt}63t`Us`{zbHTEsJO=jB7sjZ9SgsVRrR4zhyKz9x(M?2 z%+|9nKdjkJFdMw|xWqq~TLju*U(X2GjE2XkQ_t1Q?)CHyZn|Y-E)mz53mp04Ze1df Q3Dna|FWs`0M)6J<0KA+ky8r+H literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner.png b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd39f501dd7a23fb706d9c597bdec9b3c511e5e GIT binary patch literal 3578 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 BaRvYY literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..634417a64034f28adeff6c7c3c5b29d0a2fb2908 GIT binary patch literal 3770 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 O>pytM>i)0$zdmieM{+&@ literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..c89a4abd0e7daace668cc1a0b61de43fff99bf6e GIT binary patch literal 5030 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 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..bf191eb8171c41c8f46e66be48b647099254f843 GIT binary patch literal 4246 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 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..0a5390f963768a0a39cfa58f6d30e1d0d199509e GIT binary patch literal 7718 zcmV+>9@*hiNk&E<9smGWMM6+kP&iBy9smF@kH8}kO*n`oNs*%Au;Tm+Uig;~(fy^0V#l&1Gc3_Z4e+bvjN*%4G18^Jrn`S z@Z7iU_J`VTA=Br%uhw>(z1r3y8O~GFe|+Dta2rXIBIWall&0N@2cVOZh?052r*2H-U~TA)rulDTIuNj%bT1^_O=qd91LFo#aWmMwou zCtLx5$5#O7$5oO9w$S$$L4jHnSOj&>IT2YrvNb0?SOgf_1a#f!uPWS1k|eQ%bWA`2 z020H|BuNr)KqmlxxR^ncBqL7vdc5`f3xH>7Is@SIlODhsnABbZfV58(0KdP;q_4R@ zns^}q2Ec^^faqw@_ZE*500aP(0)Ryl5rD!4Hu7QsV9OSEy70mlwz|MZaX4rjNs?mz zu)BNiK@brW&|kv`_6M`d;q^#IkJ?y-8r=gu%K8#T@9u|2r=`s0g#H+_{Qrt1yZN20 z>H#raoDrEBMavsrF}{KKei*+2t^5$o%p_)MW-fNzp{B|_i>k`ZlT~Bb{mfLRJ25I@ zn;8WaDQM$gOugtZl^Ir7T;>xYmX28J5Vm97j=Qq7n(+m*|7J=vQ;A_^wrgRGpd?AM zY^(7&_W|lP*GT){A3g6RC2QN3x6So@|1YJ?j0@n_(}GssqYb39j+vQjOaK2pl&Ebp zBw24nWT{b&vDL=dwr%dNxwEypySuV&+qT=bRaQpC1X!B>e{mzH!D`tf%a+H?gJudd zGcz;OEtPkW8@+-Yb4rfP%#6dPVKT~+Nmlov|NU3HU%@xb=<2BY(v>3(&#G!c!PD}t zYk5y$TJF$|rb?xn(}tNzVdlH9VNN>CbmHhjL6U9LwpBIvKGw5st3|K7-?pu5{e!*M zlo+;=AR+P`^j|RiCMEy~ex$o9wGFTo*_Wv*oCM))ff1%xAn(L~6p?+7DxBm$0?n3s zga>n?KYz}ueSXky%z(jXQ8c10DQhI+KP8jTkHk;%YgE`0s5^Ne_95z7k>oK7sM>5M0S0uk~g?>cZcp?j%kML0QIeX`leaa;C+ zMI@oxV#oh6R^}_izZ{MYisYA=`NZm**YUykJ;GTrNOvlO@L21-$aVoa2dN^(qQ{4o zuEk=8MwF7!8qCXy!;7Gk+ik*EU8oGgEo?Bk5^@}5lNR^z8jHIAUq&1f#Gr54 zw;_DDDOqugb*Hi4gzO^kKfVWxee2=vNzCW=wLAnqC(CZ4cdEEm*P+}2_LKL2l(P78 z>)VsyBfC7v>Q34<;G}vy=6~~%t09*tx4u0)_5P1in&YbEn9tsCcLyak`sK8dBjj@+ zik)ml--AE>2})`g@I7vESQp)#wh7Xz3z6(_v8Ky=8_sO;`a1S}$6XRh8r^H_3PRn( z%8pkf@<)kTZrDqHX=myCV0iRz=LPoILRwg3S6m}$PqrNW+vf{-KOj0tE7reRWo8LK z?@{cU#!x@X|F3r;GYpagMSHJ2=YUqIMl3D) z4fpc+d&MI@&g}gx@Q9k+75sO3Ym&&c(rgHRJd1vS0`;)KA{LnwS@KYtEvKl4Xz^kM z4;1S6Xnu?sB+VkXWh)5)mSYx4rXku!8b9wv`FjQWM^3p7n{|Rk9#WeDeXG}T@+5}a z*?_b}bA=*zVg6%bgy$t@OPEDYK^ho_q2gLUzN>%r>sn!LfDORX673PG6QvYH_#tGV zy(}>2+)8CpP&2^ZzHhHTB8;o(C&1bxkD;EpX zuvOUxHaHL{SEo`FvJ6B^%JDgd0D!Azer+eb2fS@z$3i0%ga1X$cx?TX_j3jWcew4e zr3Ub`Yh&?m+&49t~~sh6DK5Z*a#es z;wKF!xof4mf|DZnh6A>~aDn93$}hZalXry^AP(7n=y3(CQH{tZ!9Zz=;37~$nGv>y z2V5DB7xoG^!F-I*7ml?eYUKaB>`#aMsbCAMrG4V=8R!Zxb%R@?PN@ z%A9aWaw5qhtT-JcsDL-kRqzT~0R&?}Z%8NaIc7rbs3e}L(Y$i70Wl13LQ}Z=9j3yR z^1sY+&_CLG8z1Dr-**dhkh>txdWv&0m@FNXG(jIIZ{>-?>G6?*XiPdtt(@;iv3}aI ztz$kBONljQ7=1tX56*`F=s>*Z^w z(!-VihfS7l?1iD&J%|4XU2(k`-HpXqHxY|{jg5FWGH}mZzn-C*?PhGm#9vHq^ z=a#c>`hF=XVKWiSMnWHRH_`owMhw*6&K~i~<^Y_WD&6tRA2#pNs%F}LmffI-(vw?e zrG-#QNi4)ntfV?I1*y6FzjFDi2D!UFF4lsTR2Qs$Jdj1l2L`-0&{|$vydMCx-})`P zI-#rKt8;a6fpcsV(^z==wTxa}6P@2^XmL%E(H%GYkdsQ1hiODH_2*|9T_!jF4KoZK zlC6ObBR_5nM| zrP3Ym?OV(T3e`DC`Gz zk5+frUUuv=K<&#>aebx6jXva}5_3PlNz%bksq#95~;n!$M%n zY;aO1f7Oq9kiv|+2WBijzRI7gynN1n0C1eY8(wo+2;o`mrtThi7m&@4?K>sE$x_gh zAc_Jff*y~7dX*3&L{=two4#)s6>elEy|1??=eU~XU$Q6<224MUHk)tng1pOSV+q29 zxMhl)A;b*31eTWR~yA%P36mFwTyIqU9xl7?N4~ zlSy%fHC6=F_sg`lSi7o^v~JZh3*2}V#3gsg7jIRHErsX~Xa0}tKp1k4mYT$XvgQ?> z9be)2Rgi7uh!Bl%AjLTrp*a<%LpDAqQjBG{XKE$z*v4kA=5W7$I@$v%+Odpa+|v6Y z$X~oC1r5(`J>SfK0Vy8H7Hq;3R-Ai$V-P}XA~NyK6^Am%JmbjgD1V*v(hx4 zN4mENrJ9FxI4R5t=@QTt(%u6iVKHv0umWypZ^B-8y?y6;=eHM>twe&*-P^p2FQCRB zzbxWf$z4`p)=JjcSzmtSRZd}!5II1j>;ev@>eIlD(&#l;mWp@v!FgLDnfJJcd=~ zl^TTFLA0#$@R>=Wzd@3F8(+&JE!+Ku)_+ z(nR5zgh9n)0`L=!kyPU!t$?ayF*wmLMG9|-cJxsx;*hz1)Hah`s5e4A5YM98sslox z(4)2*^L+uRLs_gzk!O3j6$+UHu-JU|3fBy-&KM5j&>GETpL%lY@II^ z7{M@X6;@yqCV#6o+)Ju?SpvNm}(;sGc*EiUfd2AatF38N}2jOeCmU(Pa)y{BowaUhc@2w zqj%hUmp{&i&1m4LkEplghnw~O7vmaFW-Yep=I;ICB~J3u=RV3Fd$K)dCpl*CVsp)6 zQn*WPFy*Gicx$GQDH8_|8V+;c>vADQM4>y^*IDqbVlsh5%TEm#6dMaK1~2^LFaE_8 zX;ZE_u_jfb882ry9>v4I(Ys--ktqCn=m^71V6f-zn~dDZze_A$Ald+__5z9_4;_>L~w@S5-h)JwBr?q+r4xtLKN+5hIQt5D;a^;Xhv6Mj0zObvB(qFv#$`{f_ z$Ihd%0Wb#q)pJnxjL-||6XkOM!3GytEZYN1^OLR|T<-%KJTiq&P~K=NjiwurTNjH) zNFZ9+f)G!?N}x+b;}=6|MH*MvipybcOYgU^x6sD$4-7U4YyK^WHCYNBq;&8t!*zKF z+>~fuMf!+khw{PUL~vlm@+Y6elnpXwGew8jf-6FsrHgkbPG3j=~1(LRraB=8@FE4yuuN0o^46F zD+=@Be$i^9IEW+C>tR#%-{q7&1t-JRL`HySdw5BTrH@WGo?0#&EeJR`xn&R(e3`Hs z$wG`~@i^rOpxeI95HOFHHZZK%>EVC4z!Y|DGDj=q?*y0*=*BYNlG!`Tg=l{HvZq7^ zHxRLEYo9Qs#6~;EPBxyx^N_ZzC06+541mc6b*Hm$z}1gC;ryd`-FD6mbgQHIYD)v( z7)e|@K~lv9%F)26d?WX|ufS{AvX#p*5gU4UPpqkCI^@)DW`cE6RMA@1%I^o|rB@4d z3$+SOSzDXHccxtx_R?z^;Lyo;Ph=Th8vlrQVo}f1{rDnmV#SYLGBQU;sM?5dmL#TyKkEdObwZ`dIc)kLmGql=HeIBT=>8^Wk7`Ix z{d$mdQCbry-!ahD2%DXAge6ET3Op;S_^6@llgcV7gi_&FC8tXt9RP%jTdFzMdo@D8 zD!i+KD~{quBgnwBQrI4THlfk{n?|IgB5nT{DRzUDAUDsCr7%S6N6_@HrH+3u<2-5V zGq`UM;eLGw{*Hf>AlC`WSNwBXTSEKzw`$>3a0QX0M)@av15>IRYYIB1>uy+Ug{Jf& zL<#M8!Vg@mazTM@yN|X1XU5gJr$NP9gX30e1v*~WgpheHT73#tpccp^Mh#tO;AqKI zvZXA915CRHHq_iwc&R|wi=#xF8zf8Bb|i2niT>=2MR_zcC`h(yA$L~8_!y5WeLRv- z<9vln34h^?qgeh{;9*)V{rvJHRIiB}NZ!#Q5UFRV?YwO-?0r|Y17WN23gKVr8ftx_ zI^OkLKhZQ)o#uaQ)N<$ug*F`~VW*sE5_mxMK%;-SV1w`{UTF@!>;<8zF$!8h8x=_^8tPq;MH1-c)_ z`Xh+LV?JscD%`2%nJ1rv^qRPGsDdIgq(%s_pQ^Wg!#zvuR_x&mCW&gj^lOP_&{Df& zm7{>phd!Ci{NuCbpHQX~pm)AoZ`Z##bOpCn8tchMwSMbnt8t?GDmG`KY1AF+Dw<>4 zBTsnIa1(dmJ4)tmd=%xtG@Mf4gye8)c#W8 zxsk#=>K)IZ!KH@r2}r`DD6_(yfIAkfeG!%8p|hL(_<3NotV9d|mCdZHwZ7OD2Xi2drI5Vtbr~2UH6Q4fPfrU%%DM8 zX)Iqa*aqMco}gJsxbVQbITV%3HFrEWtzh$=tLf4-E_9`ko_#4J@EO$KZ*^)0h!>&=KYh8?f00twEVKC;|`OJr1e-ZL1dzwo&vY zUr^eAh=qiR{f5a6YGE_53FaQ)K_?+yvy4VMGprSWn-yCbP>kU2!)wpVR@LoMIN+`a z0@>1ok*tUOS|Nah7}J;*S)z#~ZWr5f=Igc0qroyT!HdO14jU0 zIL8sRxfUS)jmM@lzqk^*6xcFwD@v191E?(o-sQ6Zk?7<91mNd-QdA?uyVuthCESWn z5r9jP0DQhqUUWyT`|U@I+H!{2N4$lfCCTsCg(XRi*&|7 z3&H*=aQA+enXfte=DfGaj$$&PO&vr`+jLY-ZZr|PE+}}ncsbO3NmPPygsPS zJpX;A*CP0dDwqO+MV*0N;reNqlzngB#rHO7cF|B+>Y3gv-BHUkeQ6{}i!BIu30Dkz zg?2uhAJ^Lsn*G^d12 zo>co<{AQfu96HHhT3I9$t7#PlNK0rq_8ESKd&;Y_sH#e(O@;!&{1~$^wy8Rc(;46S84V z3ZiLQJCJOIViKyVER<5I-zULlbQLOw-9~g|kI_oLPpK@v1QBd@CFs>|GfJZE)g2@V zJ5oaB7qAP|TkU(~ICPKou^q4uG^nQ!O;R|ah*WSy8fJr?<^(MAzq*ALerD3mI zz-&MOS45~RzLL`1AeyxQX-n*p1{JzNxW`gbVh#N(CM5HYRz%pLA|j!Ji>uODe{ASK zOBOKY0*X*cgXs!ziB1WNP}-?%`XEV z)9Z!64i{DL_4E3MjM08WK~&~roT$jKs2vc*;H)I18uMMl{zgoA0rOuV*{dp%jw983 z54(h;C$U>gIAYK?a!qEP`NxCxH7%5^vy34ozEHky*k75YV*w3E0he^ISB21dq*AG# z-vkFIF>S)AG23y1*_ea`Yl;y9RSN>O5KC_%9^&a;$lLSx`os*ip92SR8b~cK_kyr% zDpg=gO|X{G+}3|T8cHEq;_7P-F5TG9Bn@k;F|vS zzkWim3eq){%_<&_DzV#|>6RNTB^%gUD{CW4BK&tZ0t3{Jq3Af5p%ptAjy*?9)=b9I z6wfd7d^>M%G_KJf_}S%ef5H=%dqLP`g%p9Ee}apg0$*;Xyk@M8&RANTBE!^`NHMU; zFeD+OPp*=@E4er%$DSPh)C&@ZtTxBmu9tSNp4@ku}2!!*=OTYID5S&KV7f zZ3GzkoS%Kn^=8~fh8e+~{V}}_>7KU_8d4&15RUdSf4#iC4BV;` zc5#t%Ql5F{WOA=F;V2)-DTJz0y~U~Hw^m=xraXa(t=ia94Uz^O0!8Fm{8_k|h-E# z2!Y*Ssor~EmcA@Y@4c$`o=RZ|K_rAwRaK~}5JC{jK7gcBRn>d1Et*M6%MgNu5JW^M g+?Ohqs?=sGn}yO$5ekL-WF@I2sU(FYg`}{f0S|+@CIA2c literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..b8e72301e0f7b7f4efaf60a6eb7fee52662a62c9 GIT binary patch literal 5854 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 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..dae95ed873f77c0e88a56b5880539a0d0741908e GIT binary patch literal 8314 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 E01HmZuK)l5 literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/nym-vpn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..e16ef0b03fa9704ca00bb07a75ff2866d3cbd07b GIT binary patch literal 10402 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 M72vGu^g0t40MXOiGynhq literal 0 HcmV?d00001 diff --git a/nym-vpn/android/app/src/main/res/values/colors.xml b/nym-vpn/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000000..d035176a0b --- /dev/null +++ b/nym-vpn/android/app/src/main/res/values/colors.xml @@ -0,0 +1,11 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF1c1b20 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/values/ic_banner_background.xml b/nym-vpn/android/app/src/main/res/values/ic_banner_background.xml new file mode 100644 index 0000000000..5274b8a4f3 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/values/ic_banner_background.xml @@ -0,0 +1,4 @@ + + + #121212 + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml b/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000000..9c1cd0cc32 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #1C1B20 + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/values/strings.xml b/nym-vpn/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000000..2c1d791d4d --- /dev/null +++ b/nym-vpn/android/app/src/main/res/values/strings.xml @@ -0,0 +1,90 @@ + + NymConnect + tunnelConfig + VPN Channel + VPN Notification Channel + Watcher Channel + Watcher Notification Channel + FOREGROUND_FILE + https://github.com/nymtech/nym + https://github.com/nymtech/nym + File is not a .conf file + Turn off tunnel before editing + No tunnels added yet! + Tunnel name already exists + https://discord.com/invite/nym + Watcher Service + Monitoring network state changes + VPN Connected + Connected to tunnel - + VPN permission is required for the app to work properly. If this permission is not launching, please disable \"Always-on VPN\" in your phone settings for the official WireGuard mobile app and try again. + Notifications permission is required for the app to work properly. + Open Settings + Add Trusted SSID + Trusted SSID + Tunnels + Select Tunnel + Enable auto tunneling + Tunnel on mobile data + \"Allow all the time\" location permission is required for retrieving Wi-Fi SSID in the background. Permission is needed for this feature. + Location permission is required for this feature to work properly. + At least one tunnel required to use this feature + "Retry" + View Privacy Policy + Okay + This feature requires background location permission to enable Wi-Fi SSID monitoring even while the application is closed. For more details, please see the Privacy Policy linked on the Support screen. + Background Location Disclosure + TODO + Enter SSID + Submit SSID + [Interface] + Add tunnel from files + File Open + Tunnel Edit + Tunnel Name + Edit + Delete + Add Tunnel + Exclude + Include + Tunnel all applications + Configuration changes saved. + Save changes + Icon + No thanks + Turn on + Map + Bad config. Please try again. + Interface + Public key + Waiting for the Barcode UI module to be downloaded. + Barcode module downloading. Try again. + Addresses + DNS servers + MTU + Peer + Allowed IPs + Endpoint + Transfer + Last handshake + Name + Restart Tunnel + VPN Connection Failed + Failed connection to - + Attempting to connect to server after 30 seconds of no response. + Attempting to reconnect to server after more than one minute of no response. + Enable Always-On VPN support + Please select a tunnel first + Unable to detect Location Services which are required for this feature. Please enable Location Services. + Check again + Detecting Location Services disabled + This feature requires precise location to access Wi-Fi SSID name. Please enable precise location here or in the app settings. + Request + Toggle VPN + No tunnels available + Search packages + Clear Icon + Search Icon + Attempting connection.. + VPN Starting + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/values/themes.xml b/nym-vpn/android/app/src/main/res/values/themes.xml new file mode 100644 index 0000000000..9414a536e4 --- /dev/null +++ b/nym-vpn/android/app/src/main/res/values/themes.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/xml/backup_rules.xml b/nym-vpn/android/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000000..fa0f996d2c --- /dev/null +++ b/nym-vpn/android/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/main/res/xml/data_extraction_rules.xml b/nym-vpn/android/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000000..9ee9997b0b --- /dev/null +++ b/nym-vpn/android/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/nym-vpn/android/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt b/nym-vpn/android/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt new file mode 100644 index 0000000000..c3453e018c --- /dev/null +++ b/nym-vpn/android/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package net.nymtech.nymconnect + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/nym-vpn/android/build.gradle.kts b/nym-vpn/android/build.gradle.kts new file mode 100644 index 0000000000..09b1978ecb --- /dev/null +++ b/nym-vpn/android/build.gradle.kts @@ -0,0 +1,19 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + val objectBoxVersion by extra("3.5.1") + val hiltVersion by extra("2.47") + val accompanistVersion by extra("0.31.2-alpha") + + dependencies { + classpath("io.objectbox:objectbox-gradle-plugin:$objectBoxVersion") + classpath("com.google.gms:google-services:4.3.15") + } +} + +plugins { + id("com.android.application") version "8.2.0-beta01" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false + id("com.google.dagger.hilt.android") version "2.44" apply false + kotlin("plugin.serialization") version "1.8.22" apply false +} diff --git a/nym-vpn/android/gradle.properties b/nym-vpn/android/gradle.properties new file mode 100644 index 0000000000..1023be831f --- /dev/null +++ b/nym-vpn/android/gradle.properties @@ -0,0 +1,25 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true +#enable buildconfig values +android.defaults.buildfeatures.buildconfig=true \ No newline at end of file diff --git a/nym-vpn/android/gradle/wrapper/gradle-wrapper.jar b/nym-vpn/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

    V=O5h_1e9zGmb@Rp{DW_$kH3AW6J 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 z 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

  • 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