From b668fb379853f0c94e8e777c9556a34a82afb1fa Mon Sep 17 00:00:00 2001 From: baichuan3 Date: Thu, 27 Jun 2024 18:28:35 +0800 Subject: [PATCH 1/5] migrate metrics v2 --- Cargo.lock | 52 +- Cargo.toml | 22 +- moveos/metrics_v2/Cargo.toml | 29 + moveos/metrics_v2/src/closure_metric.rs | 141 +++ moveos/metrics_v2/src/guards.rs | 53 ++ moveos/metrics_v2/src/histogram.rs | 421 +++++++++ moveos/metrics_v2/src/lib.rs | 414 +++++++++ moveos/metrics_v2/src/metered_channel.rs | 373 ++++++++ moveos/metrics_v2/src/monitored_mpsc.rs | 857 ++++++++++++++++++ moveos/metrics_v2/src/tests/mod.rs | 6 + .../src/tests/test_closure_metric.rs | 40 + .../src/tests/test_metered_channel.rs | 205 +++++ .../src/tests/test_registry_service.rs | 89 ++ 13 files changed, 2689 insertions(+), 13 deletions(-) create mode 100644 moveos/metrics_v2/Cargo.toml create mode 100644 moveos/metrics_v2/src/closure_metric.rs create mode 100644 moveos/metrics_v2/src/guards.rs create mode 100644 moveos/metrics_v2/src/histogram.rs create mode 100644 moveos/metrics_v2/src/lib.rs create mode 100644 moveos/metrics_v2/src/metered_channel.rs create mode 100644 moveos/metrics_v2/src/monitored_mpsc.rs create mode 100644 moveos/metrics_v2/src/tests/mod.rs create mode 100644 moveos/metrics_v2/src/tests/test_closure_metric.rs create mode 100644 moveos/metrics_v2/src/tests/test_metered_channel.rs create mode 100644 moveos/metrics_v2/src/tests/test_registry_service.rs diff --git a/Cargo.lock b/Cargo.lock index 1a4f4ea754..47d35bf5b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1470,7 +1470,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" dependencies = [ "memchr", - "regex-automata", + "regex-automata 0.4.6", "serde 1.0.203", ] @@ -4492,7 +4492,7 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata", + "regex-automata 0.4.6", "regex-syntax 0.8.3", ] @@ -5086,7 +5086,7 @@ dependencies = [ "globset", "log", "memchr", - "regex-automata", + "regex-automata 0.4.6", "same-file", "walkdir", "winapi-util", @@ -5812,7 +5812,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex-automata", + "regex-automata 0.4.6", ] [[package]] @@ -6053,6 +6053,15 @@ dependencies = [ "libc", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matchit" version = "0.7.3" @@ -9228,10 +9237,19 @@ checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", - "regex-automata", + "regex-automata 0.4.6", "regex-syntax 0.8.3", ] +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + [[package]] name = "regex-automata" version = "0.4.6" @@ -9243,6 +9261,12 @@ dependencies = [ "regex-syntax 0.8.3", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.7.5" @@ -13007,13 +13031,12 @@ dependencies = [ ] [[package]] -name = "tracing-log" -version = "0.2.0" +name = "tracing-serde" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" dependencies = [ - "log", - "once_cell", + "serde 1.0.203", "tracing-core", ] @@ -13023,12 +13046,19 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ + "matchers", "nu-ansi-term", + "once_cell", + "regex", + "serde 1.0.203", + "serde_json", "sharded-slab", "smallvec 1.13.2", "thread_local", + "time", + "tracing", "tracing-core", - "tracing-log", + "tracing-serde", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 19383c65f7..94d95efbc9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -200,8 +200,19 @@ tiny-keccak = { version = "2", features = ["keccak", "sha3"] } tiny-bip39 = "1.0.0" tokio = { version = "1.38.0", features = ["full"] } tonic = { version = "0.8", features = ["gzip"] } -tracing = "0.1" -tracing-subscriber = "0.3" +tracing = "0.1.37" +tracing-appender = "0.2.2" +tracing-subscriber = { version = "0.3.15", default-features = false, features = [ + "std", + "smallvec", + "fmt", + "ansi", + "time", + "json", + "registry", + "env-filter", +] } + codespan-reporting = "0.11.1" codespan = "0.11.1" termcolor = "1.1.2" @@ -217,6 +228,10 @@ regex = "1.10.5" walkdir = "2.3.3" rocksdb = { version = "0.22.0", features = ["snappy", "lz4", "zstd", "zlib"], default-features = false } prometheus = "0.13.3" +prometheus-http-query = { version = "0.6.6", default_features = false, features = [ + "rustls-tls", +] } +prometheus-parse = { git = "https://github.com/asonnino/prometheus-parser.git", rev = "75334db" } coarsetime = "0.1.22" hyper = { version = "0.14.12", features = ["full"] } http = "0.2.6" @@ -302,6 +317,9 @@ revm-precompile = "7.0.0" revm-primitives = "4.0.0" ord = "0.18.5" sled = { version = "0.34.7" } +scopeguard = "1.1" +uuid = { version = "1.1.2", features = ["v4", "fast-rng"] } +protobuf = { version = "2.28", features = ["with-bytes"] } # Note: the BEGIN and END comments below are required for external tooling. Do not remove. # BEGIN MOVE DEPENDENCIES diff --git a/moveos/metrics_v2/Cargo.toml b/moveos/metrics_v2/Cargo.toml new file mode 100644 index 0000000000..de60758024 --- /dev/null +++ b/moveos/metrics_v2/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "metrics" + +# Workspace inherited keys +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[dependencies] +axum = { workspace = true } +tracing = { workspace = true } +scopeguard = { workspace = true } +prometheus = { workspace = true } +once_cell = { workspace = true } +tap = { workspace = true } +tokio = { workspace = true } +dashmap = { workspace = true } +uuid = { workspace = true } +parking_lot = { workspace = true } +futures = { workspace = true } +async-trait = { workspace = true } +anyhow = { workspace = true } +protobuf = { workspace = true } \ No newline at end of file diff --git a/moveos/metrics_v2/src/closure_metric.rs b/moveos/metrics_v2/src/closure_metric.rs new file mode 100644 index 0000000000..77b36b0fb6 --- /dev/null +++ b/moveos/metrics_v2/src/closure_metric.rs @@ -0,0 +1,141 @@ +// Copyright (c) RoochNetwork +// SPDX-License-Identifier: Apache-2.0 + +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +// Copyright 2014 The Prometheus Authors +// Copyright 2019 TiKV Project Authors. Licensed under Apache-2.0. + +//! This library implements a `ClosureMetric` for crate `prometheus` whose value is computed at +//! the time of collection by a provided closure. + +// TODO: add example usage once constructor macros are implemented. +// (For now, look at tests for an example.) + +use anyhow::anyhow; +use anyhow::Result; +use prometheus::core; +use prometheus::proto; + +/// A Prometheus metric whose value is computed at collection time by the provided closure. +/// +/// WARNING: The provided closure must be fast (~milliseconds or faster), since it blocks +/// metric collection. +#[derive(Debug)] +pub struct ClosureMetric { + desc: core::Desc, + f: F, + value_type: ValueType, + label_pairs: Vec, +} + +impl ClosureMetric +where + F: Fn() -> T + Sync + Send, + T: core::Number, +{ + pub fn new( + describer: D, + value_type: ValueType, + f: F, + label_values: &[&str], + ) -> Result { + let desc = describer.describe()?; + let label_pairs = make_label_pairs(&desc, label_values)?; + + Ok(Self { + desc, + f, + value_type, + label_pairs, + }) + } + + pub fn metric(&self) -> proto::Metric { + let mut m = proto::Metric::default(); + m.set_label(protobuf::RepeatedField::from_vec(self.label_pairs.clone())); + + let val = (self.f)().into_f64(); + match self.value_type { + ValueType::Counter => { + let mut counter = proto::Counter::default(); + counter.set_value(val); + m.set_counter(counter); + } + ValueType::Gauge => { + let mut gauge = proto::Gauge::default(); + gauge.set_value(val); + m.set_gauge(gauge); + } + } + + m + } +} + +impl prometheus::core::Collector for ClosureMetric +where + F: Fn() -> T + Sync + Send, + T: core::Number, +{ + fn desc(&self) -> Vec<&prometheus::core::Desc> { + vec![&self.desc] + } + + fn collect(&self) -> Vec { + let mut m = proto::MetricFamily::default(); + m.set_name(self.desc.fq_name.clone()); + m.set_help(self.desc.help.clone()); + m.set_field_type(self.value_type.metric_type()); + m.set_metric(protobuf::RepeatedField::from_vec(vec![self.metric()])); + vec![m] + } +} + +#[derive(Debug, Clone, Copy)] +pub enum ValueType { + Counter, + Gauge, +} + +impl ValueType { + /// `metric_type` returns the corresponding proto metric type. + pub fn metric_type(self) -> proto::MetricType { + match self { + ValueType::Counter => proto::MetricType::COUNTER, + ValueType::Gauge => proto::MetricType::GAUGE, + } + } +} + +pub fn make_label_pairs(desc: &core::Desc, label_values: &[&str]) -> Result> { + if desc.variable_labels.len() != label_values.len() { + return Err(anyhow!("inconsistent cardinality")); + } + + let total_len = desc.variable_labels.len() + desc.const_label_pairs.len(); + if total_len == 0 { + return Ok(vec![]); + } + + if desc.variable_labels.is_empty() { + return Ok(desc.const_label_pairs.clone()); + } + + let mut label_pairs = Vec::with_capacity(total_len); + for (i, n) in desc.variable_labels.iter().enumerate() { + let mut label_pair = proto::LabelPair::default(); + label_pair.set_name(n.clone()); + label_pair.set_value(label_values[i].to_owned()); + label_pairs.push(label_pair); + } + + for label_pair in &desc.const_label_pairs { + label_pairs.push(label_pair.clone()); + } + label_pairs.sort(); + Ok(label_pairs) +} + +// TODO: add and test macros for easier ClosureMetric construction. diff --git a/moveos/metrics_v2/src/guards.rs b/moveos/metrics_v2/src/guards.rs new file mode 100644 index 0000000000..74d388de1f --- /dev/null +++ b/moveos/metrics_v2/src/guards.rs @@ -0,0 +1,53 @@ +// Copyright (c) RoochNetwork +// SPDX-License-Identifier: Apache-2.0 + +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +use prometheus::IntGauge; +use std::future::Future; +use std::pin::Pin; +use std::task::{Context, Poll}; + +/// Increments gauge when acquired, decrements when guard drops +pub struct GaugeGuard<'a>(&'a IntGauge); + +impl<'a> GaugeGuard<'a> { + pub fn acquire(g: &'a IntGauge) -> Self { + g.inc(); + Self(g) + } +} + +impl<'a> Drop for GaugeGuard<'a> { + fn drop(&mut self) { + self.0.dec(); + } +} + +pub trait GaugeGuardFutureExt: Future + Sized { + /// Count number of in flight futures running + fn count_in_flight(self, g: &IntGauge) -> GaugeGuardFuture; +} + +impl GaugeGuardFutureExt for F { + fn count_in_flight(self, g: &IntGauge) -> GaugeGuardFuture { + GaugeGuardFuture { + f: Box::pin(self), + _guard: GaugeGuard::acquire(g), + } + } +} + +pub struct GaugeGuardFuture<'a, F: Sized> { + f: Pin>, + _guard: GaugeGuard<'a>, +} + +impl<'a, F: Future> Future for GaugeGuardFuture<'a, F> { + type Output = F::Output; + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + self.f.as_mut().poll(cx) + } +} diff --git a/moveos/metrics_v2/src/histogram.rs b/moveos/metrics_v2/src/histogram.rs new file mode 100644 index 0000000000..ec0a7894cf --- /dev/null +++ b/moveos/metrics_v2/src/histogram.rs @@ -0,0 +1,421 @@ +// Copyright (c) RoochNetwork +// SPDX-License-Identifier: Apache-2.0 + +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +use crate::monitored_scope; +use futures::FutureExt; +use parking_lot::Mutex; +use prometheus::{ + register_int_counter_vec_with_registry, register_int_gauge_vec_with_registry, IntCounterVec, + IntGaugeVec, Registry, +}; +use std::collections::hash_map::DefaultHasher; +use std::collections::{HashMap, HashSet}; +use std::hash::{Hash, Hasher}; +use std::sync::Arc; +use std::time::Duration; +use tokio::runtime::Handle; +use tokio::sync::mpsc; +use tokio::sync::mpsc::error::TrySendError; +use tokio::time::Instant; +use tracing::{debug, error}; + +type Point = u64; +type HistogramMessage = (HistogramLabels, Point); + +#[derive(Clone)] +pub struct Histogram { + labels: HistogramLabels, + channel: mpsc::Sender, +} + +pub struct HistogramTimerGuard<'a> { + histogram: &'a Histogram, + start: Instant, +} + +#[derive(Clone)] +pub struct HistogramVec { + channel: mpsc::Sender, +} + +struct HistogramCollector { + reporter: Arc>, + channel: mpsc::Receiver, + _name: String, +} + +struct HistogramReporter { + gauge: IntGaugeVec, + sum: IntCounterVec, + count: IntCounterVec, + known_labels: HashSet, + percentiles: Vec, +} + +type HistogramLabels = Arc; + +struct HistogramLabelsInner { + labels: Vec, + hash: u64, +} + +/// Reports the histogram to the given prometheus gauge. +/// Unlike the histogram from prometheus crate, this histogram does not require to specify buckets +/// It works by calculating 'true' histogram by aggregating and sorting values. +/// +/// The values are reported into prometheus gauge with requested labels and additional dimension +/// for the histogram percentile. +/// +/// It worth pointing out that due to those more precise calculations, this Histogram usage +/// is somewhat more limited comparing to original prometheus Histogram. +/// +/// On the bright side, this histogram exports less data to Prometheus comparing to prometheus::Histogram, +/// it exports each requested percentile into separate prometheus gauge, while original implementation creates +/// gauge per bucket. +/// It also exports _sum and _count aggregates same as original implementation. +/// +/// It is ok to measure timings for things like network latencies and expensive crypto operations. +/// However as a rule of thumb this histogram should not be used in places that can produce very high data point count. +/// +/// As a last round of defence this histogram emits error log when too much data is flowing in and drops data points. +/// +/// This implementation puts great deal of effort to make sure the metric does not cause any harm to the code itself: +/// * Reporting data point is a non-blocking send to a channel +/// * Data point collections tries to clear the channel as fast as possible +/// * Expensive histogram calculations are done in a separate blocking tokio thread pool to avoid effects on main scheduler +/// * If histogram data is produced too fast, the data is dropped and error! log is emitted +impl HistogramVec { + pub fn new_in_registry(name: &str, desc: &str, labels: &[&str], registry: &Registry) -> Self { + Self::new_in_registry_with_percentiles( + name, + desc, + labels, + registry, + vec![500usize, 950, 990], + ) + } + + /// Allows to specify percentiles in 1/1000th, e.g. 90pct is specified as 900 + pub fn new_in_registry_with_percentiles( + name: &str, + desc: &str, + labels: &[&str], + registry: &Registry, + percentiles: Vec, + ) -> Self { + let sum_name = format!("{}_sum", name); + let count_name = format!("{}_count", name); + let sum = + register_int_counter_vec_with_registry!(sum_name, desc, labels, registry).unwrap(); + let count = + register_int_counter_vec_with_registry!(count_name, desc, labels, registry).unwrap(); + let labels: Vec<_> = labels.iter().cloned().chain(["pct"]).collect(); + let gauge = register_int_gauge_vec_with_registry!(name, desc, &labels, registry).unwrap(); + Self::new(gauge, sum, count, percentiles, name) + } + + // Do not expose it to public interface because we need labels to have a specific format (e.g. add last label is "pct") + fn new( + gauge: IntGaugeVec, + sum: IntCounterVec, + count: IntCounterVec, + percentiles: Vec, + name: &str, + ) -> Self { + let (sender, receiver) = mpsc::channel(1000); + let reporter = HistogramReporter { + gauge, + sum, + count, + percentiles, + known_labels: Default::default(), + }; + let reporter = Arc::new(Mutex::new(reporter)); + let collector = HistogramCollector { + reporter, + channel: receiver, + _name: name.to_string(), + }; + Handle::current().spawn(collector.run()); + Self { channel: sender } + } + + pub fn with_label_values(&self, labels: &[&str]) -> Histogram { + let labels = labels.iter().map(ToString::to_string).collect(); + let labels = HistogramLabelsInner::new(labels); + Histogram { + labels, + channel: self.channel.clone(), + } + } +} + +impl HistogramLabelsInner { + pub fn new(labels: Vec) -> HistogramLabels { + // Not a crypto hash + let mut hasher = DefaultHasher::new(); + labels.hash(&mut hasher); + let hash = hasher.finish(); + Arc::new(Self { labels, hash }) + } +} + +impl PartialEq for HistogramLabelsInner { + fn eq(&self, other: &Self) -> bool { + self.hash == other.hash + } +} + +impl Eq for HistogramLabelsInner {} + +impl Hash for HistogramLabelsInner { + fn hash(&self, state: &mut H) { + self.hash.hash(state) + } +} + +impl Histogram { + pub fn new_in_registry(name: &str, desc: &str, registry: &Registry) -> Self { + HistogramVec::new_in_registry(name, desc, &[], registry).with_label_values(&[]) + } + + pub fn observe(&self, v: Point) { + self.report(v) + } + + pub fn report(&self, v: Point) { + match self.channel.try_send((self.labels.clone(), v)) { + Ok(()) => {} + Err(TrySendError::Closed(_)) => { + // can happen during runtime shutdown + } + Err(TrySendError::Full(_)) => debug!("Histogram channel is full, dropping data"), + } + } + + pub fn start_timer(&self) -> HistogramTimerGuard { + HistogramTimerGuard { + histogram: self, + start: Instant::now(), + } + } +} + +impl HistogramCollector { + pub async fn run(mut self) { + let mut deadline = Instant::now(); + loop { + // We calculate deadline here instead of just using sleep inside cycle to avoid accumulating error + #[cfg(test)] + const HISTOGRAM_WINDOW_SEC: u64 = 1; + #[cfg(not(test))] + const HISTOGRAM_WINDOW_SEC: u64 = 60; + deadline += Duration::from_secs(HISTOGRAM_WINDOW_SEC); + if self.cycle(deadline).await.is_err() { + return; + } + } + } + + async fn cycle(&mut self, deadline: Instant) -> Result<(), ()> { + let mut labeled_data: HashMap> = HashMap::new(); + let mut count = 0usize; + let mut timeout = tokio::time::sleep_until(deadline).boxed(); + const MAX_POINTS: usize = 500_000; + loop { + tokio::select! { + _ = &mut timeout => break, + point = self.channel.recv() => { + count += 1; + if count > MAX_POINTS { + continue; + } + if let Some((label, point)) = point { + let values = labeled_data.entry(label).or_default(); + values.push(point); + } else { + // Histogram no longer exists + return Err(()); + } + }, + } + } + if count > MAX_POINTS { + error!( + "Too many data points for histogram, dropping {} points", + count - MAX_POINTS + ); + } + if Arc::strong_count(&self.reporter) != 1 { + #[cfg(not(debug_assertions))] + error!("Histogram data overflow - we receive histogram data for {} faster then can process. Some histogram data is dropped", self._name); + } else { + let reporter = self.reporter.clone(); + Handle::current().spawn_blocking(move || reporter.lock().report(labeled_data)); + } + Ok(()) + } +} + +impl HistogramReporter { + pub fn report(&mut self, labeled_data: HashMap>) { + let _scope = monitored_scope("HistogramReporter::report"); + let mut reset_labels = self.known_labels.clone(); + for (label, mut data) in labeled_data { + self.known_labels.insert(label.clone()); + reset_labels.remove(&label); + assert!(!data.is_empty()); + data.sort_unstable(); + for pct1000 in self.percentiles.iter() { + let index = Self::pct1000_index(data.len(), *pct1000); + let point = *data.get(index).unwrap(); + let pct_str = Self::format_pct1000(*pct1000); + let labels = Self::gauge_labels(&label, &pct_str); + let metric = self.gauge.with_label_values(&labels); + metric.set(point as i64); + } + let mut sum = 0u64; + let count = data.len() as u64; + for point in data { + sum += point; + } + let labels: Vec<_> = label.labels.iter().map(|s| &s[..]).collect(); + self.sum.with_label_values(&labels).inc_by(sum); + self.count.with_label_values(&labels).inc_by(count); + } + + for reset_label in reset_labels { + for pct1000 in self.percentiles.iter() { + let pct_str = Self::format_pct1000(*pct1000); + let labels = Self::gauge_labels(&reset_label, &pct_str); + let metric = self.gauge.with_label_values(&labels); + metric.set(0); + } + } + } + + fn gauge_labels<'a>(label: &'a HistogramLabels, pct_str: &'a str) -> Vec<&'a str> { + let labels = label.labels.iter().map(|s| &s[..]).chain([pct_str]); + labels.collect() + } + + /// Returns value in range [0; len) + fn pct1000_index(len: usize, pct1000: usize) -> usize { + len * pct1000 / 1000 + } + + fn format_pct1000(pct1000: usize) -> String { + format!("{}", (pct1000 as f64) / 10.) + } +} + +impl<'a> Drop for HistogramTimerGuard<'a> { + fn drop(&mut self) { + self.histogram + .report(self.start.elapsed().as_millis() as u64); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use prometheus::proto::MetricFamily; + + #[test] + fn pct_index_test() { + assert_eq!(200, HistogramReporter::pct1000_index(1000, 200)); + assert_eq!(100, HistogramReporter::pct1000_index(500, 200)); + assert_eq!(1800, HistogramReporter::pct1000_index(2000, 900)); + // Boundary checks + assert_eq!(21, HistogramReporter::pct1000_index(22, 999)); + assert_eq!(0, HistogramReporter::pct1000_index(1, 999)); + assert_eq!(0, HistogramReporter::pct1000_index(1, 100)); + assert_eq!(0, HistogramReporter::pct1000_index(1, 1)); + } + + #[test] + fn format_pct1000_test() { + assert_eq!(HistogramReporter::format_pct1000(999), "99.9"); + assert_eq!(HistogramReporter::format_pct1000(990), "99"); + assert_eq!(HistogramReporter::format_pct1000(900), "90"); + } + + #[tokio::test] + async fn histogram_test() { + let registry = Registry::new(); + let histogram = HistogramVec::new_in_registry_with_percentiles( + "test", + "xx", + &["lab"], + ®istry, + vec![500, 900], + ); + let a = histogram.with_label_values(&["a"]); + let b = histogram.with_label_values(&["b"]); + a.report(1); + a.report(2); + a.report(3); + a.report(4); + b.report(10); + b.report(20); + b.report(30); + b.report(40); + tokio::time::sleep(Duration::from_millis(1500)).await; + let gather = registry.gather(); + let gather: HashMap<_, _> = gather + .into_iter() + .map(|f| (f.get_name().to_string(), f)) + .collect(); + let hist = gather.get("test").unwrap(); + let sum = gather.get("test_sum").unwrap(); + let count = gather.get("test_count").unwrap(); + let hist = aggregate_gauge_by_label(hist); + let sum = aggregate_counter_by_label(sum); + let count = aggregate_counter_by_label(count); + assert_eq!(Some(3.), hist.get("::a::50").cloned()); + assert_eq!(Some(4.), hist.get("::a::90").cloned()); + assert_eq!(Some(30.), hist.get("::b::50").cloned()); + assert_eq!(Some(40.), hist.get("::b::90").cloned()); + + assert_eq!(Some(10.), sum.get("::a").cloned()); + assert_eq!(Some(100.), sum.get("::b").cloned()); + + assert_eq!(Some(4.), count.get("::a").cloned()); + assert_eq!(Some(4.), count.get("::b").cloned()); + } + + fn aggregate_gauge_by_label(family: &MetricFamily) -> HashMap { + family + .get_metric() + .iter() + .map(|m| { + let value = m.get_gauge().get_value(); + let mut key = String::new(); + for label in m.get_label() { + key.push_str("::"); + key.push_str(label.get_value()); + } + (key, value) + }) + .collect() + } + + fn aggregate_counter_by_label(family: &MetricFamily) -> HashMap { + family + .get_metric() + .iter() + .map(|m| { + let value = m.get_counter().get_value(); + let mut key = String::new(); + for label in m.get_label() { + key.push_str("::"); + key.push_str(label.get_value()); + } + (key, value) + }) + .collect() + } +} diff --git a/moveos/metrics_v2/src/lib.rs b/moveos/metrics_v2/src/lib.rs new file mode 100644 index 0000000000..aabaebc6c3 --- /dev/null +++ b/moveos/metrics_v2/src/lib.rs @@ -0,0 +1,414 @@ +// Copyright (c) RoochNetwork +// SPDX-License-Identifier: Apache-2.0 + +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +use axum::{extract::Extension, http::StatusCode, routing::get, Router}; +use dashmap::DashMap; +use std::future::Future; +use std::net::SocketAddr; +use std::pin::Pin; +use std::sync::Arc; +use std::task::{Context, Poll}; +use std::time::Instant; + +use once_cell::sync::OnceCell; +use prometheus::{register_int_gauge_vec_with_registry, IntGaugeVec, Registry, TextEncoder}; +use tap::TapFallible; +use tracing::warn; + +pub use scopeguard; +use uuid::Uuid; + +pub mod closure_metric; +mod guards; +pub mod histogram; +pub mod metered_channel; +pub mod monitored_mpsc; +pub use guards::*; +#[cfg(test)] +mod tests; + +pub const TX_TYPE_SINGLE_WRITER_TX: &str = "single_writer"; +pub const TX_TYPE_SHARED_OBJ_TX: &str = "shared_object"; + +#[derive(Debug)] +pub struct Metrics { + pub tasks: IntGaugeVec, + pub futures: IntGaugeVec, + pub channel_inflight: IntGaugeVec, + pub channel_sent: IntGaugeVec, + pub channel_received: IntGaugeVec, + pub scope_iterations: IntGaugeVec, + pub scope_duration_ns: IntGaugeVec, + pub scope_entrance: IntGaugeVec, +} + +impl Metrics { + fn new(registry: &Registry) -> Self { + Self { + tasks: register_int_gauge_vec_with_registry!( + "monitored_tasks", + "Number of running tasks per callsite.", + &["callsite"], + registry, + ) + .unwrap(), + futures: register_int_gauge_vec_with_registry!( + "monitored_futures", + "Number of pending futures per callsite.", + &["callsite"], + registry, + ) + .unwrap(), + channel_inflight: register_int_gauge_vec_with_registry!( + "monitored_channel_inflight", + "Inflight items in channels.", + &["name"], + registry, + ) + .unwrap(), + channel_sent: register_int_gauge_vec_with_registry!( + "monitored_channel_sent", + "Sent items in channels.", + &["name"], + registry, + ) + .unwrap(), + channel_received: register_int_gauge_vec_with_registry!( + "monitored_channel_received", + "Received items in channels.", + &["name"], + registry, + ) + .unwrap(), + scope_entrance: register_int_gauge_vec_with_registry!( + "monitored_scope_entrance", + "Number of entrance in the scope.", + &["name"], + registry, + ) + .unwrap(), + scope_iterations: register_int_gauge_vec_with_registry!( + "monitored_scope_iterations", + "Total number of times where the monitored scope runs", + &["name"], + registry, + ) + .unwrap(), + scope_duration_ns: register_int_gauge_vec_with_registry!( + "monitored_scope_duration_ns", + "Total duration in nanosecs where the monitored scope is running", + &["name"], + registry, + ) + .unwrap(), + } + } +} + +static METRICS: OnceCell = OnceCell::new(); + +pub fn init_metrics(registry: &Registry) { + let _ = METRICS + .set(Metrics::new(registry)) + // this happens many times during tests + .tap_err(|_| warn!("init_metrics registry overwritten")); +} + +pub fn get_metrics() -> Option<&'static Metrics> { + METRICS.get() +} + +#[macro_export] +macro_rules! monitored_future { + ($fut: expr) => {{ + monitored_future!(futures, $fut, "", INFO, false) + }}; + + ($metric: ident, $fut: expr, $name: expr, $logging_level: ident, $logging_enabled: expr) => {{ + let location: &str = if $name.is_empty() { + concat!(file!(), ':', line!()) + } else { + concat!(file!(), ':', $name) + }; + + async move { + let metrics = mysten_metrics::get_metrics(); + + let _metrics_guard = if let Some(m) = metrics { + m.$metric.with_label_values(&[location]).inc(); + Some(mysten_metrics::scopeguard::guard(m, |metrics| { + m.$metric.with_label_values(&[location]).dec(); + })) + } else { + None + }; + let _logging_guard = if $logging_enabled { + Some(mysten_metrics::scopeguard::guard((), |_| { + tracing::event!( + tracing::Level::$logging_level, + "Future {} completed", + location + ); + })) + } else { + None + }; + + if $logging_enabled { + tracing::event!( + tracing::Level::$logging_level, + "Spawning future {}", + location + ); + } + + $fut.await + } + }}; +} + +#[macro_export] +macro_rules! spawn_monitored_task { + ($fut: expr) => { + tokio::task::spawn(mysten_metrics::monitored_future!( + tasks, $fut, "", INFO, false + )) + }; +} + +#[macro_export] +macro_rules! spawn_logged_monitored_task { + ($fut: expr) => { + tokio::task::spawn(mysten_metrics::monitored_future!( + tasks, $fut, "", INFO, true + )) + }; + + ($fut: expr, $name: expr) => { + tokio::task::spawn(mysten_metrics::monitored_future!( + tasks, $fut, $name, INFO, true + )) + }; + + ($fut: expr, $name: expr, $logging_level: ident) => { + tokio::task::spawn(mysten_metrics::monitored_future!( + tasks, + $fut, + $name, + $logging_level, + true + )) + }; +} + +pub struct MonitoredScopeGuard { + metrics: &'static Metrics, + name: &'static str, + timer: Instant, +} + +impl Drop for MonitoredScopeGuard { + fn drop(&mut self) { + self.metrics + .scope_duration_ns + .with_label_values(&[self.name]) + .add(self.timer.elapsed().as_nanos() as i64); + self.metrics + .scope_entrance + .with_label_values(&[self.name]) + .dec(); + } +} + +/// This function creates a named scoped object, that keeps track of +/// - the total iterations where the scope is called in the `monitored_scope_iterations` metric. +/// - and the total duration of the scope in the `monitored_scope_duration_ns` metric. +/// +/// The monitored scope should be single threaded, e.g. the scoped object encompass the lifetime of +/// a select loop or guarded by mutex. +/// Then the rate of `monitored_scope_duration_ns`, converted to the unit of sec / sec, would be +/// how full the single threaded scope is running. +pub fn monitored_scope(name: &'static str) -> Option { + let metrics = get_metrics(); + if let Some(m) = metrics { + m.scope_iterations.with_label_values(&[name]).inc(); + m.scope_entrance.with_label_values(&[name]).inc(); + Some(MonitoredScopeGuard { + metrics: m, + name, + timer: Instant::now(), + }) + } else { + None + } +} + +pub trait MonitoredFutureExt: Future + Sized { + fn in_monitored_scope(self, name: &'static str) -> MonitoredScopeFuture; +} + +impl MonitoredFutureExt for F { + fn in_monitored_scope(self, name: &'static str) -> MonitoredScopeFuture { + MonitoredScopeFuture { + f: Box::pin(self), + _scope: monitored_scope(name), + } + } +} + +pub struct MonitoredScopeFuture { + f: Pin>, + _scope: Option, +} + +impl Future for MonitoredScopeFuture { + type Output = F::Output; + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + self.f.as_mut().poll(cx) + } +} + +pub type RegistryID = Uuid; + +/// A service to manage the prometheus registries. This service allow us to create +/// a new Registry on demand and keep it accessible for processing/polling. +/// The service can be freely cloned/shared across threads. +#[derive(Clone)] +pub struct RegistryService { + // Holds a Registry that is supposed to be used + default_registry: Registry, + registries_by_id: Arc>, +} + +impl RegistryService { + // Creates a new registry service and also adds the main/default registry that is supposed to + // be preserved and never get removed + pub fn new(default_registry: Registry) -> Self { + Self { + default_registry, + registries_by_id: Arc::new(DashMap::new()), + } + } + + // Returns the default registry for the service that someone can use + // if they don't want to create a new one. + pub fn default_registry(&self) -> Registry { + self.default_registry.clone() + } + + // Adds a new registry to the service. The corresponding RegistryID is returned so can later be + // used for removing the Registry. Method panics if we try to insert a registry with the same id. + // As this can be quite serious for the operation of the node we don't want to accidentally + // swap an existing registry - we expected a removal to happen explicitly. + pub fn add(&self, registry: Registry) -> RegistryID { + let registry_id = Uuid::new_v4(); + if self + .registries_by_id + .insert(registry_id, registry) + .is_some() + { + panic!("Other Registry already detected for the same id {registry_id}"); + } + + registry_id + } + + // Removes the registry from the service. If Registry existed then this method returns true, + // otherwise false is returned instead. + pub fn remove(&self, registry_id: RegistryID) -> bool { + self.registries_by_id.remove(®istry_id).is_some() + } + + // Returns all the registries of the service + pub fn get_all(&self) -> Vec { + let mut registries: Vec = self + .registries_by_id + .iter() + .map(|r| r.value().clone()) + .collect(); + registries.push(self.default_registry.clone()); + + registries + } + + // Returns all the metric families from the registries that a service holds. + pub fn gather_all(&self) -> Vec { + self.get_all().iter().flat_map(|r| r.gather()).collect() + } +} + +/// Create a metric that measures the uptime from when this metric was constructed. +/// The metric is labeled with: +/// - 'process': the process type, differentiating between validator and fullnode +/// - 'version': binary version, generally be of the format: 'semver-gitrevision' +/// - 'chain_identifier': the identifier of the network which this process is part of +pub fn uptime_metric( + process: &str, + version: &'static str, + chain_identifier: &str, +) -> Box { + let opts = prometheus::opts!("uptime", "uptime of the node service in seconds") + .variable_label("process") + .variable_label("version") + .variable_label("chain_identifier"); + + let start_time = std::time::Instant::now(); + let uptime = move || start_time.elapsed().as_secs(); + let metric = closure_metric::ClosureMetric::new( + opts, + closure_metric::ValueType::Counter, + uptime, + &[process, version, chain_identifier], + ) + .unwrap(); + + Box::new(metric) +} + +pub const METRICS_ROUTE: &str = "/metrics"; + +// Creates a new http server that has as a sole purpose to expose +// and endpoint that prometheus agent can use to poll for the metrics. +// A RegistryService is returned that can be used to get access in prometheus Registries. +pub fn start_prometheus_server(addr: SocketAddr) -> RegistryService { + let registry = Registry::new(); + + let registry_service = RegistryService::new(registry); + + if cfg!(msim) { + // prometheus uses difficult-to-support features such as TcpSocket::from_raw_fd(), so we + // can't yet run it in the simulator. + warn!("not starting prometheus server in simulator"); + return registry_service; + } + + let app = Router::new() + .route(METRICS_ROUTE, get(metrics)) + .layer(Extension(registry_service.clone())); + + tokio::spawn(async move { + axum::Server::bind(&addr) + .serve(app.into_make_service()) + .await + .unwrap(); + }); + + registry_service +} + +pub async fn metrics( + Extension(registry_service): Extension, +) -> (StatusCode, String) { + let metrics_families = registry_service.gather_all(); + match TextEncoder.encode_to_string(&metrics_families) { + Ok(metrics) => (StatusCode::OK, metrics), + Err(error) => ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("unable to encode metrics: {error}"), + ), + } +} diff --git a/moveos/metrics_v2/src/metered_channel.rs b/moveos/metrics_v2/src/metered_channel.rs new file mode 100644 index 0000000000..43fa342065 --- /dev/null +++ b/moveos/metrics_v2/src/metered_channel.rs @@ -0,0 +1,373 @@ +// Copyright (c) RoochNetwork +// SPDX-License-Identifier: Apache-2.0 + +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 +#![allow(dead_code)] + +use async_trait::async_trait; +use std::future::Future; +// TODO: complete tests - This kinda sorta facades the whole tokio::mpsc::{Sender, Receiver}: without tests, this will be fragile to maintain. +use futures::{FutureExt, Stream, TryFutureExt}; +use prometheus::{IntCounter, IntGauge}; +use std::task::{Context, Poll}; +use tokio::sync::mpsc::{ + self, + error::{SendError, TryRecvError, TrySendError}, +}; + +/// An [`mpsc::Sender`] with an [`IntGauge`] +/// counting the number of currently queued items. +#[derive(Debug)] +pub struct Sender { + inner: mpsc::Sender, + gauge: IntGauge, +} + +impl Clone for Sender { + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + gauge: self.gauge.clone(), + } + } +} + +impl Sender { + pub fn downgrade(&self) -> WeakSender { + let sender = self.inner.downgrade(); + WeakSender { + inner: sender, + gauge: self.gauge.clone(), + } + } +} + +/// An [`mpsc::WeakSender`] with an [`IntGauge`] +/// counting the number of currently queued items. +#[derive(Debug)] +pub struct WeakSender { + inner: mpsc::WeakSender, + gauge: IntGauge, +} + +impl Clone for WeakSender { + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + gauge: self.gauge.clone(), + } + } +} + +impl WeakSender { + pub fn upgrade(&self) -> Option> { + self.inner.upgrade().map(|s| Sender { + inner: s, + gauge: self.gauge.clone(), + }) + } +} + +/// An [`mpsc::Receiver`] with an [`IntGauge`] +/// counting the number of currently queued items. +#[derive(Debug)] +pub struct Receiver { + inner: mpsc::Receiver, + gauge: IntGauge, + total: Option, +} + +impl Receiver { + /// Receives the next value for this receiver. + /// Decrements the gauge in case of a successful `recv`. + pub async fn recv(&mut self) -> Option { + self.inner + .recv() + .inspect(|opt| { + if opt.is_some() { + self.gauge.dec(); + if let Some(total_gauge) = &self.total { + total_gauge.inc(); + } + } + }) + .await + } + + /// Attempts to receive the next value for this receiver. + /// Decrements the gauge in case of a successful `try_recv`. + pub fn try_recv(&mut self) -> Result { + self.inner.try_recv().map(|val| { + self.gauge.dec(); + if let Some(total_gauge) = &self.total { + total_gauge.inc(); + } + val + }) + } + + pub fn blocking_recv(&mut self) -> Option { + self.inner.blocking_recv().map(|val| { + self.gauge.dec(); + if let Some(total_gauge) = &self.total { + total_gauge.inc(); + } + val + }) + } + + /// Closes the receiving half of a channel without dropping it. + pub fn close(&mut self) { + self.inner.close() + } + + /// Polls to receive the next message on this channel. + /// Decrements the gauge in case of a successful `poll_recv`. + pub fn poll_recv(&mut self, cx: &mut Context<'_>) -> Poll> { + match self.inner.poll_recv(cx) { + res @ Poll::Ready(Some(_)) => { + self.gauge.dec(); + if let Some(total_gauge) = &self.total { + total_gauge.inc(); + } + res + } + s => s, + } + } +} + +impl Unpin for Receiver {} + +/// A newtype for an `mpsc::Permit` which allows us to inject gauge accounting +/// in the case the permit is dropped w/o sending +pub struct Permit<'a, T> { + permit: Option>, + gauge_ref: &'a IntGauge, +} + +impl<'a, T> Permit<'a, T> { + pub fn new(permit: mpsc::Permit<'a, T>, gauge_ref: &'a IntGauge) -> Permit<'a, T> { + Permit { + permit: Some(permit), + gauge_ref, + } + } + + pub fn send(mut self, value: T) { + let sender = self.permit.take().expect("Permit invariant violated!"); + sender.send(value); + // skip the drop logic, see https://github.com/tokio-rs/tokio/blob/a66884a2fb80d1180451706f3c3e006a3fdcb036/tokio/src/sync/mpsc/bounded.rs#L1155-L1163 + std::mem::forget(self); + } +} + +impl<'a, T> Drop for Permit<'a, T> { + fn drop(&mut self) { + // in the case the permit is dropped without sending, we still want to decrease the occupancy of the channel + if self.permit.is_some() { + self.gauge_ref.dec(); + } + } +} + +impl Sender { + /// Sends a value, waiting until there is capacity. + /// Increments the gauge in case of a successful `send`. + pub async fn send(&self, value: T) -> Result<(), SendError> { + self.inner + .send(value) + .inspect_ok(|_| self.gauge.inc()) + .await + } + + /// Completes when the receiver has dropped. + pub async fn closed(&self) { + self.inner.closed().await + } + + /// Attempts to immediately send a message on this `Sender` + /// Increments the gauge in case of a successful `try_send`. + pub fn try_send(&self, message: T) -> Result<(), TrySendError> { + self.inner + .try_send(message) + // remove this unsightly hack once https://github.com/rust-lang/rust/issues/91345 is resolved + .map(|val| { + self.gauge.inc(); + val + }) + } + + // TODO: facade [`send_timeout`](tokio::mpsc::Sender::send_timeout) under the tokio feature flag "time" + // TODO: facade [`blocking_send`](tokio::mpsc::Sender::blocking_send) under the tokio feature flag "sync" + + /// Checks if the channel has been closed. This happens when the + /// [`Receiver`] is dropped, or when the [`Receiver::close`] method is + /// called. + pub fn is_closed(&self) -> bool { + self.inner.is_closed() + } + + /// Waits for channel capacity. Once capacity to send one message is + /// available, it is reserved for the caller. + /// Increments the gauge in case of a successful `reserve`. + pub async fn reserve(&self) -> Result, SendError<()>> { + self.inner + .reserve() + // remove this unsightly hack once https://github.com/rust-lang/rust/issues/91345 is resolved + .map(|val| { + val.map(|permit| { + self.gauge.inc(); + Permit::new(permit, &self.gauge) + }) + }) + .await + } + + /// Tries to acquire a slot in the channel without waiting for the slot to become + /// available. + /// Increments the gauge in case of a successful `try_reserve`. + pub fn try_reserve(&self) -> Result, TrySendError<()>> { + self.inner.try_reserve().map(|val| { + // remove this unsightly hack once https://github.com/rust-lang/rust/issues/91345 is resolved + self.gauge.inc(); + Permit::new(val, &self.gauge) + }) + } + + // TODO: consider exposing the _owned methods + + // Note: not exposing `same_channel`, as it is hard to implement with callers able to + // break the coupling between channel and gauge using `gauge`. + + /// Returns the current capacity of the channel. + pub fn capacity(&self) -> usize { + self.inner.capacity() + } + + // We're voluntarily not putting WeakSender under a facade. + + /// Returns a reference to the underlying gauge. + pub fn gauge(&self) -> &IntGauge { + &self.gauge + } +} + +//////////////////////////////// +/// Stream API Wrappers! +//////////////////////////////// + +/// A wrapper around [`crate::metered_channel::Receiver`] that implements [`Stream`]. +/// +#[derive(Debug)] +pub struct ReceiverStream { + inner: Receiver, +} + +impl ReceiverStream { + /// Create a new `ReceiverStream`. + pub fn new(recv: Receiver) -> Self { + Self { inner: recv } + } + + /// Get back the inner `Receiver`. + pub fn into_inner(self) -> Receiver { + self.inner + } + + /// Closes the receiving half of a channel without dropping it. + pub fn close(&mut self) { + self.inner.close() + } +} + +impl Stream for ReceiverStream { + type Item = T; + + fn poll_next( + mut self: std::pin::Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll> { + self.inner.poll_recv(cx) + } +} + +impl AsRef> for ReceiverStream { + fn as_ref(&self) -> &Receiver { + &self.inner + } +} + +impl AsMut> for ReceiverStream { + fn as_mut(&mut self) -> &mut Receiver { + &mut self.inner + } +} + +impl From> for ReceiverStream { + fn from(recv: Receiver) -> Self { + Self::new(recv) + } +} + +// TODO: facade PollSender +// TODO: add prom metrics reporting for gauge and migrate all existing use cases. + +//////////////////////////////////////////////////////////////// +/// Constructor +//////////////////////////////////////////////////////////////// + +/// Similar to `mpsc::channel`, `channel` creates a pair of `Sender` and `Receiver` +/// Deprecated: use `monitored_mpsc::channel` instead. +#[track_caller] +pub fn channel(size: usize, gauge: &IntGauge) -> (Sender, Receiver) { + gauge.set(0); + let (sender, receiver) = mpsc::channel(size); + ( + Sender { + inner: sender, + gauge: gauge.clone(), + }, + Receiver { + inner: receiver, + gauge: gauge.clone(), + total: None, + }, + ) +} + +/// Deprecated: use `monitored_mpsc::channel` instead. +#[track_caller] +pub fn channel_with_total( + size: usize, + gauge: &IntGauge, + total_gauge: &IntCounter, +) -> (Sender, Receiver) { + gauge.set(0); + let (sender, receiver) = mpsc::channel(size); + ( + Sender { + inner: sender, + gauge: gauge.clone(), + }, + Receiver { + inner: receiver, + gauge: gauge.clone(), + total: Some(total_gauge.clone()), + }, + ) +} + +#[async_trait] +pub trait WithPermit { + async fn with_permit(&self, f: F) -> Option<(Permit, F::Output)>; +} + +#[async_trait] +impl WithPermit for Sender { + async fn with_permit(&self, f: F) -> Option<(Permit, F::Output)> { + let permit = self.reserve().await.ok()?; + Some((permit, f.await)) + } +} diff --git a/moveos/metrics_v2/src/monitored_mpsc.rs b/moveos/metrics_v2/src/monitored_mpsc.rs new file mode 100644 index 0000000000..a894cea4bf --- /dev/null +++ b/moveos/metrics_v2/src/monitored_mpsc.rs @@ -0,0 +1,857 @@ +// Copyright (c) RoochNetwork +// SPDX-License-Identifier: Apache-2.0 + +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +//! Provides wrappers to tokio mpsc channels, with metrics on total items sent, received and inflight. + +use std::task::{Context, Poll}; + +use futures::{Future, TryFutureExt as _}; +use prometheus::IntGauge; +use tap::Tap; +use tokio::sync::mpsc::{ + self, + error::{SendError, TryRecvError, TrySendError}, +}; + +use crate::get_metrics; + +/// Wraps [`mpsc::Sender`] with gauges counting the sent and inflight items. +#[derive(Debug)] +pub struct Sender { + inner: mpsc::Sender, + inflight: Option, + sent: Option, +} + +impl Sender { + /// Sends a value, waiting until there is capacity. + /// Increments the gauge in case of a successful `send`. + pub async fn send(&self, value: T) -> Result<(), SendError> { + self.inner + .send(value) + .inspect_ok(|_| { + if let Some(inflight) = &self.inflight { + inflight.inc(); + } + if let Some(sent) = &self.sent { + sent.inc(); + } + }) + .await + } + + /// Completes when the receiver has dropped. + pub async fn closed(&self) { + self.inner.closed().await + } + + /// Attempts to immediately send a message on this `Sender` + /// Increments the gauge in case of a successful `try_send`. + pub fn try_send(&self, message: T) -> Result<(), TrySendError> { + self.inner + .try_send(message) + // TODO: switch to inspect() once the repo upgrades to Rust 1.76 or higher. + .map(|_| { + if let Some(inflight) = &self.inflight { + inflight.inc(); + } + if let Some(sent) = &self.sent { + sent.inc(); + } + }) + } + + // TODO: facade [`send_timeout`](tokio::mpsc::Sender::send_timeout) under the tokio feature flag "time" + // TODO: facade [`blocking_send`](tokio::mpsc::Sender::blocking_send) under the tokio feature flag "sync" + + /// Checks if the channel has been closed. This happens when the + /// [`Receiver`] is dropped, or when the [`Receiver::close`] method is + /// called. + pub fn is_closed(&self) -> bool { + self.inner.is_closed() + } + + /// Waits for channel capacity. Once capacity to send one message is + /// available, it is reserved for the caller. + /// Increments the gauge in case of a successful `reserve`. + pub async fn reserve(&self) -> Result, SendError<()>> { + self.inner.reserve().await.map(|permit| { + if let Some(inflight) = &self.inflight { + inflight.inc(); + } + Permit::new(permit, &self.inflight, &self.sent) + }) + } + + /// Tries to acquire a slot in the channel without waiting for the slot to become + /// available. + /// Increments the gauge in case of a successful `try_reserve`. + pub fn try_reserve(&self) -> Result, TrySendError<()>> { + self.inner.try_reserve().map(|val| { + if let Some(inflight) = &self.inflight { + inflight.inc(); + } + Permit::new(val, &self.inflight, &self.sent) + }) + } + + // TODO: consider exposing the _owned methods + + /// Returns the current capacity of the channel. + pub fn capacity(&self) -> usize { + self.inner.capacity() + } + + pub fn downgrade(&self) -> WeakSender { + let sender = self.inner.downgrade(); + WeakSender { + inner: sender, + inflight: self.inflight.clone(), + sent: self.sent.clone(), + } + } + + /// Returns a reference to the underlying inflight gauge. + #[cfg(test)] + fn inflight(&self) -> &IntGauge { + self.inflight + .as_ref() + .expect("Metrics should have initialized") + } + + /// Returns a reference to the underlying sent gauge. + #[cfg(test)] + fn sent(&self) -> &IntGauge { + self.sent.as_ref().expect("Metrics should have initialized") + } +} + +// Derive Clone manually to avoid the `T: Clone` bound +impl Clone for Sender { + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + inflight: self.inflight.clone(), + sent: self.sent.clone(), + } + } +} + +/// A newtype for an `mpsc::Permit` which allows us to inject gauge accounting +/// in the case the permit is dropped w/o sending +pub struct Permit<'a, T> { + permit: Option>, + inflight_ref: &'a Option, + sent_ref: &'a Option, +} + +impl<'a, T> Permit<'a, T> { + pub fn new( + permit: mpsc::Permit<'a, T>, + inflight_ref: &'a Option, + sent_ref: &'a Option, + ) -> Permit<'a, T> { + Permit { + permit: Some(permit), + inflight_ref, + sent_ref, + } + } + + pub fn send(mut self, value: T) { + let sender = self.permit.take().expect("Permit invariant violated!"); + sender.send(value); + if let Some(sent_ref) = self.sent_ref { + sent_ref.inc(); + } + // skip the drop logic, see https://github.com/tokio-rs/tokio/blob/a66884a2fb80d1180451706f3c3e006a3fdcb036/tokio/src/sync/mpsc/bounded.rs#L1155-L1163 + std::mem::forget(self); + } +} + +impl<'a, T> Drop for Permit<'a, T> { + fn drop(&mut self) { + // In the case the permit is dropped without sending, we still want to decrease the occupancy of the channel. + // Otherwise, receiver should be responsible for decreasing the inflight gauge. + if self.permit.is_some() { + if let Some(inflight_ref) = self.inflight_ref { + inflight_ref.dec(); + } + } + } +} + +#[async_trait::async_trait] +pub trait WithPermit { + async fn with_permit(&self, f: F) -> Option<(Permit, F::Output)> + where + T: 'static; +} + +#[async_trait::async_trait] +impl WithPermit for Sender { + async fn with_permit(&self, f: F) -> Option<(Permit, F::Output)> { + let permit = self.reserve().await.ok()?; + Some((permit, f.await)) + } +} + +/// Wraps [`mpsc::WeakSender`] with gauges counting the sent and inflight items. +#[derive(Debug)] +pub struct WeakSender { + inner: mpsc::WeakSender, + inflight: Option, + sent: Option, +} + +impl WeakSender { + pub fn upgrade(&self) -> Option> { + self.inner.upgrade().map(|s| Sender { + inner: s, + inflight: self.inflight.clone(), + sent: self.sent.clone(), + }) + } +} + +// Derive Clone manually to avoid the `T: Clone` bound +impl Clone for WeakSender { + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + inflight: self.inflight.clone(), + sent: self.sent.clone(), + } + } +} + +/// Wraps [`mpsc::Receiver`] with gauges counting the inflight and received items. +#[derive(Debug)] +pub struct Receiver { + inner: mpsc::Receiver, + inflight: Option, + received: Option, +} + +impl Receiver { + /// Receives the next value for this receiver. + /// Decrements the gauge in case of a successful `recv`. + pub async fn recv(&mut self) -> Option { + self.inner.recv().await.tap(|opt| { + if opt.is_some() { + if let Some(inflight) = &self.inflight { + inflight.dec(); + } + if let Some(received) = &self.received { + received.inc(); + } + } + }) + } + + /// Attempts to receive the next value for this receiver. + /// Decrements the gauge in case of a successful `try_recv`. + pub fn try_recv(&mut self) -> Result { + self.inner.try_recv().map(|val| { + if let Some(inflight) = &self.inflight { + inflight.dec(); + } + if let Some(received) = &self.received { + received.inc(); + } + val + }) + } + + pub fn blocking_recv(&mut self) -> Option { + self.inner.blocking_recv().map(|val| { + if let Some(inflight) = &self.inflight { + inflight.dec(); + } + if let Some(received) = &self.received { + received.inc(); + } + val + }) + } + + /// Closes the receiving half of a channel without dropping it. + pub fn close(&mut self) { + self.inner.close() + } + + /// Polls to receive the next message on this channel. + /// Decrements the gauge in case of a successful `poll_recv`. + pub fn poll_recv(&mut self, cx: &mut Context<'_>) -> Poll> { + match self.inner.poll_recv(cx) { + res @ Poll::Ready(Some(_)) => { + if let Some(inflight) = &self.inflight { + inflight.dec(); + } + if let Some(received) = &self.received { + received.inc(); + } + res + } + s => s, + } + } + + /// Returns a reference to the underlying received gauge. + #[cfg(test)] + fn received(&self) -> &IntGauge { + self.received + .as_ref() + .expect("Metrics should have initialized") + } +} + +impl Unpin for Receiver {} + +/// Wraps [`mpsc::channel()`] to create a pair of `Sender` and `Receiver` +pub fn channel(name: &str, size: usize) -> (Sender, Receiver) { + let metrics = get_metrics(); + let (sender, receiver) = mpsc::channel(size); + ( + Sender { + inner: sender, + inflight: metrics.map(|m| m.channel_inflight.with_label_values(&[name])), + sent: metrics.map(|m| m.channel_sent.with_label_values(&[name])), + }, + Receiver { + inner: receiver, + inflight: metrics.map(|m| m.channel_inflight.with_label_values(&[name])), + received: metrics.map(|m| m.channel_received.with_label_values(&[name])), + }, + ) +} + +/// Wraps [`mpsc::UnboundedSender`] with gauges counting the sent and inflight items. +#[derive(Debug)] +pub struct UnboundedSender { + inner: mpsc::UnboundedSender, + inflight: Option, + sent: Option, +} + +impl UnboundedSender { + /// Sends a value, waiting until there is capacity. + /// Increments the gauge in case of a successful `send`. + pub fn send(&self, value: T) -> Result<(), SendError> { + self.inner.send(value).map(|_| { + if let Some(inflight) = &self.inflight { + inflight.inc(); + } + if let Some(sent) = &self.sent { + sent.inc(); + } + }) + } + + /// Completes when the receiver has dropped. + pub async fn closed(&self) { + self.inner.closed().await + } + + /// Checks if the channel has been closed. This happens when the + /// [`Receiver`] is dropped, or when the [`Receiver::close`] method is + /// called. + pub fn is_closed(&self) -> bool { + self.inner.is_closed() + } + + pub fn downgrade(&self) -> WeakUnboundedSender { + let sender = self.inner.downgrade(); + WeakUnboundedSender { + inner: sender, + inflight: self.inflight.clone(), + sent: self.sent.clone(), + } + } + + /// Returns a reference to the underlying inflight gauge. + #[cfg(test)] + fn inflight(&self) -> &IntGauge { + self.inflight + .as_ref() + .expect("Metrics should have initialized") + } + + /// Returns a reference to the underlying sent gauge. + #[cfg(test)] + fn sent(&self) -> &IntGauge { + self.sent.as_ref().expect("Metrics should have initialized") + } +} + +// Derive Clone manually to avoid the `T: Clone` bound +impl Clone for UnboundedSender { + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + inflight: self.inflight.clone(), + sent: self.sent.clone(), + } + } +} + +/// Wraps [`mpsc::WeakUnboundedSender`] with gauges counting the sent and inflight items. +#[derive(Debug)] +pub struct WeakUnboundedSender { + inner: mpsc::WeakUnboundedSender, + inflight: Option, + sent: Option, +} + +impl WeakUnboundedSender { + pub fn upgrade(&self) -> Option> { + self.inner.upgrade().map(|s| UnboundedSender { + inner: s, + inflight: self.inflight.clone(), + sent: self.sent.clone(), + }) + } +} + +// Derive Clone manually to avoid the `T: Clone` bound +impl Clone for WeakUnboundedSender { + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + inflight: self.inflight.clone(), + sent: self.sent.clone(), + } + } +} + +/// Wraps [`mpsc::UnboundedReceiver`] with gauges counting the inflight and received items. +#[derive(Debug)] +pub struct UnboundedReceiver { + inner: mpsc::UnboundedReceiver, + inflight: Option, + received: Option, +} + +impl UnboundedReceiver { + /// Receives the next value for this receiver. + /// Decrements the gauge in case of a successful `recv`. + pub async fn recv(&mut self) -> Option { + self.inner.recv().await.tap(|opt| { + if opt.is_some() { + if let Some(inflight) = &self.inflight { + inflight.dec(); + } + if let Some(received) = &self.received { + received.inc(); + } + } + }) + } + + /// Attempts to receive the next value for this receiver. + /// Decrements the gauge in case of a successful `try_recv`. + pub fn try_recv(&mut self) -> Result { + self.inner.try_recv().map(|val| { + if let Some(inflight) = &self.inflight { + inflight.dec(); + } + if let Some(received) = &self.received { + received.inc(); + } + val + }) + } + + pub fn blocking_recv(&mut self) -> Option { + self.inner.blocking_recv().map(|val| { + if let Some(inflight) = &self.inflight { + inflight.dec(); + } + if let Some(received) = &self.received { + received.inc(); + } + val + }) + } + + /// Closes the receiving half of a channel without dropping it. + pub fn close(&mut self) { + self.inner.close() + } + + /// Polls to receive the next message on this channel. + /// Decrements the gauge in case of a successful `poll_recv`. + pub fn poll_recv(&mut self, cx: &mut Context<'_>) -> Poll> { + match self.inner.poll_recv(cx) { + res @ Poll::Ready(Some(_)) => { + if let Some(inflight) = &self.inflight { + inflight.dec(); + } + if let Some(received) = &self.received { + received.inc(); + } + res + } + s => s, + } + } + + /// Returns a reference to the underlying received gauge. + #[cfg(test)] + fn received(&self) -> &IntGauge { + self.received + .as_ref() + .expect("Metrics should have initialized") + } +} + +impl Unpin for UnboundedReceiver {} + +/// Wraps [`mpsc::unbounded_channel()`] to create a pair of `UnboundedSender` and `UnboundedReceiver` +pub fn unbounded_channel(name: &str) -> (UnboundedSender, UnboundedReceiver) { + let metrics = get_metrics(); + #[allow(clippy::disallowed_methods)] + let (sender, receiver) = mpsc::unbounded_channel(); + ( + UnboundedSender { + inner: sender, + inflight: metrics.map(|m| m.channel_inflight.with_label_values(&[name])), + sent: metrics.map(|m| m.channel_sent.with_label_values(&[name])), + }, + UnboundedReceiver { + inner: receiver, + inflight: metrics.map(|m| m.channel_inflight.with_label_values(&[name])), + received: metrics.map(|m| m.channel_received.with_label_values(&[name])), + }, + ) +} + +#[cfg(test)] +mod test { + use std::task::{Context, Poll}; + + use futures::{task::noop_waker, FutureExt as _}; + use prometheus::Registry; + use tokio::sync::mpsc::error::TrySendError; + + use crate::{ + init_metrics, + monitored_mpsc::{channel, unbounded_channel}, + }; + + #[tokio::test] + async fn test_bounded_send_and_receive() { + init_metrics(&Registry::new()); + let (tx, mut rx) = channel("test_bounded_send_and_receive", 8); + let inflight = tx.inflight(); + let sent = tx.sent(); + let received = rx.received().clone(); + + assert_eq!(inflight.get(), 0); + let item = 42; + tx.send(item).await.unwrap(); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 0); + + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + assert_eq!(inflight.get(), 0); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 1); + } + + #[tokio::test] + async fn test_try_send() { + init_metrics(&Registry::new()); + let (tx, mut rx) = channel("test_try_send", 1); + let inflight = tx.inflight(); + let sent = tx.sent(); + let received = rx.received().clone(); + + assert_eq!(inflight.get(), 0); + assert_eq!(sent.get(), 0); + assert_eq!(received.get(), 0); + + let item = 42; + tx.try_send(item).unwrap(); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 0); + + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + assert_eq!(inflight.get(), 0); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 1); + } + + #[tokio::test] + async fn test_try_send_full() { + init_metrics(&Registry::new()); + let (tx, mut rx) = channel("test_try_send_full", 2); + let inflight = tx.inflight(); + let sent = tx.sent(); + let received = rx.received().clone(); + + assert_eq!(inflight.get(), 0); + + let item = 42; + tx.try_send(item).unwrap(); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 0); + + tx.try_send(item).unwrap(); + assert_eq!(inflight.get(), 2); + assert_eq!(sent.get(), 2); + assert_eq!(received.get(), 0); + + if let Err(e) = tx.try_send(item) { + assert!(matches!(e, TrySendError::Full(_))); + } else { + panic!("Expect try_send return channel being full error"); + } + assert_eq!(inflight.get(), 2); + assert_eq!(sent.get(), 2); + assert_eq!(received.get(), 0); + + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 2); + assert_eq!(received.get(), 1); + + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + assert_eq!(inflight.get(), 0); + assert_eq!(sent.get(), 2); + assert_eq!(received.get(), 2); + } + + #[tokio::test] + async fn test_unbounded_send_and_receive() { + init_metrics(&Registry::new()); + let (tx, mut rx) = unbounded_channel("test_unbounded_send_and_receive"); + let inflight = tx.inflight(); + let sent = tx.sent(); + let received = rx.received().clone(); + + assert_eq!(inflight.get(), 0); + let item = 42; + tx.send(item).unwrap(); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 0); + + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + assert_eq!(inflight.get(), 0); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 1); + } + + #[tokio::test] + async fn test_empty_closed_channel() { + init_metrics(&Registry::new()); + let (tx, mut rx) = channel("test_empty_closed_channel", 8); + let inflight = tx.inflight(); + let received = rx.received().clone(); + + assert_eq!(inflight.get(), 0); + let item = 42; + tx.send(item).await.unwrap(); + assert_eq!(inflight.get(), 1); + assert_eq!(received.get(), 0); + + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + assert_eq!(inflight.get(), 0); + assert_eq!(received.get(), 1); + + // channel is empty + let res = rx.try_recv(); + assert!(res.is_err()); + assert_eq!(inflight.get(), 0); + assert_eq!(received.get(), 1); + + // channel is closed + rx.close(); + let res2 = rx.recv().now_or_never().unwrap(); + assert!(res2.is_none()); + assert_eq!(inflight.get(), 0); + assert_eq!(received.get(), 1); + } + + #[tokio::test] + async fn test_reserve() { + init_metrics(&Registry::new()); + let (tx, mut rx) = channel("test_reserve", 8); + let inflight = tx.inflight(); + let sent = tx.sent(); + let received = rx.received().clone(); + + assert_eq!(inflight.get(), 0); + + let permit = tx.reserve().await.unwrap(); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 0); + assert_eq!(received.get(), 0); + + let item = 42; + permit.send(item); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 0); + + let permit_2 = tx.reserve().await.unwrap(); + assert_eq!(inflight.get(), 2); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 0); + + drop(permit_2); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 0); + + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + + assert_eq!(inflight.get(), 0); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 1); + } + + #[tokio::test] + async fn test_reserve_and_drop() { + init_metrics(&Registry::new()); + let (tx, _rx) = channel::("test_reserve_and_drop", 8); + let inflight = tx.inflight(); + + assert_eq!(inflight.get(), 0); + + let permit = tx.reserve().await.unwrap(); + assert_eq!(inflight.get(), 1); + + drop(permit); + + assert_eq!(inflight.get(), 0); + } + + #[tokio::test] + async fn test_send_backpressure() { + init_metrics(&Registry::new()); + let waker = noop_waker(); + let mut cx = Context::from_waker(&waker); + + let (tx, mut rx) = channel("test_send_backpressure", 1); + let inflight = tx.inflight(); + let sent = tx.sent(); + let received = rx.received().clone(); + + assert_eq!(inflight.get(), 0); + + tx.send(1).await.unwrap(); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 0); + + // channel is full. send should be blocked. + let mut task = Box::pin(tx.send(2)); + assert!(matches!(task.poll_unpin(&mut cx), Poll::Pending)); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 0); + + let item = rx.recv().await.unwrap(); + assert_eq!(item, 1); + assert_eq!(inflight.get(), 0); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 1); + + assert!(task.now_or_never().is_some()); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 2); + assert_eq!(received.get(), 1); + } + + #[tokio::test] + async fn test_reserve_backpressure() { + init_metrics(&Registry::new()); + let waker = noop_waker(); + let mut cx = Context::from_waker(&waker); + + let (tx, mut rx) = channel("test_reserve_backpressure", 1); + let inflight = tx.inflight(); + let sent = tx.sent(); + let received = rx.received().clone(); + + assert_eq!(inflight.get(), 0); + + let permit = tx.reserve().await.unwrap(); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 0); + assert_eq!(received.get(), 0); + + let mut task = Box::pin(tx.send(2)); + assert!(matches!(task.poll_unpin(&mut cx), Poll::Pending)); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 0); + assert_eq!(received.get(), 0); + + permit.send(1); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 0); + + let item = rx.recv().await.unwrap(); + assert_eq!(item, 1); + assert_eq!(inflight.get(), 0); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 1); + + assert!(task.now_or_never().is_some()); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 2); + assert_eq!(received.get(), 1); + } + + #[tokio::test] + async fn test_send_backpressure_multi_senders() { + init_metrics(&Registry::new()); + let waker = noop_waker(); + let mut cx = Context::from_waker(&waker); + let (tx1, mut rx) = channel("test_send_backpressure_multi_senders", 1); + let inflight = tx1.inflight(); + let sent = tx1.sent(); + let received = rx.received().clone(); + + assert_eq!(inflight.get(), 0); + + tx1.send(1).await.unwrap(); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 0); + + let tx2 = tx1.clone(); + let mut task = Box::pin(tx2.send(2)); + assert!(matches!(task.poll_unpin(&mut cx), Poll::Pending)); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 0); + + let item = rx.recv().await.unwrap(); + assert_eq!(item, 1); + assert_eq!(inflight.get(), 0); + assert_eq!(sent.get(), 1); + assert_eq!(received.get(), 1); + + assert!(task.now_or_never().is_some()); + assert_eq!(inflight.get(), 1); + assert_eq!(sent.get(), 2); + assert_eq!(received.get(), 1); + } +} diff --git a/moveos/metrics_v2/src/tests/mod.rs b/moveos/metrics_v2/src/tests/mod.rs new file mode 100644 index 0000000000..830c8249c1 --- /dev/null +++ b/moveos/metrics_v2/src/tests/mod.rs @@ -0,0 +1,6 @@ +// Copyright (c) RoochNetwork +// SPDX-License-Identifier: Apache-2.0 + +mod test_closure_metric; +mod test_metered_channel; +mod test_registry_service; diff --git a/moveos/metrics_v2/src/tests/test_closure_metric.rs b/moveos/metrics_v2/src/tests/test_closure_metric.rs new file mode 100644 index 0000000000..67488a1a26 --- /dev/null +++ b/moveos/metrics_v2/src/tests/test_closure_metric.rs @@ -0,0 +1,40 @@ +// Copyright (c) RoochNetwork +// SPDX-License-Identifier: Apache-2.0 + +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +use crate::closure_metric; +use crate::closure_metric::ClosureMetric; + +#[test] +fn closure_metric_basic() { + let opts = + prometheus::opts!("my_closure_metric", "A test closure metric",).variable_label("my_label"); + + let fn_42 = || 42_u64; + let metric0 = ClosureMetric::new( + opts, + closure_metric::ValueType::Gauge, + fn_42, + &["forty_two"], + ) + .unwrap(); + + assert!(prometheus::default_registry() + .register(Box::new(metric0)) + .is_ok()); + + // Gather the metrics. + let metric_families = prometheus::default_registry().gather(); + assert_eq!(1, metric_families.len()); + let metric_family = &metric_families[0]; + assert_eq!("my_closure_metric", metric_family.get_name()); + let metric = metric_family.get_metric(); + assert_eq!(1, metric.len()); + assert_eq!(42.0, metric[0].get_gauge().get_value()); + let labels = metric[0].get_label(); + assert_eq!(1, labels.len()); + assert_eq!("my_label", labels[0].get_name()); + assert_eq!("forty_two", labels[0].get_value()); +} diff --git a/moveos/metrics_v2/src/tests/test_metered_channel.rs b/moveos/metrics_v2/src/tests/test_metered_channel.rs new file mode 100644 index 0000000000..98d4f758ff --- /dev/null +++ b/moveos/metrics_v2/src/tests/test_metered_channel.rs @@ -0,0 +1,205 @@ +// Copyright (c) RoochNetwork +// SPDX-License-Identifier: Apache-2.0 + +// Copyright (c) 2021, Facebook, Inc. and its affiliates +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 +use crate::metered_channel::{channel, channel_with_total}; +use futures::{ + task::{noop_waker, Context, Poll}, + FutureExt, +}; +use prometheus::{IntCounter, IntGauge}; +use tokio::sync::mpsc::error::TrySendError; + +#[tokio::test] +async fn test_send() { + let counter = IntGauge::new("TEST_COUNTER", "test").unwrap(); + let (tx, mut rx) = channel(8, &counter); + + assert_eq!(counter.get(), 0); + let item = 42; + tx.send(item).await.unwrap(); + assert_eq!(counter.get(), 1); + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + assert_eq!(counter.get(), 0); +} + +#[tokio::test] +async fn test_total() { + let counter = IntGauge::new("TEST_COUNTER", "test").unwrap(); + let counter_total = IntCounter::new("TEST_TOTAL", "test_total").unwrap(); + let (tx, mut rx) = channel_with_total(8, &counter, &counter_total); + + assert_eq!(counter.get(), 0); + let item = 42; + tx.send(item).await.unwrap(); + assert_eq!(counter.get(), 1); + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + assert_eq!(counter.get(), 0); + assert_eq!(counter_total.get(), 1); +} + +#[tokio::test] +async fn test_empty_closed_channel() { + let counter = IntGauge::new("TEST_COUNTER", "test").unwrap(); + let (tx, mut rx) = channel(8, &counter); + + assert_eq!(counter.get(), 0); + let item = 42; + tx.send(item).await.unwrap(); + assert_eq!(counter.get(), 1); + + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + assert_eq!(counter.get(), 0); + + // channel is empty + let res = rx.try_recv(); + assert!(res.is_err()); + assert_eq!(counter.get(), 0); + + // channel is closed + rx.close(); + let res2 = rx.recv().now_or_never().unwrap(); + assert!(res2.is_none()); + assert_eq!(counter.get(), 0); +} + +#[tokio::test] +async fn test_reserve() { + let counter = IntGauge::new("TEST_COUNTER", "test").unwrap(); + let (tx, mut rx) = channel(8, &counter); + + assert_eq!(counter.get(), 0); + let item = 42; + let permit = tx.reserve().await.unwrap(); + assert_eq!(counter.get(), 1); + + permit.send(item); + let received_item = rx.recv().await.unwrap(); + + assert_eq!(received_item, item); + assert_eq!(counter.get(), 0); +} + +#[tokio::test] +async fn test_reserve_and_drop() { + let counter = IntGauge::new("TEST_COUNTER", "test").unwrap(); + let (tx, _rx) = channel::(8, &counter); + + assert_eq!(counter.get(), 0); + + let permit = tx.reserve().await.unwrap(); + assert_eq!(counter.get(), 1); + + drop(permit); + + assert_eq!(counter.get(), 0); +} + +#[tokio::test] +async fn test_send_backpressure() { + let waker = noop_waker(); + let mut cx = Context::from_waker(&waker); + + let counter = IntGauge::new("TEST_COUNTER", "test").unwrap(); + let (tx, mut rx) = channel(1, &counter); + + assert_eq!(counter.get(), 0); + tx.send(1).await.unwrap(); + assert_eq!(counter.get(), 1); + + let mut task = Box::pin(tx.send(2)); + assert!(matches!(task.poll_unpin(&mut cx), Poll::Pending)); + let item = rx.recv().await.unwrap(); + assert_eq!(item, 1); + assert_eq!(counter.get(), 0); + assert!(task.now_or_never().is_some()); + assert_eq!(counter.get(), 1); +} + +#[tokio::test] +async fn test_reserve_backpressure() { + let waker = noop_waker(); + let mut cx = Context::from_waker(&waker); + + let counter = IntGauge::new("TEST_COUNTER", "test").unwrap(); + let (tx, mut rx) = channel(1, &counter); + + assert_eq!(counter.get(), 0); + let permit = tx.reserve().await.unwrap(); + assert_eq!(counter.get(), 1); + + let mut task = Box::pin(tx.send(2)); + assert!(matches!(task.poll_unpin(&mut cx), Poll::Pending)); + + permit.send(1); + let item = rx.recv().await.unwrap(); + assert_eq!(item, 1); + assert_eq!(counter.get(), 0); + assert!(task.now_or_never().is_some()); + assert_eq!(counter.get(), 1); +} + +#[tokio::test] +async fn test_send_backpressure_multi_senders() { + let waker = noop_waker(); + let mut cx = Context::from_waker(&waker); + let counter = IntGauge::new("TEST_COUNTER", "test").unwrap(); + let (tx1, mut rx) = channel(1, &counter); + + assert_eq!(counter.get(), 0); + tx1.send(1).await.unwrap(); + assert_eq!(counter.get(), 1); + + let tx2 = tx1; + let mut task = Box::pin(tx2.send(2)); + assert!(matches!(task.poll_unpin(&mut cx), Poll::Pending)); + let item = rx.recv().await.unwrap(); + assert_eq!(item, 1); + assert_eq!(counter.get(), 0); + assert!(task.now_or_never().is_some()); + assert_eq!(counter.get(), 1); +} + +#[tokio::test] +async fn test_try_send() { + let counter = IntGauge::new("TEST_COUNTER", "test").unwrap(); + let (tx, mut rx) = channel(1, &counter); + + assert_eq!(counter.get(), 0); + let item = 42; + tx.try_send(item).unwrap(); + assert_eq!(counter.get(), 1); + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + assert_eq!(counter.get(), 0); +} + +#[tokio::test] +async fn test_try_send_full() { + let counter = IntGauge::new("TEST_COUNTER", "test").unwrap(); + let (tx, mut rx) = channel(2, &counter); + + assert_eq!(counter.get(), 0); + let item = 42; + tx.try_send(item).unwrap(); + assert_eq!(counter.get(), 1); + tx.try_send(item).unwrap(); + assert_eq!(counter.get(), 2); + if let Err(e) = tx.try_send(item) { + assert!(matches!(e, TrySendError::Full(_))); + } else { + panic!("Expect try_send return channel being full error"); + } + + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + assert_eq!(counter.get(), 1); + let received_item = rx.recv().await.unwrap(); + assert_eq!(received_item, item); + assert_eq!(counter.get(), 0); +} diff --git a/moveos/metrics_v2/src/tests/test_registry_service.rs b/moveos/metrics_v2/src/tests/test_registry_service.rs new file mode 100644 index 0000000000..cc56830058 --- /dev/null +++ b/moveos/metrics_v2/src/tests/test_registry_service.rs @@ -0,0 +1,89 @@ +// Copyright (c) RoochNetwork +// SPDX-License-Identifier: Apache-2.0 + +use crate::RegistryService; +use prometheus::{IntCounter, Registry}; + +#[test] +fn registry_service() { + // GIVEN + let default_registry = Registry::new_custom(Some("default".to_string()), None).unwrap(); + + let registry_service = RegistryService::new(default_registry.clone()); + let default_counter = IntCounter::new("counter", "counter_desc").unwrap(); + default_counter.inc(); + default_registry + .register(Box::new(default_counter)) + .unwrap(); + + // AND add a metric to the default registry + + // AND a registry with one metric + let registry_1 = Registry::new_custom(Some("narwhal".to_string()), None).unwrap(); + registry_1 + .register(Box::new( + IntCounter::new("counter_1", "counter_1_desc").unwrap(), + )) + .unwrap(); + + // WHEN + let registry_1_id = registry_service.add(registry_1); + + // THEN + let mut metrics = registry_service.gather_all(); + metrics.sort_by(|m1, m2| Ord::cmp(m1.get_name(), m2.get_name())); + + assert_eq!(metrics.len(), 2); + + let metric_default = metrics.remove(0); + assert_eq!(metric_default.get_name(), "default_counter"); + assert_eq!(metric_default.get_help(), "counter_desc"); + + let metric_1 = metrics.remove(0); + assert_eq!(metric_1.get_name(), "narwhal_counter_1"); + assert_eq!(metric_1.get_help(), "counter_1_desc"); + + // AND add a second registry with a metric + let registry_2 = Registry::new_custom(Some("rooch".to_string()), None).unwrap(); + registry_2 + .register(Box::new( + IntCounter::new("counter_2", "counter_2_desc").unwrap(), + )) + .unwrap(); + let _registry_2_id = registry_service.add(registry_2); + + // THEN all the metrics should be returned + let mut metrics = registry_service.gather_all(); + metrics.sort_by(|m1, m2| Ord::cmp(m1.get_name(), m2.get_name())); + + assert_eq!(metrics.len(), 3); + + let metric_default = metrics.remove(0); + assert_eq!(metric_default.get_name(), "default_counter"); + assert_eq!(metric_default.get_help(), "counter_desc"); + + let metric_1 = metrics.remove(0); + assert_eq!(metric_1.get_name(), "narwhal_counter_1"); + assert_eq!(metric_1.get_help(), "counter_1_desc"); + + let metric_2 = metrics.remove(0); + assert_eq!(metric_2.get_name(), "rooch_counter_2"); + assert_eq!(metric_2.get_help(), "counter_2_desc"); + + // AND remove first registry + assert!(registry_service.remove(registry_1_id)); + + // THEN metrics should now not contain metric of registry_1 + let mut metrics = registry_service.gather_all(); + metrics.sort_by(|m1, m2| Ord::cmp(m1.get_name(), m2.get_name())); + + assert_eq!(metrics.len(), 2); + + let metric_default = metrics.remove(0); + assert_eq!(metric_default.get_name(), "default_counter"); + assert_eq!(metric_default.get_help(), "counter_desc"); + + let metric_1 = metrics.remove(0); + assert_eq!(metric_1.get_name(), "rooch_counter_2"); + assert_eq!(metric_1.get_help(), "counter_2_desc"); +} From a606c03f9a1f49306e901095f6e502bf54472207 Mon Sep 17 00:00:00 2001 From: baichuan3 Date: Fri, 5 Jul 2024 21:50:21 +0800 Subject: [PATCH 2/5] implements common metrics and raw store metrics --- Cargo.lock | 119 +- crates/rooch-db/src/lib.rs | 2 - .../rooch-store/src/accumulator_store/mod.rs | 4 +- crates/rooch-store/src/lib.rs | 30 +- crates/rooch-store/src/meta_store/mod.rs | 4 +- .../rooch-store/src/transaction_store/mod.rs | 6 +- .../rooch-types/src/framework/auth_payload.rs | 4 +- .../src/commands/indexer/commands/rebuild.rs | 4 +- .../src/commands/statedb/commands/import.rs | 4 +- .../src/commands/statedb/commands/mod.rs | 2 +- infra/rooch-portal/yarn.lock | 4322 +++++++++++++++++ moveos/metrics/Cargo.toml | 30 +- .../src/closure_metric.rs | 0 moveos/{metrics_v2 => metrics}/src/guards.rs | 0 .../{metrics_v2 => metrics}/src/histogram.rs | 0 moveos/metrics/src/json_encoder.rs | 79 - moveos/metrics/src/lib.rs | 609 ++- moveos/metrics/src/macros.rs | 35 - .../src/metered_channel.rs | 0 moveos/metrics/src/metric_server.rs | 93 - .../src/monitored_mpsc.rs | 0 moveos/metrics/src/op_counters.rs | 163 - moveos/metrics/src/process_collector.rs | 106 - moveos/metrics/src/tests.rs | 77 - .../{metrics_v2 => metrics}/src/tests/mod.rs | 0 .../src/tests/test_closure_metric.rs | 0 .../src/tests/test_metered_channel.rs | 0 .../src/tests/test_registry_service.rs | 0 moveos/metrics_v2/Cargo.toml | 29 - moveos/metrics_v2/src/lib.rs | 414 -- moveos/moveos-store/src/config_store/mod.rs | 6 +- moveos/moveos-store/src/event_store/mod.rs | 11 +- moveos/moveos-store/src/lib.rs | 38 +- moveos/moveos-store/src/state_store/mod.rs | 4 +- moveos/moveos-store/src/tests/test_store.rs | 39 +- .../moveos-store/src/transaction_store/mod.rs | 4 +- moveos/raw-store/Cargo.toml | 1 + moveos/raw-store/src/lib.rs | 438 +- moveos/raw-store/src/metrics.rs | 1107 ++++- moveos/raw-store/src/rocks/batch.rs | 12 + moveos/raw-store/src/rocks/mod.rs | 193 +- moveos/raw-store/src/store_macros.rs | 4 +- moveos/raw-store/src/traits.rs | 16 +- 43 files changed, 6292 insertions(+), 1717 deletions(-) create mode 100644 infra/rooch-portal/yarn.lock rename moveos/{metrics_v2 => metrics}/src/closure_metric.rs (100%) rename moveos/{metrics_v2 => metrics}/src/guards.rs (100%) rename moveos/{metrics_v2 => metrics}/src/histogram.rs (100%) delete mode 100644 moveos/metrics/src/json_encoder.rs delete mode 100644 moveos/metrics/src/macros.rs rename moveos/{metrics_v2 => metrics}/src/metered_channel.rs (100%) delete mode 100644 moveos/metrics/src/metric_server.rs rename moveos/{metrics_v2 => metrics}/src/monitored_mpsc.rs (100%) delete mode 100644 moveos/metrics/src/op_counters.rs delete mode 100644 moveos/metrics/src/process_collector.rs delete mode 100644 moveos/metrics/src/tests.rs rename moveos/{metrics_v2 => metrics}/src/tests/mod.rs (100%) rename moveos/{metrics_v2 => metrics}/src/tests/test_closure_metric.rs (100%) rename moveos/{metrics_v2 => metrics}/src/tests/test_metered_channel.rs (100%) rename moveos/{metrics_v2 => metrics}/src/tests/test_registry_service.rs (100%) delete mode 100644 moveos/metrics_v2/Cargo.toml delete mode 100644 moveos/metrics_v2/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 5fd80158b7..f6c0698b1d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2745,26 +2745,6 @@ dependencies = [ "syn 2.0.65", ] -[[package]] -name = "darwin-libproc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb90051930c9a0f09e585762152048e23ac74d20c10590ef7cf01c0343c3046" -dependencies = [ - "darwin-libproc-sys", - "libc", - "memchr", -] - -[[package]] -name = "darwin-libproc-sys" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57cebb5bde66eecdd30ddc4b9cd208238b15db4982ccc72db59d699ea10867c1" -dependencies = [ - "libc", -] - [[package]] name = "dashmap" version = "5.5.3" @@ -4604,25 +4584,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "h2" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.1.0", - "indexmap 2.2.6", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "half" version = "1.8.3" @@ -4908,7 +4869,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", + "h2", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -4931,7 +4892,6 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "httparse", @@ -5001,22 +4961,6 @@ dependencies = [ "tokio-native-tls", ] -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.3.1", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - [[package]] name = "hyper-util" version = "0.1.3" @@ -6143,13 +6087,19 @@ name = "metrics" version = "0.5.7" dependencies = [ "anyhow", + "async-trait", + "axum", + "dashmap", "futures", - "hyper 0.14.28", - "log", + "once_cell", + "parking_lot 0.12.3", "prometheus", - "psutil", - "serde_json", - "timeout-join-handler", + "protobuf", + "scopeguard", + "tap", + "tokio", + "tracing", + "uuid 1.9.1", ] [[package]] @@ -7306,17 +7256,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "nix" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", -] - [[package]] name = "nix" version = "0.26.4" @@ -8701,11 +8640,9 @@ dependencies = [ "cfg-if", "fnv", "lazy_static 1.5.0", - "libc", "memchr", "parking_lot 0.12.3", "protobuf", - "reqwest 0.12.4", "thiserror", ] @@ -8821,6 +8758,9 @@ name = "protobuf" version = "2.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" +dependencies = [ + "bytes", +] [[package]] name = "protobuf-codegen" @@ -8841,21 +8781,6 @@ dependencies = [ "protobuf-codegen", ] -[[package]] -name = "psutil" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e617cc9058daa5e1fe5a0d23ed745773a5ee354111dad1ec0235b0cc16b6730" -dependencies = [ - "cfg-if", - "darwin-libproc", - "mach2", - "nix 0.24.3", - "num_cpus", - "once_cell", - "thiserror", -] - [[package]] name = "ptr_meta" version = "0.1.4" @@ -9101,6 +9026,7 @@ dependencies = [ "rocksdb", "serde 1.0.203", "serde_bytes", + "tap", "tempfile", "thiserror", "tokio", @@ -9339,12 +9265,12 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.3.26", + "h2", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", "hyper-rustls 0.24.2", - "hyper-tls 0.5.0", + "hyper-tls", "ipnet", "js-sys", "log", @@ -9384,23 +9310,18 @@ checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" dependencies = [ "base64 0.22.1", "bytes", - "encoding_rs", - "futures-channel", "futures-core", "futures-util", - "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "http-body-util", "hyper 1.3.1", "hyper-rustls 0.26.0", - "hyper-tls 0.6.0", "hyper-util", "ipnet", "js-sys", "log", "mime", - "native-tls", "once_cell", "percent-encoding", "pin-project-lite", @@ -9411,9 +9332,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", - "tokio-native-tls", "tokio-rustls 0.25.0", "tokio-util", "tower-service", @@ -12892,7 +12811,7 @@ dependencies = [ "flate2", "futures-core", "futures-util", - "h2 0.3.26", + "h2", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", diff --git a/crates/rooch-db/src/lib.rs b/crates/rooch-db/src/lib.rs index 0b220dd399..f717507a5d 100644 --- a/crates/rooch-db/src/lib.rs +++ b/crates/rooch-db/src/lib.rs @@ -39,8 +39,6 @@ impl RoochDB { store_dir, column_families, config.rocksdb_config(), - //TODO collect metrics - None, )?); let moveos_store = MoveOSStore::new_with_instance(instance.clone())?; diff --git a/crates/rooch-store/src/accumulator_store/mod.rs b/crates/rooch-store/src/accumulator_store/mod.rs index 173570ee17..df13da184a 100644 --- a/crates/rooch-store/src/accumulator_store/mod.rs +++ b/crates/rooch-store/src/accumulator_store/mod.rs @@ -4,7 +4,7 @@ // Copyright (c) The Starcoin Core Contributors // SPDX-License-Identifier: Apache-2.0 -use crate::TX_ACCUMULATOR_NODE_PREFIX_NAME; +use crate::TX_ACCUMULATOR_NODE_COLUMN_FAMILY_NAME; use accumulator::{AccumulatorNode, AccumulatorTreeStore}; use anyhow::Result; use moveos_types::h256::H256; @@ -14,7 +14,7 @@ derive_store!( TransactionAccumulatorStore, H256, AccumulatorNode, - TX_ACCUMULATOR_NODE_PREFIX_NAME + TX_ACCUMULATOR_NODE_COLUMN_FAMILY_NAME ); #[derive(Clone)] diff --git a/crates/rooch-store/src/lib.rs b/crates/rooch-store/src/lib.rs index 5d0e7515ef..26f1e5a6cd 100644 --- a/crates/rooch-store/src/lib.rs +++ b/crates/rooch-store/src/lib.rs @@ -24,20 +24,21 @@ pub mod meta_store; mod tests; pub mod transaction_store; -// pub const DEFAULT_PREFIX_NAME: ColumnFamilyName = "default"; -pub const TRANSACTION_PREFIX_NAME: ColumnFamilyName = "transaction"; -pub const TX_SEQUENCE_INFO_MAPPING_PREFIX_NAME: ColumnFamilyName = "tx_sequence_info_mapping"; -pub const META_SEQUENCER_INFO_PREFIX_NAME: ColumnFamilyName = "meta_sequencer_info"; -pub const TX_ACCUMULATOR_NODE_PREFIX_NAME: ColumnFamilyName = "transaction_acc_node"; - -///db store use prefix_name vec to init -/// Please note that adding a prefix needs to be added in vec simultaneously, remember!! -static VEC_PREFIX_NAME: Lazy> = Lazy::new(|| { +// pub const DEFAULT_COLUMN_FAMILY_NAME: ColumnFamilyName = "default"; +pub const TRANSACTION_COLUMN_FAMILY_NAME: ColumnFamilyName = "transaction"; +pub const TX_SEQUENCE_INFO_MAPPING_COLUMN_FAMILY_NAME: ColumnFamilyName = + "tx_sequence_info_mapping"; +pub const META_SEQUENCER_INFO_COLUMN_FAMILY_NAME: ColumnFamilyName = "meta_sequencer_info"; +pub const TX_ACCUMULATOR_NODE_COLUMN_FAMILY_NAME: ColumnFamilyName = "transaction_acc_node"; + +///db store use cf_name vec to init +/// Please note that adding a column family needs to be added in vec simultaneously, remember!! +static VEC_COLUMN_FAMILY_NAME: Lazy> = Lazy::new(|| { vec![ - TRANSACTION_PREFIX_NAME, - TX_SEQUENCE_INFO_MAPPING_PREFIX_NAME, - META_SEQUENCER_INFO_PREFIX_NAME, - TX_ACCUMULATOR_NODE_PREFIX_NAME, + TRANSACTION_COLUMN_FAMILY_NAME, + TX_SEQUENCE_INFO_MAPPING_COLUMN_FAMILY_NAME, + META_SEQUENCER_INFO_COLUMN_FAMILY_NAME, + TX_ACCUMULATOR_NODE_COLUMN_FAMILY_NAME, ] }); @@ -46,7 +47,7 @@ pub struct StoreMeta {} impl StoreMeta { pub fn get_column_family_names() -> &'static [ColumnFamilyName] { - &VEC_PREFIX_NAME + &VEC_COLUMN_FAMILY_NAME } } @@ -63,7 +64,6 @@ impl RoochStore { db_path, StoreMeta::get_column_family_names().to_vec(), RocksdbConfig::default(), - None, )?); Self::new_with_instance(instance) } diff --git a/crates/rooch-store/src/meta_store/mod.rs b/crates/rooch-store/src/meta_store/mod.rs index cecf8488bb..485426db93 100644 --- a/crates/rooch-store/src/meta_store/mod.rs +++ b/crates/rooch-store/src/meta_store/mod.rs @@ -1,7 +1,7 @@ // Copyright (c) RoochNetwork // SPDX-License-Identifier: Apache-2.0 -use crate::META_SEQUENCER_INFO_PREFIX_NAME; +use crate::META_SEQUENCER_INFO_COLUMN_FAMILY_NAME; use anyhow::Result; use raw_store::{derive_store, CodecKVStore, StoreInstance}; use rooch_types::sequencer::SequencerInfo; @@ -13,7 +13,7 @@ derive_store!( SequencerInfoStore, String, SequencerInfo, - META_SEQUENCER_INFO_PREFIX_NAME + META_SEQUENCER_INFO_COLUMN_FAMILY_NAME ); pub trait MetaStore { diff --git a/crates/rooch-store/src/transaction_store/mod.rs b/crates/rooch-store/src/transaction_store/mod.rs index 3136bc9d9e..6d0b37fdb8 100644 --- a/crates/rooch-store/src/transaction_store/mod.rs +++ b/crates/rooch-store/src/transaction_store/mod.rs @@ -1,7 +1,7 @@ // Copyright (c) RoochNetwork // SPDX-License-Identifier: Apache-2.0 -use crate::{TRANSACTION_PREFIX_NAME, TX_SEQUENCE_INFO_MAPPING_PREFIX_NAME}; +use crate::{TRANSACTION_COLUMN_FAMILY_NAME, TX_SEQUENCE_INFO_MAPPING_COLUMN_FAMILY_NAME}; use anyhow::Result; use moveos_types::h256::H256; use raw_store::CodecKVStore; @@ -12,14 +12,14 @@ derive_store!( LedgerTransactionStore, H256, LedgerTransaction, - TRANSACTION_PREFIX_NAME + TRANSACTION_COLUMN_FAMILY_NAME ); derive_store!( TxSequenceInfoMappingStore, u64, H256, - TX_SEQUENCE_INFO_MAPPING_PREFIX_NAME + TX_SEQUENCE_INFO_MAPPING_COLUMN_FAMILY_NAME ); pub trait TransactionStore { diff --git a/crates/rooch-types/src/framework/auth_payload.rs b/crates/rooch-types/src/framework/auth_payload.rs index b5f07dba9d..4b99c4c728 100644 --- a/crates/rooch-types/src/framework/auth_payload.rs +++ b/crates/rooch-types/src/framework/auth_payload.rs @@ -20,7 +20,7 @@ use serde::{Deserialize, Serialize}; pub const MODULE_NAME: &IdentStr = ident_str!("auth_payload"); -const MESSAGE_INFO_PREFIX: &[u8] = b"\x18Bitcoin Signed Message:\n"; +const MESSAGE_INFO_COLUMN_FAMILY: &[u8] = b"\x18Bitcoin Signed Message:\n"; const MESSAGE_INFO: &[u8] = b"Rooch Transaction:\n"; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] @@ -36,7 +36,7 @@ impl SignData { let message_info = MESSAGE_INFO.to_vec(); // We simulate the format of the Bitcoin wallet, append the length of message info and tx hash to the prefix - let mut encode_message_prefix = MESSAGE_INFO_PREFIX.to_vec(); + let mut encode_message_prefix = MESSAGE_INFO_COLUMN_FAMILY.to_vec(); encode_message_prefix.push((message_info.len() + tx_hash_hex.len()) as u8); SignData { diff --git a/crates/rooch/src/commands/indexer/commands/rebuild.rs b/crates/rooch/src/commands/indexer/commands/rebuild.rs index 18039ee4ec..66d8f225bd 100644 --- a/crates/rooch/src/commands/indexer/commands/rebuild.rs +++ b/crates/rooch/src/commands/indexer/commands/rebuild.rs @@ -27,7 +27,7 @@ use rooch_types::rooch_network::RoochChainID; use crate::commands::indexer::commands::init_indexer; use crate::commands::statedb::commands::import::parse_state_data_from_csv_line; use crate::commands::statedb::commands::{ - GLOBAL_STATE_TYPE_OBJECT, GLOBAL_STATE_TYPE_PREFIX, GLOBAL_STATE_TYPE_ROOT, + GLOBAL_STATE_TYPE_COLUMN_FAMILY, GLOBAL_STATE_TYPE_OBJECT, GLOBAL_STATE_TYPE_ROOT, }; /// Rebuild indexer @@ -119,7 +119,7 @@ fn produce_updates( for line in csv_reader.by_ref().lines().take(batch_size) { let line = line?; - if line.starts_with(GLOBAL_STATE_TYPE_PREFIX) { + if line.starts_with(GLOBAL_STATE_TYPE_COLUMN_FAMILY) { let (c1, _c2) = parse_state_data_from_csv_line(&line)?; let state_type = c1; last_state_type = Some(state_type); diff --git a/crates/rooch/src/commands/statedb/commands/import.rs b/crates/rooch/src/commands/statedb/commands/import.rs index e94f460911..d83b891892 100644 --- a/crates/rooch/src/commands/statedb/commands/import.rs +++ b/crates/rooch/src/commands/statedb/commands/import.rs @@ -3,7 +3,7 @@ use crate::cli_types::WalletContextOptions; use crate::commands::statedb::commands::export::ExportID; -use crate::commands::statedb::commands::{GLOBAL_STATE_TYPE_PREFIX, GLOBAL_STATE_TYPE_ROOT}; +use crate::commands::statedb::commands::{GLOBAL_STATE_TYPE_COLUMN_FAMILY, GLOBAL_STATE_TYPE_ROOT}; use anyhow::{Error, Result}; use chrono::{DateTime, Local}; use clap::Parser; @@ -132,7 +132,7 @@ fn produce_updates( for line in csv_reader.by_ref().lines().take(batch_size) { let line = line?; - if line.starts_with(GLOBAL_STATE_TYPE_PREFIX) { + if line.starts_with(GLOBAL_STATE_TYPE_COLUMN_FAMILY) { // TODO check current statedb root state root if line.starts_with(GLOBAL_STATE_TYPE_ROOT) { break; diff --git a/crates/rooch/src/commands/statedb/commands/mod.rs b/crates/rooch/src/commands/statedb/commands/mod.rs index 65f83056af..8dacc55111 100644 --- a/crates/rooch/src/commands/statedb/commands/mod.rs +++ b/crates/rooch/src/commands/statedb/commands/mod.rs @@ -20,7 +20,7 @@ pub mod import; pub const BATCH_SIZE: usize = 5000; -pub const GLOBAL_STATE_TYPE_PREFIX: &str = "states"; +pub const GLOBAL_STATE_TYPE_COLUMN_FAMILY: &str = "states"; pub const GLOBAL_STATE_TYPE_ROOT: &str = "states_root"; pub const GLOBAL_STATE_TYPE_OBJECT: &str = "states_object"; pub const GLOBAL_STATE_TYPE_FIELD: &str = "states_field"; diff --git a/infra/rooch-portal/yarn.lock b/infra/rooch-portal/yarn.lock new file mode 100644 index 0000000000..910b3c1566 --- /dev/null +++ b/infra/rooch-portal/yarn.lock @@ -0,0 +1,4322 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + +"@babel/generator@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" + integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== + dependencies: + "@babel/types" "^7.24.7" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-environment-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-hoist-variables@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-module-imports@^7.16.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-split-export-declaration@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" + integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" + integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.1", "@babel/runtime@^7.3.1": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" + integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/traverse@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" + integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.24.7": + version "7.24.7" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" + integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== + dependencies: + "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + +"@emotion/babel-plugin@^11.10.6": + version "11.11.0" + resolved "https://registry.npmmirror.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" + +"@emotion/cache@11.10.5": + version "11.10.5" + resolved "https://registry.npmmirror.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" + integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== + dependencies: + "@emotion/memoize" "^0.8.0" + "@emotion/sheet" "^1.2.1" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + stylis "4.1.3" + +"@emotion/cache@^11.10.5": + version "11.11.0" + resolved "https://registry.npmmirror.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" + +"@emotion/hash@^0.9.0", "@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.npmmirror.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== + +"@emotion/memoize@^0.8.0", "@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.npmmirror.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/react@11.10.6": + version "11.10.6" + resolved "https://registry.npmmirror.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" + integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.6" + "@emotion/cache" "^11.10.5" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.1", "@emotion/serialize@^1.1.2": + version "1.1.4" + resolved "https://registry.npmmirror.com/@emotion/serialize/-/serialize-1.1.4.tgz#fc8f6d80c492cfa08801d544a05331d1cc7cd451" + integrity sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ== + dependencies: + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.1", "@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.npmmirror.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== + +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.1" + resolved "https://registry.npmmirror.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@emotion/utils@^1.2.0", "@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.npmmirror.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.0", "@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.npmmirror.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + +"@esbuild-plugins/node-globals-polyfill@^0.2.3": + version "0.2.3" + resolved "https://registry.npmmirror.com/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz#0e4497a2b53c9e9485e149bc92ddb228438d6bcf" + integrity sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw== + +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.11.0" + resolved "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.npmmirror.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@faker-js/faker@^8.4.1": + version "8.4.1" + resolved "https://registry.npmmirror.com/@faker-js/faker/-/faker-8.4.1.tgz#5d5e8aee8fce48f5e189bf730ebd1f758f491451" + integrity sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg== + +"@floating-ui/core@^1.6.0": + version "1.6.4" + resolved "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.4.tgz#0140cf5091c8dee602bff9da5ab330840ff91df6" + integrity sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA== + dependencies: + "@floating-ui/utils" "^0.2.4" + +"@floating-ui/dom@^1.0.0": + version "1.6.7" + resolved "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.7.tgz#85d22f731fcc5b209db504478fb1df5116a83015" + integrity sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng== + dependencies: + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.4" + +"@floating-ui/react-dom@^2.0.0": + version "2.1.1" + resolved "https://registry.npmmirror.com/@floating-ui/react-dom/-/react-dom-2.1.1.tgz#cca58b6b04fc92b4c39288252e285e0422291fb0" + integrity sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/utils@^0.2.4": + version "0.2.4" + resolved "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.4.tgz#1d459cee5031893a08a0e064c406ad2130cced7c" + integrity sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + 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" + +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@mysten/bcs@1.0.2": + version "1.0.2" + resolved "https://registry.npmmirror.com/@mysten/bcs/-/bcs-1.0.2.tgz#d24b051f1a0652d44f61d0a6d8b94f7351fdae1e" + integrity sha512-haHT0km/9yIIe8lwo8gDFxGLnoxfRF4WmEVCz4lDXbEVQRsZkF0zB97kukiwMjDuFBaGVUhrOMCLz6td8tSMaQ== + dependencies: + bs58 "^5.0.0" + +"@noble/curves@~1.4.0": + version "1.4.0" + resolved "https://registry.npmmirror.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" + integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/hashes@1.4.0", "@noble/hashes@^1.2.0", "@noble/hashes@~1.4.0": + version "1.4.0" + resolved "https://registry.npmmirror.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmmirror.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.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmmirror.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" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@radix-ui/number@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/number/-/number-1.1.0.tgz#1e95610461a09cdf8bb05c152e76ca1278d5da46" + integrity sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ== + +"@radix-ui/primitive@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.0.0.tgz#e1d8ef30b10ea10e69c76e896f608d9276352253" + integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/primitive@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" + integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== + +"@radix-ui/react-arrow@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz#744f388182d360b86285217e43b6c63633f39e7a" + integrity sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/react-aspect-ratio@^1.0.3": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.0.tgz#b646d044420a63046ad794db1efa3001c4be24ef" + integrity sha512-dP87DM/Y7jFlPgUZTlhx6FF5CEzOiaxp2rBCKlaXlpH5Ip/9Fg5zZ9lDOQ5o/MOfUlf36eak14zoWYpgcgGoOg== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/react-avatar@^1.0.4": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-avatar/-/react-avatar-1.1.0.tgz#457c81334c93f4608df15f081e7baa286558d6a2" + integrity sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA== + dependencies: + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-checkbox@^1.0.4": + version "1.1.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-checkbox/-/react-checkbox-1.1.1.tgz#a559c4303957d797acee99914480b755aa1f27d6" + integrity sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-previous" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" + +"@radix-ui/react-collection@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-collection/-/react-collection-1.1.0.tgz#f18af78e46454a2360d103c2251773028b7724ed" + integrity sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + +"@radix-ui/react-compose-refs@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz#37595b1f16ec7f228d698590e78eeed18ff218ae" + integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-compose-refs@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz#656432461fc8283d7b591dcf0d79152fae9ecc74" + integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== + +"@radix-ui/react-context@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.0.0.tgz#f38e30c5859a9fb5e9aa9a9da452ee3ed9e0aee0" + integrity sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-context@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" + integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== + +"@radix-ui/react-dialog@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz#997e97cb183bc90bd888b26b8e23a355ac9fe5f0" + integrity sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-dismissable-layer" "1.0.0" + "@radix-ui/react-focus-guards" "1.0.0" + "@radix-ui/react-focus-scope" "1.0.0" + "@radix-ui/react-id" "1.0.0" + "@radix-ui/react-portal" "1.0.0" + "@radix-ui/react-presence" "1.0.0" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-slot" "1.0.0" + "@radix-ui/react-use-controllable-state" "1.0.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.4" + +"@radix-ui/react-dialog@^1.0.5": + version "1.1.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz#4906507f7b4ad31e22d7dad69d9330c87c431d44" + integrity sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.0" + "@radix-ui/react-focus-guards" "1.1.0" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-portal" "1.1.1" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.7" + +"@radix-ui/react-direction@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz#a7d39855f4d077adc2a1922f9c353c5977a09cdc" + integrity sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg== + +"@radix-ui/react-dismissable-layer@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz#35b7826fa262fd84370faef310e627161dffa76b" + integrity sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-escape-keydown" "1.0.0" + +"@radix-ui/react-dismissable-layer@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz#2cd0a49a732372513733754e6032d3fb7988834e" + integrity sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-escape-keydown" "1.1.0" + +"@radix-ui/react-dropdown-menu@^2.0.6": + version "2.1.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz#3dc578488688250dbbe109d9ff2ca28a9bca27ec" + integrity sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-menu" "2.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-focus-guards@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz#339c1c69c41628c1a5e655f15f7020bf11aa01fa" + integrity sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-focus-guards@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz#8e9abb472a9a394f59a1b45f3dd26cfe3fc6da13" + integrity sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw== + +"@radix-ui/react-focus-scope@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz#95a0c1188276dc8933b1eac5f1cdb6471e01ade5" + integrity sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-use-callback-ref" "1.0.0" + +"@radix-ui/react-focus-scope@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz#ebe2891a298e0a33ad34daab2aad8dea31caf0b2" + integrity sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + +"@radix-ui/react-hover-card@^1.0.7": + version "1.1.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-hover-card/-/react-hover-card-1.1.1.tgz#2982a5a91c7ae5a98e0cacd845fbdfbfdcdab355" + integrity sha512-IwzAOP97hQpDADYVKrEEHUH/b2LA+9MgB0LgdmnbFO2u/3M5hmEofjjr2M6CyzUblaAqJdFm6B7oFtU72DPXrA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.1" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-icons@^1.3.0": + version "1.3.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-icons/-/react-icons-1.3.0.tgz#c61af8f323d87682c5ca76b856d60c2312dbcb69" + integrity sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw== + +"@radix-ui/react-id@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.0.0.tgz#8d43224910741870a45a8c9d092f25887bb6d11e" + integrity sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.0" + +"@radix-ui/react-id@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.1.0.tgz#de47339656594ad722eb87f94a6b25f9cffae0ed" + integrity sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-label@^2.0.2": + version "2.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-label/-/react-label-2.1.0.tgz#3aa2418d70bb242be37c51ff5e51a2adcbc372e3" + integrity sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/react-menu@2.1.1": + version "2.1.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-menu/-/react-menu-2.1.1.tgz#bd623ace0e1ae1ac78023a505fec0541d59fb346" + integrity sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.0" + "@radix-ui/react-focus-guards" "1.1.0" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.1" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-roving-focus" "1.1.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.7" + +"@radix-ui/react-popover@^1.0.7": + version "1.1.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-popover/-/react-popover-1.1.1.tgz#604b783cdb3494ed4f16a58c17f0e81e61ab7775" + integrity sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.0" + "@radix-ui/react-focus-guards" "1.1.0" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.1" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.7" + +"@radix-ui/react-popper@1.2.0": + version "1.2.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-popper/-/react-popper-1.2.0.tgz#a3e500193d144fe2d8f5d5e60e393d64111f2a7a" + integrity sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg== + dependencies: + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-rect" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/rect" "1.1.0" + +"@radix-ui/react-portal@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.0.0.tgz#7220b66743394fabb50c55cb32381395cc4a276b" + integrity sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.0" + +"@radix-ui/react-portal@1.1.1": + version "1.1.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.1.1.tgz#1957f1eb2e1aedfb4a5475bd6867d67b50b1d15f" + integrity sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-presence@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.0.0.tgz#814fe46df11f9a468808a6010e3f3ca7e0b2e84a" + integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-use-layout-effect" "1.0.0" + +"@radix-ui/react-presence@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.1.0.tgz#227d84d20ca6bfe7da97104b1a8b48a833bfb478" + integrity sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-primitive@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz#376cd72b0fcd5e0e04d252ed33eb1b1f025af2b0" + integrity sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "1.0.0" + +"@radix-ui/react-primitive@2.0.0": + version "2.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz#fe05715faa9203a223ccc0be15dc44b9f9822884" + integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw== + dependencies: + "@radix-ui/react-slot" "1.1.0" + +"@radix-ui/react-progress@^1.0.3": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-progress/-/react-progress-1.1.0.tgz#28c267885ec154fc557ec7a66cb462787312f7e2" + integrity sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg== + dependencies: + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/react-roving-focus@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz#b30c59daf7e714c748805bfe11c76f96caaac35e" + integrity sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-scroll-area@^1.0.5": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.1.0.tgz#50b24b0fc9ada151d176395bcf47b2ec68feada5" + integrity sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg== + dependencies: + "@radix-ui/number" "1.1.0" + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-select@^2.0.0": + version "2.1.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-select/-/react-select-2.1.1.tgz#df05cb0b29d3deaef83b505917c4042e0e418a9f" + integrity sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ== + dependencies: + "@radix-ui/number" "1.1.0" + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.0" + "@radix-ui/react-focus-guards" "1.1.0" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-previous" "1.1.0" + "@radix-ui/react-visually-hidden" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.7" + +"@radix-ui/react-separator@^1.0.3": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-separator/-/react-separator-1.1.0.tgz#ee0f4d86003b0e3ea7bc6ccab01ea0adee32663e" + integrity sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/react-slot@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.0.0.tgz#7fa805b99891dea1e862d8f8fbe07f4d6d0fd698" + integrity sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + +"@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.0.2": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.1.0.tgz#7c5e48c36ef5496d97b08f1357bb26ed7c714b84" + integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + +"@radix-ui/react-switch@^1.0.3": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-switch/-/react-switch-1.1.0.tgz#fcf8e778500f1d60d4b2bec2fc3fad77a7c118e3" + integrity sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-previous" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" + +"@radix-ui/react-tabs@^1.0.4": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-tabs/-/react-tabs-1.1.0.tgz#0a6db1caed56776a1176aae68532060e301cc1c0" + integrity sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-roving-focus" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-toast@^1.1.5": + version "1.2.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-toast/-/react-toast-1.2.1.tgz#4bde231ed27d007dcd0455a446565ca619f92a2d" + integrity sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.0" + "@radix-ui/react-portal" "1.1.1" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-visually-hidden" "1.1.0" + +"@radix-ui/react-tooltip@^1.0.7": + version "1.1.2" + resolved "https://registry.npmmirror.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz#c42db2ffd7dcc6ff3d65407c8cb70490288f518d" + integrity sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.1" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-visually-hidden" "1.1.0" + +"@radix-ui/react-use-callback-ref@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz#9e7b8b6b4946fe3cbe8f748c82a2cce54e7b6a90" + integrity sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-callback-ref@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz#bce938ca413675bc937944b0d01ef6f4a6dc5bf1" + integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw== + +"@radix-ui/react-use-controllable-state@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz#a64deaafbbc52d5d407afaa22d493d687c538b7f" + integrity sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.0" + +"@radix-ui/react-use-controllable-state@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz#1321446857bb786917df54c0d4d084877aab04b0" + integrity sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.0" + +"@radix-ui/react-use-escape-keydown@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz#aef375db4736b9de38a5a679f6f49b45a060e5d1" + integrity sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.0" + +"@radix-ui/react-use-escape-keydown@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz#31a5b87c3b726504b74e05dac1edce7437b98754" + integrity sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.0" + +"@radix-ui/react-use-layout-effect@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz#2fc19e97223a81de64cd3ba1dc42ceffd82374dc" + integrity sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-layout-effect@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz#3c2c8ce04827b26a39e442ff4888d9212268bd27" + integrity sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w== + +"@radix-ui/react-use-previous@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz#d4dd37b05520f1d996a384eb469320c2ada8377c" + integrity sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og== + +"@radix-ui/react-use-rect@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz#13b25b913bd3e3987cc9b073a1a164bb1cf47b88" + integrity sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ== + dependencies: + "@radix-ui/rect" "1.1.0" + +"@radix-ui/react-use-size@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz#b4dba7fbd3882ee09e8d2a44a3eed3a7e555246b" + integrity sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-visually-hidden@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz#ad47a8572580f7034b3807c8e6740cd41038a5a2" + integrity sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/rect@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/rect/-/rect-1.1.0.tgz#f817d1d3265ac5415dadc67edab30ae196696438" + integrity sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg== + +"@remix-run/router@1.17.0": + version "1.17.0" + resolved "https://registry.npmmirror.com/@remix-run/router/-/router-1.17.0.tgz#fbb0add487478ef42247d5942e7a5d8a2e20095f" + integrity sha512-2D6XaHEVvkCn682XBnipbJjgZUU7xjLtA4dGJRBVUKpEaDYOZMENZoZjAOSb7qirxt5RupjzZxz4fK2FO+EFPw== + +"@rollup/plugin-inject@^5.0.5": + version "5.0.5" + resolved "https://registry.npmmirror.com/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz#616f3a73fe075765f91c5bec90176608bed277a3" + integrity sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg== + dependencies: + "@rollup/pluginutils" "^5.0.1" + estree-walker "^2.0.2" + magic-string "^0.30.3" + +"@rollup/pluginutils@^5.0.1": + version "5.1.0" + resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" + integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@rollup/rollup-android-arm-eabi@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" + integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== + +"@rollup/rollup-android-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" + integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== + +"@rollup/rollup-darwin-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" + integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== + +"@rollup/rollup-darwin-x64@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" + integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== + +"@rollup/rollup-linux-arm-gnueabihf@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" + integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== + +"@rollup/rollup-linux-arm-musleabihf@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" + integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== + +"@rollup/rollup-linux-arm64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" + integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== + +"@rollup/rollup-linux-arm64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" + integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" + integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== + +"@rollup/rollup-linux-riscv64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" + integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== + +"@rollup/rollup-linux-s390x-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" + integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== + +"@rollup/rollup-linux-x64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" + integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== + +"@rollup/rollup-linux-x64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" + integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== + +"@rollup/rollup-win32-arm64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" + integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== + +"@rollup/rollup-win32-ia32-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" + integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== + +"@rollup/rollup-win32-x64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" + integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== + +"@roochnetwork/rooch-sdk-kit@0.2.0": + version "0.2.0" + resolved "https://registry.npmmirror.com/@roochnetwork/rooch-sdk-kit/-/rooch-sdk-kit-0.2.0.tgz#727d575bf88853b8a5c9bf655ae119f6e5d6b1c9" + integrity sha512-qkXd8PubmxlcBQfkGy7FOuhDSAuLjsgQZuTpart0bCaLlyRfk0IroGkMTzMh9ZdtSqXfR5OxFFwD7HPin/NAQg== + dependencies: + "@roochnetwork/rooch-sdk" "0.2.0" + "@vanilla-extract/css" "^1.13.0" + "@vanilla-extract/dynamic" "^2.0.3" + "@vanilla-extract/recipes" "^0.5.0" + clsx "^2.0.0" + zustand "^4.4.1" + +"@roochnetwork/rooch-sdk@0.2.0": + version "0.2.0" + resolved "https://registry.npmmirror.com/@roochnetwork/rooch-sdk/-/rooch-sdk-0.2.0.tgz#3e8b621c397f52af3d73088e5007e2866248aa0a" + integrity sha512-wXhl//EZUisHjVNKZDqOTQwdk9Q/aNwH0bPVPbKlRQwUuYckKu6XVIoYW+zxXgE1sOAxpkEvACUTYkN6LmFnDA== + dependencies: + "@mysten/bcs" "1.0.2" + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + "@scure/bip32" "^1.3.1" + "@scure/bip39" "^1.2.1" + "@suchipi/femver" "^1.0.0" + bech32 "^2.0.0" + tweetnacl "^1.0.3" + valibot "^0.25.0" + +"@scure/base@~1.1.6": + version "1.1.7" + resolved "https://registry.npmmirror.com/@scure/base/-/base-1.1.7.tgz#fe973311a5c6267846aa131bc72e96c5d40d2b30" + integrity sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g== + +"@scure/bip32@^1.3.1": + version "1.4.0" + resolved "https://registry.npmmirror.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@scure/bip39@^1.2.1": + version "1.3.0" + resolved "https://registry.npmmirror.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== + dependencies: + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@suchipi/femver@^1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@suchipi/femver/-/femver-1.0.0.tgz#4909dcc069695e07bd23a64c4bfe411d11d9692f" + integrity sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg== + +"@swc/core-darwin-arm64@1.6.6": + version "1.6.6" + resolved "https://registry.npmmirror.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.6.tgz#9488d50394cb08713c4321a940b48599c1c5e153" + integrity sha512-5DA8NUGECcbcK1YLKJwNDKqdtTYDVnkfDU1WvQSXq/rU+bjYCLtn5gCe8/yzL7ISXA6rwqPU1RDejhbNt4ARLQ== + +"@swc/core-darwin-x64@1.6.6": + version "1.6.6" + resolved "https://registry.npmmirror.com/@swc/core-darwin-x64/-/core-darwin-x64-1.6.6.tgz#0b13ae43e1821fd447acfb789979c59bec2d0081" + integrity sha512-2nbh/RHpweNRsJiYDFk1KcX7UtaKgzzTNUjwtvK5cp0wWrpbXmPvdlWOx3yzwoiSASDFx78242JHHXCIOlEdsw== + +"@swc/core-linux-arm-gnueabihf@1.6.6": + version "1.6.6" + resolved "https://registry.npmmirror.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.6.tgz#8dd3e76b887478cedd38d34f1de3c0b8f853d1b8" + integrity sha512-YgytuyUfR7b0z0SRHKV+ylr83HmgnROgeT7xryEkth6JGpAEHooCspQ4RrWTU8+WKJ7aXiZlGXPgybQ4TiS+TA== + +"@swc/core-linux-arm64-gnu@1.6.6": + version "1.6.6" + resolved "https://registry.npmmirror.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.6.tgz#4d6369975d8a077f01cf9f6cee60402529ef67a6" + integrity sha512-yGwx9fddzEE0iURqRVwKBQ4IwRHE6hNhl15WliHpi/PcYhzmYkUIpcbRXjr0dssubXAVPVnx6+jZVDSbutvnfg== + +"@swc/core-linux-arm64-musl@1.6.6": + version "1.6.6" + resolved "https://registry.npmmirror.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.6.tgz#5f0ec779e465242796277d07a3100bd5ccaec6ef" + integrity sha512-a6fMbqzSAsS5KCxFJyg1mD5kwN3ZFO8qQLyJ75R/htZP/eCt05jrhmOI7h2n+1HjiG332jLnZ9S8lkVE5O8Nqw== + +"@swc/core-linux-x64-gnu@1.6.6": + version "1.6.6" + resolved "https://registry.npmmirror.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.6.tgz#30a92064e016f29b8fe85500fa4e71050c60ae74" + integrity sha512-hRGsUKNzzZle28YF0dYIpN0bt9PceR9LaVBq7x8+l9TAaDLFbgksSxcnU/ubTtsy+WsYSYGn+A83w3xWC0O8CQ== + +"@swc/core-linux-x64-musl@1.6.6": + version "1.6.6" + resolved "https://registry.npmmirror.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.6.tgz#59a14e4a90644142b8c90972f5d29cfdde88de78" + integrity sha512-NokIUtFxJDVv3LzGeEtYMTV3j2dnGKLac59luTeq36DQLZdJQawQIdTbzzWl2jE7lxxTZme+dhsVOH9LxE3ceg== + +"@swc/core-win32-arm64-msvc@1.6.6": + version "1.6.6" + resolved "https://registry.npmmirror.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.6.tgz#c81f6e9be1df76273100a422ceec887781244b5d" + integrity sha512-lzYdI4qb4k1dFG26yv+9Jaq/bUMAhgs/2JsrLncGjLof86+uj74wKYCQnbzKAsq2hDtS5DqnHnl+//J+miZfGA== + +"@swc/core-win32-ia32-msvc@1.6.6": + version "1.6.6" + resolved "https://registry.npmmirror.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.6.tgz#0381e95282fdcf5f5f9731b56dad5c5e4da870ce" + integrity sha512-bvl7FMaXIJQ76WZU0ER4+RyfKIMGb6S2MgRkBhJOOp0i7VFx4WLOnrmMzaeoPJaJSkityVKAftfNh7NBzTIydQ== + +"@swc/core-win32-x64-msvc@1.6.6": + version "1.6.6" + resolved "https://registry.npmmirror.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.6.tgz#e511013aa3f71125d6385123469cdd30db141070" + integrity sha512-WAP0JoCTfgeYKgOeYJoJV4ZS0sQUmU3OwvXa2dYYtMLF7zsNqOiW4niU7QlThBHgUv/qNZm2p6ITEgh3w1cltw== + +"@swc/core@^1.5.7": + version "1.6.6" + resolved "https://registry.npmmirror.com/@swc/core/-/core-1.6.6.tgz#fefaa3a6bdd1c6991a9ed67648bc058a0d29d4b8" + integrity sha512-sHfmIUPUXNrQTwFMVCY5V5Ena2GTOeaWjS2GFUpjLhAgVfP90OP67DWow7+cYrfFtqBdILHuWnjkTcd0+uPKlg== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.9" + optionalDependencies: + "@swc/core-darwin-arm64" "1.6.6" + "@swc/core-darwin-x64" "1.6.6" + "@swc/core-linux-arm-gnueabihf" "1.6.6" + "@swc/core-linux-arm64-gnu" "1.6.6" + "@swc/core-linux-arm64-musl" "1.6.6" + "@swc/core-linux-x64-gnu" "1.6.6" + "@swc/core-linux-x64-musl" "1.6.6" + "@swc/core-win32-arm64-msvc" "1.6.6" + "@swc/core-win32-ia32-msvc" "1.6.6" + "@swc/core-win32-x64-msvc" "1.6.6" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.npmmirror.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/types@^0.1.9": + version "0.1.9" + resolved "https://registry.npmmirror.com/@swc/types/-/types-0.1.9.tgz#e67cdcc2e4dd74a3cef4474b465eb398e7ae83e2" + integrity sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg== + dependencies: + "@swc/counter" "^0.1.3" + +"@tanstack/query-core@5.49.1": + version "5.49.1" + resolved "https://registry.npmmirror.com/@tanstack/query-core/-/query-core-5.49.1.tgz#09167842123eddaf47465376f3c835cf59b9f1e9" + integrity sha512-JnC9ndmD1KKS01Rt/ovRUB1tmwO7zkyXAyIxN9mznuJrcNtOrkmOnQqdJF2ib9oHzc2VxHomnEG7xyfo54Npkw== + +"@tanstack/react-query@^5.0.0": + version "5.49.2" + resolved "https://registry.npmmirror.com/@tanstack/react-query/-/react-query-5.49.2.tgz#d9c08f8eb62890f5274608f8954ab1709912ef3c" + integrity sha512-6rfwXDK9BvmHISbNFuGd+wY3P44lyW7lWiA9vIFGT/T0P9aHD1VkjTvcM4SDAIbAQ9ygEZZoLt7dlU1o3NjMVA== + dependencies: + "@tanstack/query-core" "5.49.1" + +"@tanstack/react-table@^8.11.8": + version "8.19.2" + resolved "https://registry.npmmirror.com/@tanstack/react-table/-/react-table-8.19.2.tgz#25ee691d12b8e6e0fca32f8e8cf465ee172009af" + integrity sha512-itoSIAkA/Vsg+bjY23FSemcTyPhc5/1YjYyaMsr9QSH/cdbZnQxHVWrpWn0Sp2BWN71qkzR7e5ye8WuMmwyOjg== + dependencies: + "@tanstack/table-core" "8.19.2" + +"@tanstack/table-core@8.19.2": + version "8.19.2" + resolved "https://registry.npmmirror.com/@tanstack/table-core/-/table-core-8.19.2.tgz#5fc8ede54f18867f74715ad93927f7df4d255209" + integrity sha512-KpRjhgehIhbfH78ARm/GJDXGnpdw4bCg3qas6yjWSi7czJhI/J6pWln7NHtmBkGE9ZbohiiNtLqwGzKmBfixig== + +"@types/estree@1.0.5", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/hast@^2.0.0": + version "2.3.10" + resolved "https://registry.npmmirror.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== + dependencies: + "@types/unist" "^2" + +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/node@^20.11.16": + version "20.14.9" + resolved "https://registry.npmmirror.com/@types/node/-/node-20.14.9.tgz#12e8e765ab27f8c421a1820c99f5f313a933b420" + integrity sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg== + dependencies: + undici-types "~5.26.4" + +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/prop-types@*": + version "15.7.12" + resolved "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + +"@types/react-dom@^18.2.17": + version "18.3.0" + resolved "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== + dependencies: + "@types/react" "*" + +"@types/react-syntax-highlighter@^15.5.11": + version "15.5.13" + resolved "https://registry.npmmirror.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz#c5baf62a3219b3bf28d39cfea55d0a49a263d1f2" + integrity sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.2.43": + version "18.3.3" + resolved "https://registry.npmmirror.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.npmmirror.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/unist@^2": + version "2.0.10" + resolved "https://registry.npmmirror.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + +"@typescript-eslint/eslint-plugin@^6.14.0": + version "6.21.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.14.0": + version "6.21.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== + dependencies: + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@vanilla-extract/css@^1.13.0": + version "1.15.3" + resolved "https://registry.npmmirror.com/@vanilla-extract/css/-/css-1.15.3.tgz#debf04f61496e290b53f045a2cb6966cc1ba9448" + integrity sha512-mxoskDAxdQAspbkmQRxBvolUi1u1jnyy9WZGm+GeH8V2wwhEvndzl1QoK7w8JfA0WFevTxbev5d+i+xACZlPhA== + dependencies: + "@emotion/hash" "^0.9.0" + "@vanilla-extract/private" "^1.0.5" + css-what "^6.1.0" + cssesc "^3.0.0" + csstype "^3.0.7" + dedent "^1.5.3" + deep-object-diff "^1.1.9" + deepmerge "^4.2.2" + media-query-parser "^2.0.2" + modern-ahocorasick "^1.0.0" + picocolors "^1.0.0" + +"@vanilla-extract/dynamic@^2.0.3": + version "2.1.1" + resolved "https://registry.npmmirror.com/@vanilla-extract/dynamic/-/dynamic-2.1.1.tgz#bc93a577b127a7dcb6f254973d13a863029a7faf" + integrity sha512-iqf736036ujEIKsIq28UsBEMaLC2vR2DhwKyrG3NDb/fRy9qL9FKl1TqTtBV4daU30Uh3saeik4vRzN8bzQMbw== + dependencies: + "@vanilla-extract/private" "^1.0.5" + +"@vanilla-extract/private@^1.0.5": + version "1.0.5" + resolved "https://registry.npmmirror.com/@vanilla-extract/private/-/private-1.0.5.tgz#8c08ac4851f4cc89a3dcdb858d8938e69b1481c4" + integrity sha512-6YXeOEKYTA3UV+RC8DeAjFk+/okoNz/h88R+McnzA2zpaVqTR/Ep+vszkWYlGBcMNO7vEkqbq5nT/JMMvhi+tw== + +"@vanilla-extract/recipes@^0.5.0": + version "0.5.3" + resolved "https://registry.npmmirror.com/@vanilla-extract/recipes/-/recipes-0.5.3.tgz#c65f2998fc189924845614ccd9f79c9334639f1a" + integrity sha512-SPREq1NmaoKuvJeOV0pppOkwy3pWZUoDufsyQ6iHrbkHhAU7XQqG9o0iZSmg5JoVgDLIiOr9djQb0x9wuxig7A== + +"@vitejs/plugin-react-swc@^3.5.0": + version "3.7.0" + resolved "https://registry.npmmirror.com/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz#e456c0a6d7f562268e1d231af9ac46b86ef47d88" + integrity sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA== + dependencies: + "@swc/core" "^1.5.7" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.12.0" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" + integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmmirror.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" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmmirror.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" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-hidden@^1.1.1: + version "1.2.4" + resolved "https://registry.npmmirror.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522" + integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A== + dependencies: + tslib "^2.0.0" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asn1.js@^4.10.1: + version "4.10.1" + resolved "https://registry.npmmirror.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +assert@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" + integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== + dependencies: + call-bind "^1.0.2" + is-nan "^1.3.2" + object-is "^1.1.5" + object.assign "^4.1.4" + util "^0.12.5" + +autoprefixer@^10.4.17: + version "10.4.19" + resolved "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== + dependencies: + browserslist "^4.23.0" + caniuse-lite "^1.0.30001599" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bech32@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" + integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bip174@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/bip174/-/bip174-2.1.1.tgz#ef3e968cf76de234a546962bcf572cc150982f9f" + integrity sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ== + +bitcoinjs-lib@^6.1.6: + version "6.1.6" + resolved "https://registry.npmmirror.com/bitcoinjs-lib/-/bitcoinjs-lib-6.1.6.tgz#f57c17c82511f860f11946d784c18da39f8618a8" + integrity sha512-Fk8+Vc+e2rMoDU5gXkW9tD+313rhkm5h6N9HfZxXvYU9LedttVvmXKTgd9k5rsQJjkSfsv6XRM8uhJv94SrvcA== + dependencies: + "@noble/hashes" "^1.2.0" + bech32 "^2.0.0" + bip174 "^2.1.1" + bs58check "^3.0.1" + typeforce "^1.11.3" + varuint-bitcoin "^1.1.2" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.npmmirror.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmmirror.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" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-resolve@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" + integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== + dependencies: + resolve "^1.17.0" + +browserify-aes@^1.0.4, browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.3" + resolved "https://registry.npmmirror.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" + integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== + dependencies: + bn.js "^5.2.1" + browserify-rsa "^4.1.0" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.5" + hash-base "~3.0" + inherits "^2.0.4" + parse-asn1 "^5.1.7" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.23.0: + version "4.23.1" + resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" + integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== + dependencies: + caniuse-lite "^1.0.30001629" + electron-to-chromium "^1.4.796" + node-releases "^2.0.14" + update-browserslist-db "^1.0.16" + +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + +bs58check@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/bs58check/-/bs58check-3.0.1.tgz#2094d13720a28593de1cba1d8c4e48602fdd841c" + integrity sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ== + dependencies: + "@noble/hashes" "^1.2.0" + bs58 "^5.0.0" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^5.7.1: + version "5.7.1" + resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001629: + version "1.0.30001639" + resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz#972b3a6adeacdd8f46af5fc7f771e9639f6c1521" + integrity sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.npmmirror.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.npmmirror.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + 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" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-variance-authority@^0.7.0: + version "0.7.0" + resolved "https://registry.npmmirror.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz#1c3134d634d80271b1837452b06d821915954522" + integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A== + dependencies: + clsx "2.0.0" + +clsx@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + +clsx@^2.0.0, clsx@^2.1.0: + version "2.1.1" + resolved "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +cmdk@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/cmdk/-/cmdk-0.2.1.tgz#aa8e1332bb0b8d8484e793017c82537351188d9a" + integrity sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g== + dependencies: + "@radix-ui/react-dialog" "1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + 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" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.npmmirror.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + 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" + +create-require@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.npmmirror.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" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.npmmirror.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.2, csstype@^3.0.7: + version "3.1.3" + resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.5" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + +dedent@^1.5.3: + version "1.5.3" + resolved "https://registry.npmmirror.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deep-object-diff@^1.1.9: + version "1.1.9" + resolved "https://registry.npmmirror.com/deep-object-diff/-/deep-object-diff-1.1.9.tgz#6df7ef035ad6a0caa44479c536ed7b02570f4595" + integrity sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.npmmirror.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +domain-browser@^4.22.0: + version "4.23.0" + resolved "https://registry.npmmirror.com/domain-browser/-/domain-browser-4.23.0.tgz#427ebb91efcb070f05cffdfb8a4e9a6c25f8c94b" + integrity sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +electron-to-chromium@^1.4.796: + version "1.4.815" + resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.815.tgz#e901b195c57c3e0fae8dc6d596e4188a33c3e82c" + integrity sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg== + +elliptic@^6.5.3, elliptic@^6.5.5: + version "6.5.5" + resolved "https://registry.npmmirror.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + 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" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.2" + resolved "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== + +eslint-plugin-react-refresh@^0.4.5: + version "0.4.7" + resolved "https://registry.npmmirror.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz#1f597f9093b254f10ee0961c139a749acb19af7d" + integrity sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.55.0: + version "8.57.0" + resolved "https://registry.npmmirror.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.2" + resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + 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.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fault@^1.0.0: + version "1.0.4" + resolved "https://registry.npmmirror.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" + integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== + dependencies: + format "^0.2.0" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.npmmirror.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.2.1" + resolved "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" + integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.npmmirror.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.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.2: + version "6.0.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^10.3.10: + version "10.4.2" + resolved "https://registry.npmmirror.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" + integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmmirror.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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +goober@^2.1.10: + version "2.1.14" + resolved "https://registry.npmmirror.com/goober/-/goober-2.1.14.tgz#4a5c94fc34dc086a8e6035360ae1800005135acd" + integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash-base@~3.0: + version "3.0.4" + resolved "https://registry.npmmirror.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.0, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +highlight.js@^10.4.1, highlight.js@~10.7.0: + version "10.7.3" + resolved "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +html-parse-stringify@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== + dependencies: + void-elements "3.1.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +i18next@^23.8.2: + version "23.11.5" + resolved "https://registry.npmmirror.com/i18next/-/i18next-23.11.5.tgz#d71eb717a7e65498d87d0594f2664237f9e361ef" + integrity sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA== + dependencies: + "@babel/runtime" "^7.23.2" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.npmmirror.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmmirror.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.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmmirror.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.14.0" + resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" + integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== + dependencies: + hasown "^2.0.2" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-nan@^1.3.2: + version "1.3.2" + resolved "https://registry.npmmirror.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-typed-array@^1.1.3: + version "1.1.13" + resolved "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-timers-promises@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz#e4137c24dbc54892de8abae3a4b5c1ffff381598" + integrity sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ== + +jackspeak@^3.1.2: + version "3.4.0" + resolved "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" + integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jiti@^1.21.0: + version "1.21.6" + resolved "https://registry.npmmirror.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmmirror.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.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lilconfig@^3.0.0: + version "3.1.2" + resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.0.0, loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lowlight@^1.17.0: + version "1.20.0" + resolved "https://registry.npmmirror.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" + integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== + dependencies: + fault "^1.0.0" + highlight.js "~10.7.0" + +lru-cache@^10.2.0: + version "10.3.0" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.3.0.tgz#4a4aaf10c84658ab70f79a85a9a3f1e1fb11196b" + integrity sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ== + +lucide-react@^0.321.0: + version "0.321.0" + resolved "https://registry.npmmirror.com/lucide-react/-/lucide-react-0.321.0.tgz#05a2600e0a6551c117fb4e7b2676b1286389d949" + integrity sha512-Fi9VahIna6642U+2nAGSjnXwUBV3WyfFFPQq4yi3w30jtqxDLfSyiYCtCYCYQZ2KWNZc1MDI+rcsa0t+ChdYpw== + +magic-string@^0.30.3: + version "0.30.10" + resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" + integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +media-query-parser@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/media-query-parser/-/media-query-parser-2.0.2.tgz#ff79e56cee92615a304a1c2fa4f2bd056c0a1d29" + integrity sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w== + dependencies: + "@babel/runtime" "^7.12.5" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +mersenne-twister@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz#f916618ee43d7179efcf641bec4531eb9670978a" + integrity sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA== + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.7" + resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +modern-ahocorasick@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz#dec373444f51b5458ac05216a8ec376e126dd283" + integrity sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +node-stdlib-browser@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz#5ddcfdf4063b88fb282979a1aa6ddab9728d5e4c" + integrity sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg== + dependencies: + assert "^2.0.0" + browser-resolve "^2.0.0" + browserify-zlib "^0.2.0" + buffer "^5.7.1" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + create-require "^1.1.1" + crypto-browserify "^3.11.0" + domain-browser "^4.22.0" + events "^3.0.0" + https-browserify "^1.0.0" + isomorphic-timers-promises "^1.0.1" + os-browserify "^0.3.0" + path-browserify "^1.0.1" + pkg-dir "^5.0.0" + process "^0.11.10" + punycode "^1.4.1" + querystring-es3 "^0.2.1" + readable-stream "^3.6.0" + stream-browserify "^3.0.0" + stream-http "^3.2.0" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.1" + url "^0.11.0" + util "^0.12.4" + vm-browserify "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.npmmirror.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.7: + version "5.1.7" + resolved "https://registry.npmmirror.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06" + integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== + dependencies: + asn1.js "^4.10.1" + browserify-aes "^1.2.0" + evp_bytestokey "^1.0.3" + hash-base "~3.0" + pbkdf2 "^3.1.2" + safe-buffer "^5.2.1" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.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.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.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.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3, pbkdf2@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + 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" + +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-selector-parser@^6.0.11: + version "6.1.0" + resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" + integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.38: + version "8.4.39" + resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.39.tgz#aa3c94998b61d3a9c259efa51db4b392e1bde0e3" + integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prismjs@^1.27.0: + version "1.29.0" + resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +prismjs@~1.27.0: + version "1.27.0" + resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" + integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.npmmirror.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +property-information@^5.0.0: + version "5.6.0" + resolved "https://registry.npmmirror.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@^6.11.2: + version "6.12.1" + resolved "https://registry.npmmirror.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" + integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== + dependencies: + side-channel "^1.0.6" + +querystring-es3@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +react-dom@^18.2.0: + version "18.3.1" + resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-hot-toast@2.4.0: + version "2.4.0" + resolved "https://registry.npmmirror.com/react-hot-toast/-/react-hot-toast-2.4.0.tgz#b91e7a4c1b6e3068fc599d3d83b4fb48668ae51d" + integrity sha512-qnnVbXropKuwUpriVVosgo8QrB+IaPJCpL8oBI6Ov84uvHZ5QQcTp2qg6ku2wNfgJl6rlQXJIQU5q+5lmPOutA== + dependencies: + goober "^2.1.10" + +react-i18next@^14.0.3: + version "14.1.2" + resolved "https://registry.npmmirror.com/react-i18next/-/react-i18next-14.1.2.tgz#cd57a755f25a32a5fcc3dbe546cf3cc62b4f3ebd" + integrity sha512-FSIcJy6oauJbGEXfhUgVeLzvWBhIBIS+/9c6Lj4niwKZyGaGb4V4vUbATXSlsHJDXXB+ociNxqFNiFuV1gmoqg== + dependencies: + "@babel/runtime" "^7.23.9" + html-parse-stringify "^3.0.1" + +react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-jazzicon@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/react-jazzicon/-/react-jazzicon-1.0.4.tgz#31e5f6908e042786ba93a9093b852dea1870e7a0" + integrity sha512-/3kWv5vtAhI18GBFoqjpxRTtL+EImuB73PAC02r/zJQ6E+PAUmoBx8edYvTCIYHwS01uFf6N3elTDqSrVPwg4w== + dependencies: + mersenne-twister "^1.1.0" + +react-loading-skeleton@^3.4.0: + version "3.4.0" + resolved "https://registry.npmmirror.com/react-loading-skeleton/-/react-loading-skeleton-3.4.0.tgz#c71a3a17259d08e4064974aa0b07f150a09dfd57" + integrity sha512-1oJEBc9+wn7BbkQQk7YodlYEIjgeR+GrRjD+QXkVjwZN7LGIcAFHrx4NhT7UHGBxNY1+zax3c+Fo6XQM4R7CgA== + +react-remove-scroll-bar@^2.3.3, react-remove-scroll-bar@^2.3.4: + version "2.3.6" + resolved "https://registry.npmmirror.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" + integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@2.5.4: + version "2.5.4" + resolved "https://registry.npmmirror.com/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz#afe6491acabde26f628f844b67647645488d2ea0" + integrity sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA== + dependencies: + react-remove-scroll-bar "^2.3.3" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-remove-scroll@2.5.7: + version "2.5.7" + resolved "https://registry.npmmirror.com/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz#15a1fd038e8497f65a695bf26a4a57970cac1ccb" + integrity sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA== + dependencies: + react-remove-scroll-bar "^2.3.4" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-router-dom@^6.22.0: + version "6.24.0" + resolved "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.24.0.tgz#ec49dc38c49bb9bd25b310a8ae849268d3085e1d" + integrity sha512-960sKuau6/yEwS8e+NVEidYQb1hNjAYM327gjEyXlc6r3Skf2vtwuJ2l7lssdegD2YjoKG5l8MsVyeTDlVeY8g== + dependencies: + "@remix-run/router" "1.17.0" + react-router "6.24.0" + +react-router@6.24.0: + version "6.24.0" + resolved "https://registry.npmmirror.com/react-router/-/react-router-6.24.0.tgz#aa46648f26b6525e07f908ad3e1ad2e68d131155" + integrity sha512-sQrgJ5bXk7vbcC4BxQxeNa5UmboFm35we1AFK0VvQaz9g0LzxEIuLOhHIoZ8rnu9BO21ishGeL9no1WB76W/eg== + dependencies: + "@remix-run/router" "1.17.0" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + +react-syntax-highlighter@^15.5.0: + version "15.5.0" + resolved "https://registry.npmmirror.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20" + integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "^10.4.1" + lowlight "^1.17.0" + prismjs "^1.27.0" + refractor "^3.6.0" + +react@^18.2.0: + version "18.3.1" + resolved "https://registry.npmmirror.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readable-stream@^2.3.8: + version "2.3.8" + resolved "https://registry.npmmirror.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.5.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.npmmirror.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.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +refractor@^3.6.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" + integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== + dependencies: + hastscript "^6.0.0" + parse-entities "^2.0.0" + prismjs "~1.27.0" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.7, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.22.2: + version "1.22.8" + resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.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.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup@^4.13.0: + version "4.18.0" + resolved "https://registry.npmmirror.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" + integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.18.0" + "@rollup/rollup-android-arm64" "4.18.0" + "@rollup/rollup-darwin-arm64" "4.18.0" + "@rollup/rollup-darwin-x64" "4.18.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" + "@rollup/rollup-linux-arm-musleabihf" "4.18.0" + "@rollup/rollup-linux-arm64-gnu" "4.18.0" + "@rollup/rollup-linux-arm64-musl" "4.18.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" + "@rollup/rollup-linux-riscv64-gnu" "4.18.0" + "@rollup/rollup-linux-s390x-gnu" "4.18.0" + "@rollup/rollup-linux-x64-gnu" "4.18.0" + "@rollup/rollup-linux-x64-musl" "4.18.0" + "@rollup/rollup-win32-arm64-msvc" "4.18.0" + "@rollup/rollup-win32-ia32-msvc" "4.18.0" + "@rollup/rollup-win32-x64-msvc" "4.18.0" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmmirror.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.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +semver@^7.5.4: + version "7.6.2" + resolved "https://registry.npmmirror.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.npmmirror.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.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.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-http@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.npmmirror.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-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmmirror.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.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +stylis@4.1.3: + version "4.1.3" + resolved "https://registry.npmmirror.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" + integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== + +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tailwind-merge@^2.2.1: + version "2.3.0" + resolved "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-2.3.0.tgz#27d2134fd00a1f77eca22bcaafdd67055917d286" + integrity sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA== + dependencies: + "@babel/runtime" "^7.24.1" + +tailwindcss-animate@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz#318b692c4c42676cc9e67b19b78775742388bef4" + integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== + +tailwindcss@^3.4.1: + version "3.4.4" + resolved "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.4.tgz#351d932273e6abfa75ce7d226b5bf3a6cb257c05" + integrity sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.0" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.npmmirror.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^2.0.0, tslib@^2.1.0: + version "2.6.3" + resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typeforce@^1.11.3: + version "1.18.0" + resolved "https://registry.npmmirror.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc" + integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== + +typescript@^5.2.2: + version "5.5.2" + resolved "https://registry.npmmirror.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507" + integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +update-browserslist-db@^1.0.16: + version "1.0.16" + resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url@^0.11.0: + version "0.11.3" + resolved "https://registry.npmmirror.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" + integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== + dependencies: + punycode "^1.4.1" + qs "^6.11.2" + +use-callback-ref@^1.3.0: + version "1.3.2" + resolved "https://registry.npmmirror.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693" + integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== + dependencies: + tslib "^2.0.0" + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + +use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.4, util@^0.12.5: + version "0.12.5" + resolved "https://registry.npmmirror.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +valibot@^0.25.0: + version "0.25.0" + resolved "https://registry.npmmirror.com/valibot/-/valibot-0.25.0.tgz#bdbb3a6e910f983b5a65b56b2bff24dfd09064ca" + integrity sha512-cmD0ca15oyAbT75iYLNW6uU6doAeIwYfOshpXka/E1Bx4frzbkrgb7gvkI7K0YK/DVOksei4FfxWfRoBP3NFTg== + +varuint-bitcoin@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz#e76c138249d06138b480d4c5b40ef53693e24e92" + integrity sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw== + dependencies: + safe-buffer "^5.1.1" + +vite-plugin-node-polyfills@^0.22.0: + version "0.22.0" + resolved "https://registry.npmmirror.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.22.0.tgz#d0afcf82eb985fc02244620d7cec1ddd1c6e0864" + integrity sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA== + dependencies: + "@rollup/plugin-inject" "^5.0.5" + node-stdlib-browser "^1.2.0" + +vite@^5.0.8: + version "5.3.2" + resolved "https://registry.npmmirror.com/vite/-/vite-5.3.2.tgz#2f0a8531c71060467ed3e0a205a203f269b6d9c8" + integrity sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.38" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== + +which-typed-array@^1.1.14, which-typed-array@^1.1.2: + version "1.1.15" + resolved "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xtend@^4.0.0, xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^2.3.4: + version "2.4.5" + resolved "https://registry.npmmirror.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" + integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@^3.22.4: + version "3.23.8" + resolved "https://registry.npmmirror.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== + +zustand@^4.4.1, zustand@^4.4.7: + version "4.5.4" + resolved "https://registry.npmmirror.com/zustand/-/zustand-4.5.4.tgz#63abdd81edfb190bc61e0bbae045cc4d52158a05" + integrity sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg== + dependencies: + use-sync-external-store "1.2.0" diff --git a/moveos/metrics/Cargo.toml b/moveos/metrics/Cargo.toml index 473643e806..de60758024 100644 --- a/moveos/metrics/Cargo.toml +++ b/moveos/metrics/Cargo.toml @@ -12,22 +12,18 @@ repository = { workspace = true } rust-version = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] +axum = { workspace = true } +tracing = { workspace = true } +scopeguard = { workspace = true } +prometheus = { workspace = true } +once_cell = { workspace = true } +tap = { workspace = true } +tokio = { workspace = true } +dashmap = { workspace = true } +uuid = { workspace = true } +parking_lot = { workspace = true } +futures = { workspace = true } +async-trait = { workspace = true } anyhow = { workspace = true } -prometheus = {workspace = true } -serde_json = { features = ["arbitrary_precision"], workspace = true } -futures = { optional = true, workspace = true } -hyper = { features = ["full"], optional = true, workspace = true } -log = { workspace = true } - -[features] -server = ["prometheus/push", "hyper", "futures"] - -[target."cfg(any(target_os = \"macos\", target_os=\"linux\"))".dependencies] -psutil = { version = "3.2", default-features = false, features = [ - "cpu", - "memory", - "process", -] } -timeout-join-handler = { workspace = true } +protobuf = { workspace = true } \ No newline at end of file diff --git a/moveos/metrics_v2/src/closure_metric.rs b/moveos/metrics/src/closure_metric.rs similarity index 100% rename from moveos/metrics_v2/src/closure_metric.rs rename to moveos/metrics/src/closure_metric.rs diff --git a/moveos/metrics_v2/src/guards.rs b/moveos/metrics/src/guards.rs similarity index 100% rename from moveos/metrics_v2/src/guards.rs rename to moveos/metrics/src/guards.rs diff --git a/moveos/metrics_v2/src/histogram.rs b/moveos/metrics/src/histogram.rs similarity index 100% rename from moveos/metrics_v2/src/histogram.rs rename to moveos/metrics/src/histogram.rs diff --git a/moveos/metrics/src/json_encoder.rs b/moveos/metrics/src/json_encoder.rs deleted file mode 100644 index f211f93449..0000000000 --- a/moveos/metrics/src/json_encoder.rs +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) RoochNetwork -// SPDX-License-Identifier: Apache-2.0 - -// Copyright (c) The Diem Core Contributors -// SPDX-License-Identifier: Apache-2.0 - -use crate::flatten_metric_with_labels; -use prometheus::{ - proto::{MetricFamily, MetricType}, - Encoder, Result, -}; -use std::{collections::HashMap, io::Write}; - -const JSON_FORMAT: &str = "application/json"; - -/// An implementation of an [`Encoder`](::Encoder) that converts a `MetricFamily` proto message -/// into `fbagent` json -/// -/// This implementation converts metric{dimensions,...} -> value to a flat string with a value. -/// e.g., "requests{method="GET", service="accounts"} -> 8 into -/// requests.GET.account -> 8 -/// For now, it ignores timestamps (if set on the metric) -#[derive(Debug, Default)] -pub struct JsonEncoder; - -impl Encoder for JsonEncoder { - fn encode(&self, metric_familys: &[MetricFamily], writer: &mut W) -> Result<()> { - let mut export_me: HashMap = HashMap::new(); - - for mf in metric_familys { - let name = mf.get_name(); - let metric_type = mf.get_field_type(); - - for m in mf.get_metric() { - match metric_type { - MetricType::COUNTER => { - export_me.insert( - flatten_metric_with_labels(name, m), - m.get_counter().get_value(), - ); - } - MetricType::GAUGE => { - export_me.insert( - flatten_metric_with_labels(name, m), - m.get_gauge().get_value(), - ); - } - MetricType::HISTOGRAM => { - // write the sum and counts - let h = m.get_histogram(); - - export_me.insert( - flatten_metric_with_labels(&format!("{}_count", name), m), - h.get_sample_count() as f64, - ); - export_me.insert( - flatten_metric_with_labels(&format!("{}_sum", name), m), - h.get_sample_sum(), - ); - } - _ => { - // do nothing; unimplemented - } - } - } - } - - writer.write_all( - serde_json::to_string(&export_me) - .map_err(|e| prometheus::Error::Msg(e.to_string()))? - .as_bytes(), - )?; - Ok(()) - } - - fn format_type(&self) -> &str { - JSON_FORMAT - } -} diff --git a/moveos/metrics/src/lib.rs b/moveos/metrics/src/lib.rs index 8ea6412a8d..aabaebc6c3 100644 --- a/moveos/metrics/src/lib.rs +++ b/moveos/metrics/src/lib.rs @@ -1,245 +1,414 @@ // Copyright (c) RoochNetwork // SPDX-License-Identifier: Apache-2.0 -// Copyright (c) The Starcoin Core Contributors +// Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 -#![recursion_limit = "128"] -extern crate prometheus; - -use anyhow::Result; -use prometheus::core::{ - AtomicU64, GenericCounter, GenericCounterVec, GenericGauge, GenericGaugeVec, -}; -use prometheus::{ - core::{Collector, Metric}, - proto::MetricType, - Encoder, TextEncoder, -}; -use std::{ - collections::HashMap, - fs::{create_dir_all, File, OpenOptions}, - hash::BuildHasher, - io::Write, - path::Path, - thread, time, -}; - -mod json_encoder; -#[cfg(feature = "server")] -pub mod metric_server; - -mod op_counters; -#[cfg(any(target_os = "linux", target_os = "macos"))] -mod process_collector; -#[macro_use] -pub mod macros; - -pub use op_counters::{DurationHistogram, OpMetrics}; -// Re-export counter types from prometheus crate -use prometheus::proto::LabelPair; -pub use prometheus::{ - default_registry, histogram_opts, labels, opts, register_counter, register_counter_vec, - register_gauge, register_gauge_vec, register_histogram, register_histogram_vec, - register_int_counter, register_int_counter_vec, register_int_gauge, register_int_gauge_vec, - Error as PrometheusError, Histogram, HistogramOpts, HistogramTimer, HistogramVec, IntCounter, - IntCounterVec, IntGauge, IntGaugeVec, Opts, Registry, -}; - -pub mod proto { - pub use prometheus::proto::*; -} - -pub mod prometheus_export { - pub use prometheus::register; -} - -pub type UIntGaugeVec = GenericGaugeVec; -pub type UIntGauge = GenericGauge; - -pub type UIntCounterVec = GenericCounterVec; -pub type UIntCounter = GenericCounter; - -pub fn register( - metric: T, - registry: &Registry, -) -> Result { - registry.register(Box::new(metric.clone()))?; - Ok(metric) -} - -fn get_metrics_file>(dir_path: &P, file_name: &str) -> File { - create_dir_all(dir_path).expect("Create metrics dir failed"); - - let metrics_file_path = dir_path.as_ref().join(file_name); - - log::info!("Using metrics file {}", metrics_file_path.display()); - - OpenOptions::new() - .append(true) - .create(true) - .open(metrics_file_path) - .expect("Open metrics file failed") -} - -fn get_all_metrics_as_serialized_string() -> Result> { - let all_metrics = prometheus::gather(); - - let encoder = TextEncoder::new(); - let mut buffer = Vec::new(); - encoder.encode(&all_metrics, &mut buffer)?; - Ok(buffer) -} - -pub fn get_all_metrics(registry: &Registry) -> HashMap { - let all_metric_families = registry.gather(); - let mut all_metrics = HashMap::new(); - for metric_family in all_metric_families { - let name = metric_family.get_name(); - let metric_type = metric_family.get_field_type(); - for m in metric_family.get_metric() { - match metric_type { - MetricType::COUNTER => { - all_metrics.insert( - flatten_metric_with_labels(name, m), - m.get_counter().get_value().to_string(), - ); - } - MetricType::GAUGE => { - all_metrics.insert( - flatten_metric_with_labels(name, m), - m.get_gauge().get_value().to_string(), - ); - } - MetricType::HISTOGRAM => { - let h = m.get_histogram(); - let count = h.get_sample_count(); - all_metrics.insert( - flatten_metric_with_labels(&format!("{}_count", name), m), - count.to_string(), - ); - let sum = h.get_sample_sum(); - all_metrics.insert( - flatten_metric_with_labels(&format!("{}_sum", name), m), - sum.to_string(), +use axum::{extract::Extension, http::StatusCode, routing::get, Router}; +use dashmap::DashMap; +use std::future::Future; +use std::net::SocketAddr; +use std::pin::Pin; +use std::sync::Arc; +use std::task::{Context, Poll}; +use std::time::Instant; + +use once_cell::sync::OnceCell; +use prometheus::{register_int_gauge_vec_with_registry, IntGaugeVec, Registry, TextEncoder}; +use tap::TapFallible; +use tracing::warn; + +pub use scopeguard; +use uuid::Uuid; + +pub mod closure_metric; +mod guards; +pub mod histogram; +pub mod metered_channel; +pub mod monitored_mpsc; +pub use guards::*; +#[cfg(test)] +mod tests; + +pub const TX_TYPE_SINGLE_WRITER_TX: &str = "single_writer"; +pub const TX_TYPE_SHARED_OBJ_TX: &str = "shared_object"; + +#[derive(Debug)] +pub struct Metrics { + pub tasks: IntGaugeVec, + pub futures: IntGaugeVec, + pub channel_inflight: IntGaugeVec, + pub channel_sent: IntGaugeVec, + pub channel_received: IntGaugeVec, + pub scope_iterations: IntGaugeVec, + pub scope_duration_ns: IntGaugeVec, + pub scope_entrance: IntGaugeVec, +} + +impl Metrics { + fn new(registry: &Registry) -> Self { + Self { + tasks: register_int_gauge_vec_with_registry!( + "monitored_tasks", + "Number of running tasks per callsite.", + &["callsite"], + registry, + ) + .unwrap(), + futures: register_int_gauge_vec_with_registry!( + "monitored_futures", + "Number of pending futures per callsite.", + &["callsite"], + registry, + ) + .unwrap(), + channel_inflight: register_int_gauge_vec_with_registry!( + "monitored_channel_inflight", + "Inflight items in channels.", + &["name"], + registry, + ) + .unwrap(), + channel_sent: register_int_gauge_vec_with_registry!( + "monitored_channel_sent", + "Sent items in channels.", + &["name"], + registry, + ) + .unwrap(), + channel_received: register_int_gauge_vec_with_registry!( + "monitored_channel_received", + "Received items in channels.", + &["name"], + registry, + ) + .unwrap(), + scope_entrance: register_int_gauge_vec_with_registry!( + "monitored_scope_entrance", + "Number of entrance in the scope.", + &["name"], + registry, + ) + .unwrap(), + scope_iterations: register_int_gauge_vec_with_registry!( + "monitored_scope_iterations", + "Total number of times where the monitored scope runs", + &["name"], + registry, + ) + .unwrap(), + scope_duration_ns: register_int_gauge_vec_with_registry!( + "monitored_scope_duration_ns", + "Total duration in nanosecs where the monitored scope is running", + &["name"], + registry, + ) + .unwrap(), + } + } +} + +static METRICS: OnceCell = OnceCell::new(); + +pub fn init_metrics(registry: &Registry) { + let _ = METRICS + .set(Metrics::new(registry)) + // this happens many times during tests + .tap_err(|_| warn!("init_metrics registry overwritten")); +} + +pub fn get_metrics() -> Option<&'static Metrics> { + METRICS.get() +} + +#[macro_export] +macro_rules! monitored_future { + ($fut: expr) => {{ + monitored_future!(futures, $fut, "", INFO, false) + }}; + + ($metric: ident, $fut: expr, $name: expr, $logging_level: ident, $logging_enabled: expr) => {{ + let location: &str = if $name.is_empty() { + concat!(file!(), ':', line!()) + } else { + concat!(file!(), ':', $name) + }; + + async move { + let metrics = mysten_metrics::get_metrics(); + + let _metrics_guard = if let Some(m) = metrics { + m.$metric.with_label_values(&[location]).inc(); + Some(mysten_metrics::scopeguard::guard(m, |metrics| { + m.$metric.with_label_values(&[location]).dec(); + })) + } else { + None + }; + let _logging_guard = if $logging_enabled { + Some(mysten_metrics::scopeguard::guard((), |_| { + tracing::event!( + tracing::Level::$logging_level, + "Future {} completed", + location ); - if count > 0 { - let average = sum / (count as f64); - all_metrics.insert( - flatten_metric_with_labels(&format!("{}_average", name), m), - average.to_string(), - ); - } - } - MetricType::SUMMARY => panic!("Unsupported Metric 'SUMMARY'"), - MetricType::UNTYPED => panic!("Unsupported Metric 'UNTYPED'"), + })) + } else { + None + }; + + if $logging_enabled { + tracing::event!( + tracing::Level::$logging_level, + "Spawning future {}", + location + ); } + + $fut.await } - } + }}; +} - all_metrics +#[macro_export] +macro_rules! spawn_monitored_task { + ($fut: expr) => { + tokio::task::spawn(mysten_metrics::monitored_future!( + tasks, $fut, "", INFO, false + )) + }; } -/** -This method takes Prometheus metrics with dimensions (represented as label:value tags) -and converts it into a dot-separated string. +#[macro_export] +macro_rules! spawn_logged_monitored_task { + ($fut: expr) => { + tokio::task::spawn(mysten_metrics::monitored_future!( + tasks, $fut, "", INFO, true + )) + }; -Example: -Prometheus metric: error_count{method: "get_account", error="connection_error"} -Result: error_count.get_account.connection_error + ($fut: expr, $name: expr) => { + tokio::task::spawn(mysten_metrics::monitored_future!( + tasks, $fut, $name, INFO, true + )) + }; -If the set of labels is empty, only the name is returned -Example: -Prometheus metric: errors -Result: errors + ($fut: expr, $name: expr, $logging_level: ident) => { + tokio::task::spawn(mysten_metrics::monitored_future!( + tasks, + $fut, + $name, + $logging_level, + true + )) + }; +} + +pub struct MonitoredScopeGuard { + metrics: &'static Metrics, + name: &'static str, + timer: Instant, +} -This is useful when exporting metric data to flat time series. -*/ -fn flatten_metric_with_labels(name: &str, metric: &prometheus::proto::Metric) -> String { - let res = String::from(name); +impl Drop for MonitoredScopeGuard { + fn drop(&mut self) { + self.metrics + .scope_duration_ns + .with_label_values(&[self.name]) + .add(self.timer.elapsed().as_nanos() as i64); + self.metrics + .scope_entrance + .with_label_values(&[self.name]) + .dec(); + } +} - if metric.get_label().is_empty() { - res +/// This function creates a named scoped object, that keeps track of +/// - the total iterations where the scope is called in the `monitored_scope_iterations` metric. +/// - and the total duration of the scope in the `monitored_scope_duration_ns` metric. +/// +/// The monitored scope should be single threaded, e.g. the scoped object encompass the lifetime of +/// a select loop or guarded by mutex. +/// Then the rate of `monitored_scope_duration_ns`, converted to the unit of sec / sec, would be +/// how full the single threaded scope is running. +pub fn monitored_scope(name: &'static str) -> Option { + let metrics = get_metrics(); + if let Some(m) = metrics { + m.scope_iterations.with_label_values(&[name]).inc(); + m.scope_entrance.with_label_values(&[name]).inc(); + Some(MonitoredScopeGuard { + metrics: m, + name, + timer: Instant::now(), + }) } else { - // string-list.join(".") - let values: Vec<&str> = metric - .get_label() - .iter() - .map(LabelPair::get_value) - .filter(|&x| !x.is_empty()) - .collect(); - let values = values.join("."); - if !values.is_empty() { - format!("{}.{}", res, values) - } else { - res - } + None } } -// Launches a background thread which will periodically collect metrics -// every interval and write them to the provided file -pub fn dump_all_metrics_to_file_periodically>( - dir_path: &P, - file_name: &str, - interval: u64, -) { - let mut file = get_metrics_file(dir_path, file_name); - thread::spawn(move || loop { - let mut buffer = get_all_metrics_as_serialized_string().expect("Error gathering metrics"); - if !buffer.is_empty() { - buffer.push(b'\n'); - file.write_all(&buffer).expect("Error writing metrics"); +pub trait MonitoredFutureExt: Future + Sized { + fn in_monitored_scope(self, name: &'static str) -> MonitoredScopeFuture; +} + +impl MonitoredFutureExt for F { + fn in_monitored_scope(self, name: &'static str) -> MonitoredScopeFuture { + MonitoredScopeFuture { + f: Box::pin(self), + _scope: monitored_scope(name), } - thread::sleep(time::Duration::from_millis(interval)); - }); + } } -pub fn export_counter(col: &mut HashMap, counter: &M) -where - M: Metric, - S: BuildHasher, -{ - let c = counter.metric(); - col.insert( - c.get_label()[0].get_name().to_string(), - c.get_counter().get_value().to_string(), - ); -} - -pub fn get_metric_name(metric: &M) -> String -where - M: Collector, -{ - metric.collect()[0].get_name().to_string() -} - -pub fn get_metric_from_registry( - registry: &Registry, - metric_name: &str, - label: Option<(&str, &str)>, -) -> Option> { - registry.gather().into_iter().find_map(|metric_fm| { - if metric_fm.get_name() == metric_name { - let metrics = metric_fm.get_metric().to_vec(); - if let Some((label_name, label_value)) = label { - metrics - .into_iter() - .find(|metric| { - metric.get_label().iter().any(|label_pair| { - label_pair.get_name() == label_name - && label_pair.get_value() == label_value - }) - }) - .map(|metric| vec![metric]) - } else { - Some(metrics) - } - } else { - None +pub struct MonitoredScopeFuture { + f: Pin>, + _scope: Option, +} + +impl Future for MonitoredScopeFuture { + type Output = F::Output; + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + self.f.as_mut().poll(cx) + } +} + +pub type RegistryID = Uuid; + +/// A service to manage the prometheus registries. This service allow us to create +/// a new Registry on demand and keep it accessible for processing/polling. +/// The service can be freely cloned/shared across threads. +#[derive(Clone)] +pub struct RegistryService { + // Holds a Registry that is supposed to be used + default_registry: Registry, + registries_by_id: Arc>, +} + +impl RegistryService { + // Creates a new registry service and also adds the main/default registry that is supposed to + // be preserved and never get removed + pub fn new(default_registry: Registry) -> Self { + Self { + default_registry, + registries_by_id: Arc::new(DashMap::new()), } - }) + } + + // Returns the default registry for the service that someone can use + // if they don't want to create a new one. + pub fn default_registry(&self) -> Registry { + self.default_registry.clone() + } + + // Adds a new registry to the service. The corresponding RegistryID is returned so can later be + // used for removing the Registry. Method panics if we try to insert a registry with the same id. + // As this can be quite serious for the operation of the node we don't want to accidentally + // swap an existing registry - we expected a removal to happen explicitly. + pub fn add(&self, registry: Registry) -> RegistryID { + let registry_id = Uuid::new_v4(); + if self + .registries_by_id + .insert(registry_id, registry) + .is_some() + { + panic!("Other Registry already detected for the same id {registry_id}"); + } + + registry_id + } + + // Removes the registry from the service. If Registry existed then this method returns true, + // otherwise false is returned instead. + pub fn remove(&self, registry_id: RegistryID) -> bool { + self.registries_by_id.remove(®istry_id).is_some() + } + + // Returns all the registries of the service + pub fn get_all(&self) -> Vec { + let mut registries: Vec = self + .registries_by_id + .iter() + .map(|r| r.value().clone()) + .collect(); + registries.push(self.default_registry.clone()); + + registries + } + + // Returns all the metric families from the registries that a service holds. + pub fn gather_all(&self) -> Vec { + self.get_all().iter().flat_map(|r| r.gather()).collect() + } } -#[cfg(test)] -mod tests; +/// Create a metric that measures the uptime from when this metric was constructed. +/// The metric is labeled with: +/// - 'process': the process type, differentiating between validator and fullnode +/// - 'version': binary version, generally be of the format: 'semver-gitrevision' +/// - 'chain_identifier': the identifier of the network which this process is part of +pub fn uptime_metric( + process: &str, + version: &'static str, + chain_identifier: &str, +) -> Box { + let opts = prometheus::opts!("uptime", "uptime of the node service in seconds") + .variable_label("process") + .variable_label("version") + .variable_label("chain_identifier"); + + let start_time = std::time::Instant::now(); + let uptime = move || start_time.elapsed().as_secs(); + let metric = closure_metric::ClosureMetric::new( + opts, + closure_metric::ValueType::Counter, + uptime, + &[process, version, chain_identifier], + ) + .unwrap(); + + Box::new(metric) +} + +pub const METRICS_ROUTE: &str = "/metrics"; + +// Creates a new http server that has as a sole purpose to expose +// and endpoint that prometheus agent can use to poll for the metrics. +// A RegistryService is returned that can be used to get access in prometheus Registries. +pub fn start_prometheus_server(addr: SocketAddr) -> RegistryService { + let registry = Registry::new(); + + let registry_service = RegistryService::new(registry); + + if cfg!(msim) { + // prometheus uses difficult-to-support features such as TcpSocket::from_raw_fd(), so we + // can't yet run it in the simulator. + warn!("not starting prometheus server in simulator"); + return registry_service; + } + + let app = Router::new() + .route(METRICS_ROUTE, get(metrics)) + .layer(Extension(registry_service.clone())); + + tokio::spawn(async move { + axum::Server::bind(&addr) + .serve(app.into_make_service()) + .await + .unwrap(); + }); + + registry_service +} + +pub async fn metrics( + Extension(registry_service): Extension, +) -> (StatusCode, String) { + let metrics_families = registry_service.gather_all(); + match TextEncoder.encode_to_string(&metrics_families) { + Ok(metrics) => (StatusCode::OK, metrics), + Err(error) => ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("unable to encode metrics: {error}"), + ), + } +} diff --git a/moveos/metrics/src/macros.rs b/moveos/metrics/src/macros.rs deleted file mode 100644 index 9e12e0f458..0000000000 --- a/moveos/metrics/src/macros.rs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) RoochNetwork -// SPDX-License-Identifier: Apache-2.0 - -#[macro_export] -macro_rules! register_uint_gauge_vec { - ($OPTS:expr, $LABELS_NAMES:expr) => {{ - __register_gauge_vec!(UIntGaugeVec, $OPTS, $LABELS_NAMES) - }}; - - ($NAME:expr, $HELP:expr, $LABELS_NAMES:expr) => {{ - register_uint_gauge_vec!(opts!($NAME, $HELP), $LABELS_NAMES) - }}; -} - -#[macro_export] -#[doc(hidden)] -macro_rules! register_uint_gauge { - ($OPTS:expr) => {{ - let gauge = $crate::UIntGauge::with_opts($OPTS).expect("register_uint_gauge failed"); - $crate::prometheus_export::register(Box::new(gauge.clone())).map(|_| gauge) - }}; - ($NAME:expr, $HELP:expr) => {{ - register_uint_gauge!($crate::opts!($NAME, $HELP)) - }}; -} - -#[macro_export] -#[doc(hidden)] -macro_rules! __register_gauge_vec { - ($TYPE:ident, $OPTS:expr, $LABELS_NAMES:expr) => {{ - let gauge_vec = - $crate::$TYPE::new($OPTS, $LABELS_NAMES).expect("__register_gauge_vec failed"); - $crate::prometheus_export::register(Box::new(gauge_vec.clone())).map(|_| gauge_vec) - }}; -} diff --git a/moveos/metrics_v2/src/metered_channel.rs b/moveos/metrics/src/metered_channel.rs similarity index 100% rename from moveos/metrics_v2/src/metered_channel.rs rename to moveos/metrics/src/metered_channel.rs diff --git a/moveos/metrics/src/metric_server.rs b/moveos/metrics/src/metric_server.rs deleted file mode 100644 index 4e51b6e730..0000000000 --- a/moveos/metrics/src/metric_server.rs +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) RoochNetwork -// SPDX-License-Identifier: Apache-2.0 - -// Copyright (c) The Starcoin Core Contributors -// SPDX-License-Identifier: Apache-2.0 - -use crate::json_encoder::JsonEncoder; -use futures::future; -use hyper::{ - server::Server, - service::{make_service_fn, service_fn}, - Body, Method, Request, Response, StatusCode, -}; -use prometheus::{hostname_grouping_key, BasicAuthentication, Registry}; -use prometheus::{Encoder, TextEncoder}; -use std::net::SocketAddr; - -fn encode_metrics(encoder: impl Encoder, registry: &Registry) -> Vec { - let metric_families = registry.gather(); - let mut buffer = vec![]; - //if encode error, just return empty body. - if let Err(e) = encoder.encode(&metric_families, &mut buffer) { - log::error!("Encode metrics error: {:?}", e); - } - buffer -} - -async fn serve_metrics( - req: Request, - registry: Registry, -) -> Result, hyper::Error> { - let mut resp = Response::new(Body::empty()); - match (req.method(), req.uri().path()) { - (&Method::GET, "/metrics") => { - //Prometheus server expects metrics to be on host:port/metrics - let encoder = TextEncoder::new(); - let buffer = encode_metrics(encoder, ®istry); - *resp.body_mut() = Body::from(buffer); - } - // expose non-numeric metrics to host:port/json_metrics - (&Method::GET, "/json_metrics") => { - // Json encoded diem_metrics; - let encoder = JsonEncoder; - let buffer = encode_metrics(encoder, ®istry); - *resp.body_mut() = Body::from(buffer); - } - _ => { - *resp.status_mut() = StatusCode::NOT_FOUND; - } - }; - - Ok(resp) -} - -pub async fn start_server(addr: SocketAddr, registry: Registry) -> anyhow::Result<()> { - // metric process info. - #[cfg(any(target_os = "linux", target_os = "macos"))] - { - let process_collector = crate::process_collector::ProcessCollector::for_self()?; - if let Err(e) = registry.register(Box::new(process_collector)) { - log::warn!("Register process_collector metric failed: {:?}", e); - } - } - let make_service = make_service_fn(|_| { - let registry = registry.clone(); - future::ok::<_, hyper::Error>(service_fn(move |req| serve_metrics(req, registry.clone()))) - }); - - let server = Server::bind(&addr).serve(make_service); - log::info!("Metric server started at {}", addr); - server.await.map_err(|e| e.into()) -} - -pub fn push_metrics(push_server_url: String, auth_username: Option, auth_password: String) { - let metric_families = prometheus::gather(); - let basic_auth = auth_username.map(|username| BasicAuthentication { - username, - password: auth_password, - }); - - match prometheus::push_metrics( - "starcoin_push", - hostname_grouping_key(), - &push_server_url, - metric_families, - basic_auth, - ) { - Ok(_) => {} - Err(e) => { - log::debug!("push metrics error: {:?}", e); - } - }; -} diff --git a/moveos/metrics_v2/src/monitored_mpsc.rs b/moveos/metrics/src/monitored_mpsc.rs similarity index 100% rename from moveos/metrics_v2/src/monitored_mpsc.rs rename to moveos/metrics/src/monitored_mpsc.rs diff --git a/moveos/metrics/src/op_counters.rs b/moveos/metrics/src/op_counters.rs deleted file mode 100644 index d18949ca95..0000000000 --- a/moveos/metrics/src/op_counters.rs +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (c) RoochNetwork -// SPDX-License-Identifier: Apache-2.0 - -// Copyright (c) The Starcoin Core Contributors -// SPDX-License-Identifier: Apache-2.0 - -// Copyright (c) The Diem Core Contributors -// SPDX-License-Identifier: Apache-2.0 - -//! `OpCounters` is a collection of convenience methods to add arbitrary counters to modules. -//! For now, it supports Int-Counters, Int-Gauges, and Histogram. - -use anyhow::Result; -use prometheus::{ - core::{Collector, Desc}, - proto::MetricFamily, - Histogram, HistogramOpts, HistogramTimer, HistogramVec, IntCounter, IntCounterVec, IntGauge, - IntGaugeVec, Opts, -}; -use std::time::Duration; - -/// A small wrapper around Histogram to handle the special case -/// of duration buckets. -/// This Histogram will handle the correct granularty for logging -/// time duration in a way that fits the used buckets. -pub struct DurationHistogram { - histogram: Histogram, -} - -impl DurationHistogram { - pub fn new(histogram: Histogram) -> DurationHistogram { - DurationHistogram { histogram } - } - - pub fn observe_duration(&self, d: Duration) { - // Duration is full seconds + nanos elapsed from the previous full second - let v = d.as_secs() as f64 + f64::from(d.subsec_nanos()) / 1e9; - self.histogram.observe(v); - } -} - -#[derive(Clone)] -pub struct OpMetrics { - #[allow(unused)] - module: String, - counters: IntCounterVec, - gauges: IntGaugeVec, - duration_histograms: HistogramVec, -} - -impl OpMetrics { - pub fn new>(name: S) -> Result { - let name = name.into(); - Ok(OpMetrics { - module: name.clone(), - counters: IntCounterVec::new( - Opts::new(name.clone(), format!("Counters for {}", name)), - &["op"], - )?, - gauges: IntGaugeVec::new( - Opts::new(format!("{}_gauge", name), format!("Gauges for {}", name)), - &["op"], - )?, - duration_histograms: HistogramVec::new( - HistogramOpts::new( - format!("{}_duration", name), - format!("Histogram values for {}", name), - ), - &["op"], - )?, - }) - } - - pub fn new_and_registered>(name: S) -> Result { - let op_metrics = OpMetrics::new(name)?; - prometheus::register(Box::new(op_metrics.clone())) - .expect("OpMetrics registration on Prometheus failed."); - Ok(op_metrics) - } - - #[inline] - pub fn gauge(&self, name: &str) -> IntGauge { - self.gauges.with_label_values(&[name]) - } - - #[inline] - pub fn counter(&self, name: &str) -> IntCounter { - self.counters.with_label_values(&[name]) - } - - #[inline] - pub fn histogram(&self, name: &str) -> Histogram { - self.duration_histograms.with_label_values(&[name]) - } - - pub fn duration_histogram(&self, name: &str) -> DurationHistogram { - DurationHistogram::new(self.duration_histograms.with_label_values(&[name])) - } - - #[inline] - pub fn inc(&self, op: &str) { - self.counters.with_label_values(&[op]).inc(); - } - - #[inline] - pub fn inc_by(&self, op: &str, v: usize) { - // The underlying method is expecting i64, but most of the types - // we're going to log are `u64` or `usize`. - self.counters.with_label_values(&[op]).inc_by(v as u64); - } - - #[inline] - pub fn add(&self, op: &str) { - self.gauges.with_label_values(&[op]).inc(); - } - - #[inline] - pub fn sub(&self, op: &str) { - self.gauges.with_label_values(&[op]).dec(); - } - - #[inline] - pub fn set(&self, op: &str, v: usize) { - // The underlying method is expecting i64, but most of the types - // we're going to log are `u64` or `usize`. - self.gauges.with_label_values(&[op]).set(v as i64); - } - - #[inline] - pub fn observe(&self, op: &str, v: f64) { - self.duration_histograms.with_label_values(&[op]).observe(v); - } - - pub fn observe_duration(&self, op: &str, d: Duration) { - // Duration is full seconds + nanos elapsed from the previous full second - let v = d.as_secs() as f64 + f64::from(d.subsec_nanos()) / 1e9; - self.duration_histograms.with_label_values(&[op]).observe(v); - } - - pub fn timer(&self, op: &str) -> HistogramTimer { - self.duration_histograms - .with_label_values(&[op]) - .start_timer() - } -} - -impl Collector for OpMetrics { - fn desc(&self) -> Vec<&Desc> { - let mut ms = Vec::with_capacity(4); - ms.extend(self.counters.desc()); - ms.extend(self.gauges.desc()); - ms.extend(self.duration_histograms.desc()); - ms - } - - fn collect(&self) -> Vec { - let mut ms = Vec::with_capacity(4); - ms.extend(self.counters.collect()); - ms.extend(self.gauges.collect()); - ms.extend(self.duration_histograms.collect()); - ms - } -} diff --git a/moveos/metrics/src/process_collector.rs b/moveos/metrics/src/process_collector.rs deleted file mode 100644 index da9359148c..0000000000 --- a/moveos/metrics/src/process_collector.rs +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (c) RoochNetwork -// SPDX-License-Identifier: Apache-2.0 - -use anyhow::{bail, Result}; -use prometheus::core::{Collector, Desc, Opts}; -use prometheus::proto; -use prometheus::Gauge; -use psutil::process; -use std::sync::Mutex; - -#[derive(Debug)] -pub struct ProcessCollector { - pid: u32, - descs: Vec, - process: Mutex, - cpu_usage: Gauge, - vsize: Gauge, - rss: Gauge, -} - -impl ProcessCollector { - #[allow(dead_code)] - pub fn for_self() -> Result { - let pid = std::process::id(); - Self::new(pid) - } - #[allow(dead_code)] - pub fn new(pid: u32) -> Result { - let vsize = Gauge::with_opts(Opts::new( - "process_virtual_memory_bytes", - "Virtual memory size in bytes.", - ))?; - let rss = Gauge::with_opts(Opts::new( - "process_resident_memory_bytes", - "Resident memory size in bytes.", - ))?; - let cpu_usage = Gauge::with_opts(Opts::new( - "process_cpu_usage", - "Total user and system CPU usage", - ))?; - let mut descs = vec![]; - descs.extend(vsize.desc().into_iter().cloned()); - descs.extend(rss.desc().into_iter().cloned()); - descs.extend(cpu_usage.desc().into_iter().cloned()); - let process = process::Process::new(pid); - let process = match process { - Err(e) => { - bail!("fail to collect process info of pid {}, err: {:?}", pid, e); - } - Ok(p) => p, - }; - - Ok(ProcessCollector { - pid, - descs, - process: Mutex::new(process), - cpu_usage, - vsize, - rss, - }) - } -} - -impl Collector for ProcessCollector { - fn desc(&self) -> Vec<&Desc> { - self.descs.iter().collect() - } - - fn collect(&self) -> Vec { - let mut process = self.process.lock().expect("lock failed."); - - let mut mfs = Vec::with_capacity(3); - - // let process_info = system.get_process(self.pid); - match process.memory_info() { - Err(e) => { - log::error!( - "fail to collect memory usage of pid {}, err: {:?}", - self.pid, - e - ); - } - Ok(mem_info) => { - self.rss.set(mem_info.rss() as f64); - self.vsize.set(mem_info.vms() as f64); - mfs.extend(self.rss.collect()); - mfs.extend(self.vsize.collect()); - } - } - match process.cpu_percent() { - Err(e) => { - log::error!( - "fail to collect cpu usage of pid {}, err: {:?}", - self.pid, - e - ); - } - Ok(percent) => { - self.cpu_usage.set(percent as f64); - mfs.extend(self.cpu_usage.collect()); - } - } - - mfs - } -} diff --git a/moveos/metrics/src/tests.rs b/moveos/metrics/src/tests.rs deleted file mode 100644 index aafab75c7b..0000000000 --- a/moveos/metrics/src/tests.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) RoochNetwork -// SPDX-License-Identifier: Apache-2.0 - -use super::*; -use crate::json_encoder::JsonEncoder; -use prometheus::{ - core::{Collector, Metric}, - IntCounter, IntCounterVec, Opts, -}; -use serde_json::Value; - -#[test] -fn test_flatten_labels() { - // generate counters for testing - let counter = IntCounter::new("counter_1", "Test counter 1").unwrap(); - let res = flatten_metric_with_labels("counter_1", &counter.metric()); - assert_eq!("counter_1", res.as_str()); - - let counter = IntCounterVec::new( - Opts::new("counter_2", "Example counter for testing"), - &["label_me"], - ) - .unwrap(); - let res = flatten_metric_with_labels("counter_2", &counter.with_label_values(&[""]).metric()); - assert_eq!("counter_2", res.as_str()); - - let res = - flatten_metric_with_labels("counter_2", &counter.with_label_values(&["hello"]).metric()); - assert_eq!("counter_2.hello", res.as_str()); - - let counter = IntCounterVec::new( - Opts::new("counter_2", "Example counter for testing"), - &["label_me", "label_me_too"], - ) - .unwrap(); - let res = - flatten_metric_with_labels("counter_3", &counter.with_label_values(&["", ""]).metric()); - assert_eq!("counter_3", res.as_str()); - - let res = flatten_metric_with_labels( - "counter_3", - &counter.with_label_values(&["hello", "world"]).metric(), - ); - assert_eq!("counter_3.hello.world", res.as_str()); -} - -#[test] -fn test_encoder() { - let counter = IntCounterVec::new( - Opts::new("testing_count", "Test Counter"), - &["method", "result"], - ) - .unwrap(); - // add some test data - counter.with_label_values(&["get", "302"]).inc(); - counter.with_label_values(&["get", "302"]).inc(); - counter.with_label_values(&["get", "404"]).inc(); - counter.with_label_values(&["put", ""]).inc(); - - let metric_family = counter.collect(); - let mut data_writer = Vec::::new(); - let encoder = JsonEncoder; - let res = encoder.encode(&metric_family, &mut data_writer); - assert!(res.is_ok()); - - let expected: &str = r#" - { - "testing_count.get.302": 2.0, - "testing_count.get.404": 1.0, - "testing_count.put": 1.0 - }"#; - - let v: Value = serde_json::from_slice(&data_writer).unwrap(); - let expected_v: Value = serde_json::from_str(expected).unwrap(); - - assert_eq!(v, expected_v); -} diff --git a/moveos/metrics_v2/src/tests/mod.rs b/moveos/metrics/src/tests/mod.rs similarity index 100% rename from moveos/metrics_v2/src/tests/mod.rs rename to moveos/metrics/src/tests/mod.rs diff --git a/moveos/metrics_v2/src/tests/test_closure_metric.rs b/moveos/metrics/src/tests/test_closure_metric.rs similarity index 100% rename from moveos/metrics_v2/src/tests/test_closure_metric.rs rename to moveos/metrics/src/tests/test_closure_metric.rs diff --git a/moveos/metrics_v2/src/tests/test_metered_channel.rs b/moveos/metrics/src/tests/test_metered_channel.rs similarity index 100% rename from moveos/metrics_v2/src/tests/test_metered_channel.rs rename to moveos/metrics/src/tests/test_metered_channel.rs diff --git a/moveos/metrics_v2/src/tests/test_registry_service.rs b/moveos/metrics/src/tests/test_registry_service.rs similarity index 100% rename from moveos/metrics_v2/src/tests/test_registry_service.rs rename to moveos/metrics/src/tests/test_registry_service.rs diff --git a/moveos/metrics_v2/Cargo.toml b/moveos/metrics_v2/Cargo.toml deleted file mode 100644 index de60758024..0000000000 --- a/moveos/metrics_v2/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "metrics" - -# Workspace inherited keys -version = { workspace = true } -authors = { workspace = true } -edition = { workspace = true } -homepage = { workspace = true } -license = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } -rust-version = { workspace = true } - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[dependencies] -axum = { workspace = true } -tracing = { workspace = true } -scopeguard = { workspace = true } -prometheus = { workspace = true } -once_cell = { workspace = true } -tap = { workspace = true } -tokio = { workspace = true } -dashmap = { workspace = true } -uuid = { workspace = true } -parking_lot = { workspace = true } -futures = { workspace = true } -async-trait = { workspace = true } -anyhow = { workspace = true } -protobuf = { workspace = true } \ No newline at end of file diff --git a/moveos/metrics_v2/src/lib.rs b/moveos/metrics_v2/src/lib.rs deleted file mode 100644 index aabaebc6c3..0000000000 --- a/moveos/metrics_v2/src/lib.rs +++ /dev/null @@ -1,414 +0,0 @@ -// Copyright (c) RoochNetwork -// SPDX-License-Identifier: Apache-2.0 - -// Copyright (c) Mysten Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -use axum::{extract::Extension, http::StatusCode, routing::get, Router}; -use dashmap::DashMap; -use std::future::Future; -use std::net::SocketAddr; -use std::pin::Pin; -use std::sync::Arc; -use std::task::{Context, Poll}; -use std::time::Instant; - -use once_cell::sync::OnceCell; -use prometheus::{register_int_gauge_vec_with_registry, IntGaugeVec, Registry, TextEncoder}; -use tap::TapFallible; -use tracing::warn; - -pub use scopeguard; -use uuid::Uuid; - -pub mod closure_metric; -mod guards; -pub mod histogram; -pub mod metered_channel; -pub mod monitored_mpsc; -pub use guards::*; -#[cfg(test)] -mod tests; - -pub const TX_TYPE_SINGLE_WRITER_TX: &str = "single_writer"; -pub const TX_TYPE_SHARED_OBJ_TX: &str = "shared_object"; - -#[derive(Debug)] -pub struct Metrics { - pub tasks: IntGaugeVec, - pub futures: IntGaugeVec, - pub channel_inflight: IntGaugeVec, - pub channel_sent: IntGaugeVec, - pub channel_received: IntGaugeVec, - pub scope_iterations: IntGaugeVec, - pub scope_duration_ns: IntGaugeVec, - pub scope_entrance: IntGaugeVec, -} - -impl Metrics { - fn new(registry: &Registry) -> Self { - Self { - tasks: register_int_gauge_vec_with_registry!( - "monitored_tasks", - "Number of running tasks per callsite.", - &["callsite"], - registry, - ) - .unwrap(), - futures: register_int_gauge_vec_with_registry!( - "monitored_futures", - "Number of pending futures per callsite.", - &["callsite"], - registry, - ) - .unwrap(), - channel_inflight: register_int_gauge_vec_with_registry!( - "monitored_channel_inflight", - "Inflight items in channels.", - &["name"], - registry, - ) - .unwrap(), - channel_sent: register_int_gauge_vec_with_registry!( - "monitored_channel_sent", - "Sent items in channels.", - &["name"], - registry, - ) - .unwrap(), - channel_received: register_int_gauge_vec_with_registry!( - "monitored_channel_received", - "Received items in channels.", - &["name"], - registry, - ) - .unwrap(), - scope_entrance: register_int_gauge_vec_with_registry!( - "monitored_scope_entrance", - "Number of entrance in the scope.", - &["name"], - registry, - ) - .unwrap(), - scope_iterations: register_int_gauge_vec_with_registry!( - "monitored_scope_iterations", - "Total number of times where the monitored scope runs", - &["name"], - registry, - ) - .unwrap(), - scope_duration_ns: register_int_gauge_vec_with_registry!( - "monitored_scope_duration_ns", - "Total duration in nanosecs where the monitored scope is running", - &["name"], - registry, - ) - .unwrap(), - } - } -} - -static METRICS: OnceCell = OnceCell::new(); - -pub fn init_metrics(registry: &Registry) { - let _ = METRICS - .set(Metrics::new(registry)) - // this happens many times during tests - .tap_err(|_| warn!("init_metrics registry overwritten")); -} - -pub fn get_metrics() -> Option<&'static Metrics> { - METRICS.get() -} - -#[macro_export] -macro_rules! monitored_future { - ($fut: expr) => {{ - monitored_future!(futures, $fut, "", INFO, false) - }}; - - ($metric: ident, $fut: expr, $name: expr, $logging_level: ident, $logging_enabled: expr) => {{ - let location: &str = if $name.is_empty() { - concat!(file!(), ':', line!()) - } else { - concat!(file!(), ':', $name) - }; - - async move { - let metrics = mysten_metrics::get_metrics(); - - let _metrics_guard = if let Some(m) = metrics { - m.$metric.with_label_values(&[location]).inc(); - Some(mysten_metrics::scopeguard::guard(m, |metrics| { - m.$metric.with_label_values(&[location]).dec(); - })) - } else { - None - }; - let _logging_guard = if $logging_enabled { - Some(mysten_metrics::scopeguard::guard((), |_| { - tracing::event!( - tracing::Level::$logging_level, - "Future {} completed", - location - ); - })) - } else { - None - }; - - if $logging_enabled { - tracing::event!( - tracing::Level::$logging_level, - "Spawning future {}", - location - ); - } - - $fut.await - } - }}; -} - -#[macro_export] -macro_rules! spawn_monitored_task { - ($fut: expr) => { - tokio::task::spawn(mysten_metrics::monitored_future!( - tasks, $fut, "", INFO, false - )) - }; -} - -#[macro_export] -macro_rules! spawn_logged_monitored_task { - ($fut: expr) => { - tokio::task::spawn(mysten_metrics::monitored_future!( - tasks, $fut, "", INFO, true - )) - }; - - ($fut: expr, $name: expr) => { - tokio::task::spawn(mysten_metrics::monitored_future!( - tasks, $fut, $name, INFO, true - )) - }; - - ($fut: expr, $name: expr, $logging_level: ident) => { - tokio::task::spawn(mysten_metrics::monitored_future!( - tasks, - $fut, - $name, - $logging_level, - true - )) - }; -} - -pub struct MonitoredScopeGuard { - metrics: &'static Metrics, - name: &'static str, - timer: Instant, -} - -impl Drop for MonitoredScopeGuard { - fn drop(&mut self) { - self.metrics - .scope_duration_ns - .with_label_values(&[self.name]) - .add(self.timer.elapsed().as_nanos() as i64); - self.metrics - .scope_entrance - .with_label_values(&[self.name]) - .dec(); - } -} - -/// This function creates a named scoped object, that keeps track of -/// - the total iterations where the scope is called in the `monitored_scope_iterations` metric. -/// - and the total duration of the scope in the `monitored_scope_duration_ns` metric. -/// -/// The monitored scope should be single threaded, e.g. the scoped object encompass the lifetime of -/// a select loop or guarded by mutex. -/// Then the rate of `monitored_scope_duration_ns`, converted to the unit of sec / sec, would be -/// how full the single threaded scope is running. -pub fn monitored_scope(name: &'static str) -> Option { - let metrics = get_metrics(); - if let Some(m) = metrics { - m.scope_iterations.with_label_values(&[name]).inc(); - m.scope_entrance.with_label_values(&[name]).inc(); - Some(MonitoredScopeGuard { - metrics: m, - name, - timer: Instant::now(), - }) - } else { - None - } -} - -pub trait MonitoredFutureExt: Future + Sized { - fn in_monitored_scope(self, name: &'static str) -> MonitoredScopeFuture; -} - -impl MonitoredFutureExt for F { - fn in_monitored_scope(self, name: &'static str) -> MonitoredScopeFuture { - MonitoredScopeFuture { - f: Box::pin(self), - _scope: monitored_scope(name), - } - } -} - -pub struct MonitoredScopeFuture { - f: Pin>, - _scope: Option, -} - -impl Future for MonitoredScopeFuture { - type Output = F::Output; - - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - self.f.as_mut().poll(cx) - } -} - -pub type RegistryID = Uuid; - -/// A service to manage the prometheus registries. This service allow us to create -/// a new Registry on demand and keep it accessible for processing/polling. -/// The service can be freely cloned/shared across threads. -#[derive(Clone)] -pub struct RegistryService { - // Holds a Registry that is supposed to be used - default_registry: Registry, - registries_by_id: Arc>, -} - -impl RegistryService { - // Creates a new registry service and also adds the main/default registry that is supposed to - // be preserved and never get removed - pub fn new(default_registry: Registry) -> Self { - Self { - default_registry, - registries_by_id: Arc::new(DashMap::new()), - } - } - - // Returns the default registry for the service that someone can use - // if they don't want to create a new one. - pub fn default_registry(&self) -> Registry { - self.default_registry.clone() - } - - // Adds a new registry to the service. The corresponding RegistryID is returned so can later be - // used for removing the Registry. Method panics if we try to insert a registry with the same id. - // As this can be quite serious for the operation of the node we don't want to accidentally - // swap an existing registry - we expected a removal to happen explicitly. - pub fn add(&self, registry: Registry) -> RegistryID { - let registry_id = Uuid::new_v4(); - if self - .registries_by_id - .insert(registry_id, registry) - .is_some() - { - panic!("Other Registry already detected for the same id {registry_id}"); - } - - registry_id - } - - // Removes the registry from the service. If Registry existed then this method returns true, - // otherwise false is returned instead. - pub fn remove(&self, registry_id: RegistryID) -> bool { - self.registries_by_id.remove(®istry_id).is_some() - } - - // Returns all the registries of the service - pub fn get_all(&self) -> Vec { - let mut registries: Vec = self - .registries_by_id - .iter() - .map(|r| r.value().clone()) - .collect(); - registries.push(self.default_registry.clone()); - - registries - } - - // Returns all the metric families from the registries that a service holds. - pub fn gather_all(&self) -> Vec { - self.get_all().iter().flat_map(|r| r.gather()).collect() - } -} - -/// Create a metric that measures the uptime from when this metric was constructed. -/// The metric is labeled with: -/// - 'process': the process type, differentiating between validator and fullnode -/// - 'version': binary version, generally be of the format: 'semver-gitrevision' -/// - 'chain_identifier': the identifier of the network which this process is part of -pub fn uptime_metric( - process: &str, - version: &'static str, - chain_identifier: &str, -) -> Box { - let opts = prometheus::opts!("uptime", "uptime of the node service in seconds") - .variable_label("process") - .variable_label("version") - .variable_label("chain_identifier"); - - let start_time = std::time::Instant::now(); - let uptime = move || start_time.elapsed().as_secs(); - let metric = closure_metric::ClosureMetric::new( - opts, - closure_metric::ValueType::Counter, - uptime, - &[process, version, chain_identifier], - ) - .unwrap(); - - Box::new(metric) -} - -pub const METRICS_ROUTE: &str = "/metrics"; - -// Creates a new http server that has as a sole purpose to expose -// and endpoint that prometheus agent can use to poll for the metrics. -// A RegistryService is returned that can be used to get access in prometheus Registries. -pub fn start_prometheus_server(addr: SocketAddr) -> RegistryService { - let registry = Registry::new(); - - let registry_service = RegistryService::new(registry); - - if cfg!(msim) { - // prometheus uses difficult-to-support features such as TcpSocket::from_raw_fd(), so we - // can't yet run it in the simulator. - warn!("not starting prometheus server in simulator"); - return registry_service; - } - - let app = Router::new() - .route(METRICS_ROUTE, get(metrics)) - .layer(Extension(registry_service.clone())); - - tokio::spawn(async move { - axum::Server::bind(&addr) - .serve(app.into_make_service()) - .await - .unwrap(); - }); - - registry_service -} - -pub async fn metrics( - Extension(registry_service): Extension, -) -> (StatusCode, String) { - let metrics_families = registry_service.gather_all(); - match TextEncoder.encode_to_string(&metrics_families) { - Ok(metrics) => (StatusCode::OK, metrics), - Err(error) => ( - StatusCode::INTERNAL_SERVER_ERROR, - format!("unable to encode metrics: {error}"), - ), - } -} diff --git a/moveos/moveos-store/src/config_store/mod.rs b/moveos/moveos-store/src/config_store/mod.rs index 3101ab6e59..13c7eccc62 100644 --- a/moveos/moveos-store/src/config_store/mod.rs +++ b/moveos/moveos-store/src/config_store/mod.rs @@ -1,7 +1,7 @@ // Copyright (c) RoochNetwork // SPDX-License-Identifier: Apache-2.0 -use crate::{CONFIG_GENESIS_PREFIX_NAME, CONFIG_STARTUP_INFO_PREFIX_NAME}; +use crate::{CONFIG_GENESIS_COLUMN_FAMILY_NAME, CONFIG_STARTUP_INFO_COLUMN_FAMILY_NAME}; use anyhow::Result; use moveos_types::genesis_info::GenesisInfo; use moveos_types::startup_info::StartupInfo; @@ -15,13 +15,13 @@ derive_store!( StartupInfoStore, String, StartupInfo, - CONFIG_STARTUP_INFO_PREFIX_NAME + CONFIG_STARTUP_INFO_COLUMN_FAMILY_NAME ); derive_store!( GenesisStore, String, GenesisInfo, - CONFIG_GENESIS_PREFIX_NAME + CONFIG_GENESIS_COLUMN_FAMILY_NAME ); pub trait ConfigStore { diff --git a/moveos/moveos-store/src/event_store/mod.rs b/moveos/moveos-store/src/event_store/mod.rs index 3ba87a2ce9..bfa0fca0f5 100644 --- a/moveos/moveos-store/src/event_store/mod.rs +++ b/moveos/moveos-store/src/event_store/mod.rs @@ -1,7 +1,7 @@ // Copyright (c) RoochNetwork // SPDX-License-Identifier: Apache-2.0 -use crate::{EVENT_HANDLE_PREFIX_NAME, EVENT_PREFIX_NAME}; +use crate::{EVENT_COLUMN_FAMILY_NAME, EVENT_HANDLE_COLUMN_FAMILY_NAME}; use anyhow::{anyhow, Result}; use move_core_types::language_storage::StructTag; use moveos_types::moveos_std::event::{Event, EventHandle, EventID, TransactionEvent}; @@ -10,13 +10,18 @@ use raw_store::{derive_store, CodecKVStore, StoreInstance}; use std::cmp::min; use std::collections::{HashMap, HashSet}; -derive_store!(EventDBBaseStore, (ObjectID, u64), Event, EVENT_PREFIX_NAME); +derive_store!( + EventDBBaseStore, + (ObjectID, u64), + Event, + EVENT_COLUMN_FAMILY_NAME +); derive_store!( EventHandleDBStore, ObjectID, EventHandle, - EVENT_HANDLE_PREFIX_NAME + EVENT_HANDLE_COLUMN_FAMILY_NAME ); pub trait EventStore { diff --git a/moveos/moveos-store/src/lib.rs b/moveos/moveos-store/src/lib.rs index 31e20a7ffa..5139e86975 100644 --- a/moveos/moveos-store/src/lib.rs +++ b/moveos/moveos-store/src/lib.rs @@ -37,24 +37,25 @@ pub mod state_store; mod tests; pub mod transaction_store; -// pub const DEFAULT_PREFIX_NAME: ColumnFamilyName = "default"; -pub const STATE_NODE_PREFIX_NAME: ColumnFamilyName = "state_node"; -pub const TRANSACTION_EXECUTION_INFO_PREFIX_NAME: ColumnFamilyName = "transaction_execution_info"; -pub const EVENT_PREFIX_NAME: ColumnFamilyName = "event"; -pub const EVENT_HANDLE_PREFIX_NAME: ColumnFamilyName = "event_handle"; -pub const CONFIG_STARTUP_INFO_PREFIX_NAME: ColumnFamilyName = "config_startup_info"; -pub const CONFIG_GENESIS_PREFIX_NAME: ColumnFamilyName = "config_genesis"; - -/// db store use prefix_name vec to init -/// Please note that adding a prefix needs to be added in vec simultaneously, remember!! -static VEC_PREFIX_NAME: Lazy> = Lazy::new(|| { +// pub const DEFAULT_COLUMN_FAMILY_NAME: ColumnFamilyName = "default"; +pub const STATE_NODE_COLUMN_FAMILY_NAME: ColumnFamilyName = "state_node"; +pub const TRANSACTION_EXECUTION_INFO_COLUMN_FAMILY_NAME: ColumnFamilyName = + "transaction_execution_info"; +pub const EVENT_COLUMN_FAMILY_NAME: ColumnFamilyName = "event"; +pub const EVENT_HANDLE_COLUMN_FAMILY_NAME: ColumnFamilyName = "event_handle"; +pub const CONFIG_STARTUP_INFO_COLUMN_FAMILY_NAME: ColumnFamilyName = "config_startup_info"; +pub const CONFIG_GENESIS_COLUMN_FAMILY_NAME: ColumnFamilyName = "config_genesis"; + +/// db store use cf_name vec to init +/// Please note that adding a column family needs to be added in vec simultaneously, remember!! +static VEC_COLUMN_FAMILY_NAME: Lazy> = Lazy::new(|| { vec![ - STATE_NODE_PREFIX_NAME, - TRANSACTION_EXECUTION_INFO_PREFIX_NAME, - EVENT_PREFIX_NAME, - EVENT_HANDLE_PREFIX_NAME, - CONFIG_STARTUP_INFO_PREFIX_NAME, - CONFIG_GENESIS_PREFIX_NAME, + STATE_NODE_COLUMN_FAMILY_NAME, + TRANSACTION_EXECUTION_INFO_COLUMN_FAMILY_NAME, + EVENT_COLUMN_FAMILY_NAME, + EVENT_HANDLE_COLUMN_FAMILY_NAME, + CONFIG_STARTUP_INFO_COLUMN_FAMILY_NAME, + CONFIG_GENESIS_COLUMN_FAMILY_NAME, ] }); @@ -63,7 +64,7 @@ pub struct StoreMeta {} impl StoreMeta { pub fn get_column_family_names() -> &'static [ColumnFamilyName] { - &VEC_PREFIX_NAME + &VEC_COLUMN_FAMILY_NAME } } @@ -82,7 +83,6 @@ impl MoveOSStore { db_path, StoreMeta::get_column_family_names().to_vec(), RocksdbConfig::default(), - None, )?); Self::new_with_instance(instance) } diff --git a/moveos/moveos-store/src/state_store/mod.rs b/moveos/moveos-store/src/state_store/mod.rs index 46e93feafc..4833577eea 100644 --- a/moveos/moveos-store/src/state_store/mod.rs +++ b/moveos/moveos-store/src/state_store/mod.rs @@ -3,7 +3,7 @@ pub mod statedb; -use crate::STATE_NODE_PREFIX_NAME; +use crate::STATE_NODE_COLUMN_FAMILY_NAME; use anyhow::Result; use moveos_types::h256::H256; use raw_store::rocks::batch::WriteBatch; @@ -12,7 +12,7 @@ use raw_store::{derive_store, WriteOp}; use smt::NodeReader; use std::collections::BTreeMap; -derive_store!(NodeDBStore, H256, Vec, STATE_NODE_PREFIX_NAME); +derive_store!(NodeDBStore, H256, Vec, STATE_NODE_COLUMN_FAMILY_NAME); impl NodeDBStore { pub fn put(&self, key: H256, node: Vec) -> Result<()> { diff --git a/moveos/moveos-store/src/tests/test_store.rs b/moveos/moveos-store/src/tests/test_store.rs index 1e739af9ef..3450ea9be2 100644 --- a/moveos/moveos-store/src/tests/test_store.rs +++ b/moveos/moveos-store/src/tests/test_store.rs @@ -13,7 +13,7 @@ use moveos_config::store_config::RocksdbConfig; use moveos_types::h256::H256; use moveos_types::moveos_std::event::TransactionEvent; use moveos_types::transaction::TransactionExecutionInfo; -use raw_store::rocks::{RocksDB, DEFAULT_PREFIX_NAME}; +use raw_store::rocks::{RocksDB, DEFAULT_COLUMN_FAMILY_NAME}; use raw_store::traits::DBStore; use raw_store::CodecKVStore; @@ -22,26 +22,32 @@ fn test_reopen() { let tmpdir = moveos_config::temp_dir(); let key = H256::random(); let value = H256::zero(); - let cfs = vec![DEFAULT_PREFIX_NAME]; + let cfs = vec![DEFAULT_COLUMN_FAMILY_NAME]; { - let db = RocksDB::new(tmpdir.path(), cfs.clone(), RocksdbConfig::default(), None).unwrap(); + let db = RocksDB::new(tmpdir.path(), cfs.clone(), RocksdbConfig::default()).unwrap(); db.put( - DEFAULT_PREFIX_NAME, + DEFAULT_COLUMN_FAMILY_NAME, bcs::to_bytes(&key).unwrap(), bcs::to_bytes(&value).unwrap(), ) .unwrap(); assert_eq!( - db.get(DEFAULT_PREFIX_NAME, bcs::to_bytes(&key).unwrap().as_slice()) - .unwrap(), + db.get( + DEFAULT_COLUMN_FAMILY_NAME, + bcs::to_bytes(&key).unwrap().as_slice() + ) + .unwrap(), Some(bcs::to_bytes(&value).unwrap()) ); } { - let db = RocksDB::new(tmpdir.path(), cfs, RocksdbConfig::default(), None).unwrap(); + let db = RocksDB::new(tmpdir.path(), cfs, RocksdbConfig::default()).unwrap(); assert_eq!( - db.get(DEFAULT_PREFIX_NAME, bcs::to_bytes(&key).unwrap().as_slice()) - .unwrap(), + db.get( + DEFAULT_COLUMN_FAMILY_NAME, + bcs::to_bytes(&key).unwrap().as_slice() + ) + .unwrap(), Some(bcs::to_bytes(&value).unwrap()) ); } @@ -50,26 +56,29 @@ fn test_reopen() { #[test] fn test_open_read_only() { let tmpdir = moveos_config::temp_dir(); - let cfs = vec![DEFAULT_PREFIX_NAME]; - let db = RocksDB::new(tmpdir.path(), cfs.clone(), RocksdbConfig::default(), None).unwrap(); + let cfs = vec![DEFAULT_COLUMN_FAMILY_NAME]; + let db = RocksDB::new(tmpdir.path(), cfs.clone(), RocksdbConfig::default()).unwrap(); let key = H256::random(); let value = H256::zero(); let result = db.put( - DEFAULT_PREFIX_NAME, + DEFAULT_COLUMN_FAMILY_NAME, bcs::to_bytes(&key).unwrap(), bcs::to_bytes(&value).unwrap(), ); assert!(result.is_ok()); let path = tmpdir.as_ref(); - let db = RocksDB::open_with_cfs(path, cfs, true, RocksdbConfig::default(), None).unwrap(); + let db = RocksDB::open_with_cfs(path, cfs, true, RocksdbConfig::default()).unwrap(); let result = db.put( - DEFAULT_PREFIX_NAME, + DEFAULT_COLUMN_FAMILY_NAME, bcs::to_bytes(&key).unwrap(), bcs::to_bytes(&value).unwrap(), ); assert!(result.is_err()); let result = db - .get(DEFAULT_PREFIX_NAME, bcs::to_bytes(&key).unwrap().as_slice()) + .get( + DEFAULT_COLUMN_FAMILY_NAME, + bcs::to_bytes(&key).unwrap().as_slice(), + ) .unwrap(); assert_eq!(result, Some(bcs::to_bytes(&value).unwrap())); } diff --git a/moveos/moveos-store/src/transaction_store/mod.rs b/moveos/moveos-store/src/transaction_store/mod.rs index fc5bba1d37..04a7260fca 100644 --- a/moveos/moveos-store/src/transaction_store/mod.rs +++ b/moveos/moveos-store/src/transaction_store/mod.rs @@ -6,14 +6,14 @@ use moveos_types::h256::H256; use moveos_types::transaction::TransactionExecutionInfo; use raw_store::CodecKVStore; -use crate::TRANSACTION_EXECUTION_INFO_PREFIX_NAME; +use crate::TRANSACTION_EXECUTION_INFO_COLUMN_FAMILY_NAME; use raw_store::derive_store; derive_store!( TransactionDBStore, H256, TransactionExecutionInfo, - TRANSACTION_EXECUTION_INFO_PREFIX_NAME + TRANSACTION_EXECUTION_INFO_COLUMN_FAMILY_NAME ); pub trait TransactionStore { diff --git a/moveos/raw-store/Cargo.toml b/moveos/raw-store/Cargo.toml index 4545c07d9e..0ab5149aa7 100644 --- a/moveos/raw-store/Cargo.toml +++ b/moveos/raw-store/Cargo.toml @@ -20,6 +20,7 @@ serde = { workspace = true } serde_bytes = { workspace = true } hex = { workspace = true } parking_lot = { workspace = true } +tap = { workspace = true } rocksdb = { workspace = true, features = ["lz4"], default-features = false } prometheus = { workspace = true } diff --git a/moveos/raw-store/src/lib.rs b/moveos/raw-store/src/lib.rs index 5e2f76ba8d..5f65e38dcb 100644 --- a/moveos/raw-store/src/lib.rs +++ b/moveos/raw-store/src/lib.rs @@ -10,74 +10,396 @@ pub mod rocks; pub mod store_macros; pub mod traits; +use crate::metrics::DBMetrics; use crate::rocks::batch::WriteBatch; use crate::rocks::{RocksDB, SchemaIterator}; use crate::traits::{DBStore, KVStore}; use anyhow::{bail, format_err, Result}; use moveos_common::utils::{from_bytes, to_bytes}; +use rocksdb::{properties, AsColumnFamilyRef}; use serde::de::DeserializeOwned; use serde::Serialize; use std::convert::TryInto; +use std::ffi::CStr; use std::fmt::Debug; use std::marker::PhantomData; use std::sync::Arc; +use std::time::Duration; +use tokio::sync::oneshot; +use tracing::{debug, error}; /// Type alias to improve readability. pub type ColumnFamilyName = &'static str; +pub const CF_METRICS_REPORT_PERIOD_MILLIS: u64 = 1000; +pub const METRICS_ERROR: i64 = -1; + +// TODO: remove this after Rust rocksdb has the TOTAL_BLOB_FILES_SIZE property built-in. +// From https://github.com/facebook/rocksdb/blob/bd80433c73691031ba7baa65c16c63a83aef201a/include/rocksdb/db.h#L1169 +const ROCKSDB_PROPERTY_TOTAL_BLOB_FILES_SIZE: &CStr = + unsafe { CStr::from_bytes_with_nul_unchecked("rocksdb.total-blob-file-size\0".as_bytes()) }; + ///Store instance type define #[derive(Clone)] #[allow(clippy::upper_case_acronyms)] pub enum StoreInstance { - DB { db: Arc }, + DB { + db: Arc, + db_metrics: Arc, + _metrics_task_cancel_handle: Arc>, + }, } +unsafe impl Send for StoreInstance {} + impl StoreInstance { pub fn new_db_instance(db: RocksDB) -> Self { - Self::DB { db: Arc::new(db) } + let db_arc = Arc::new(db); + let db_clone = db_arc.clone(); + let db_metrics_ref = DBMetrics::get(); + let db_metrics_arc = db_metrics_ref.clone(); + let (sender, mut recv) = tokio::sync::oneshot::channel(); + tokio::task::spawn(async move { + let mut interval = + tokio::time::interval(Duration::from_millis(CF_METRICS_REPORT_PERIOD_MILLIS)); + loop { + tokio::select! { + _ = interval.tick() => { + let cfs = db_clone.cfs.clone(); + for cf_name in cfs { + let db_clone_clone = db_clone.clone(); + let db_metrics_clone = db_metrics_ref.clone(); + if let Err(e) = tokio::task::spawn_blocking(move || { + Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone); + }).await { + error!("Failed to report cf metrics with error: {}", e); + } + } + } + _ = &mut recv => break, + } + } + debug!("Returning to report cf metrics task for StoreInstance"); + }); + Self::DB { + db: db_arc, + db_metrics: db_metrics_arc, + _metrics_task_cancel_handle: Arc::new(sender), + } } pub fn db(&self) -> Option<&RocksDB> { match self { - StoreInstance::DB { db } => Some(db.as_ref()), + StoreInstance::DB { + db, + db_metrics: _, + _metrics_task_cancel_handle: _, + } => Some(db.as_ref()), + } + } + + pub fn db_metrics(&self) -> Option<&DBMetrics> { + match self { + StoreInstance::DB { + db: _, + db_metrics, + _metrics_task_cancel_handle: _, + } => Some(db_metrics.as_ref()), } } pub fn db_mut(&mut self) -> Option<&mut RocksDB> { match self { - StoreInstance::DB { db } => Arc::get_mut(db), + StoreInstance::DB { + db, + db_metrics: _, + _metrics_task_cancel_handle: _, + } => Arc::get_mut(db), + } + } + + pub fn db_metrics_mut(&mut self) -> Option<&mut DBMetrics> { + match self { + StoreInstance::DB { + db: _, + db_metrics, + _metrics_task_cancel_handle: _, + } => Arc::get_mut(db_metrics), + } + } + + fn report_cf_metrics(rocksdb: &Arc, cf_name: &str, db_metrics: &Arc) { + let cf = rocksdb.get_cf_handle(cf_name); + db_metrics + .cf_metrics + .rocksdb_total_sst_files_size + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::TOTAL_SST_FILES_SIZE) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_total_blob_files_size + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, ROCKSDB_PROPERTY_TOTAL_BLOB_FILES_SIZE) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_size_all_mem_tables + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::SIZE_ALL_MEM_TABLES) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_num_snapshots + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::NUM_SNAPSHOTS) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_oldest_snapshot_time + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::OLDEST_SNAPSHOT_TIME) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_actual_delayed_write_rate + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::ACTUAL_DELAYED_WRITE_RATE) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_is_write_stopped + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::IS_WRITE_STOPPED) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_block_cache_capacity + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::BLOCK_CACHE_CAPACITY) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_block_cache_usage + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::BLOCK_CACHE_USAGE) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_block_cache_pinned_usage + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::BLOCK_CACHE_PINNED_USAGE) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocskdb_estimate_table_readers_mem + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::ESTIMATE_TABLE_READERS_MEM) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_estimated_num_keys + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::ESTIMATE_NUM_KEYS) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_mem_table_flush_pending + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::MEM_TABLE_FLUSH_PENDING) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocskdb_compaction_pending + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::COMPACTION_PENDING) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocskdb_num_running_compactions + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::NUM_RUNNING_COMPACTIONS) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_num_running_flushes + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::NUM_RUNNING_FLUSHES) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocksdb_estimate_oldest_key_time + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::ESTIMATE_OLDEST_KEY_TIME) + .unwrap_or(METRICS_ERROR), + ); + db_metrics + .cf_metrics + .rocskdb_background_errors + .with_label_values(&[cf_name]) + .set( + Self::get_int_property(rocksdb, &cf, properties::BACKGROUND_ERRORS) + .unwrap_or(METRICS_ERROR), + ); + } + + fn get_int_property( + rocksdb: &RocksDB, + cf: &impl AsColumnFamilyRef, + property_name: &'static std::ffi::CStr, + ) -> Result { + match rocksdb.property_int_value_cf(cf, property_name) { + Ok(Some(value)) => Ok(value.try_into().unwrap()), + Ok(None) => Ok(0), + Err(e) => Err(anyhow::Error::new(e)), + // Err(anyhow::Error::msg(format!("get_int_property error {}", e))), } } } impl DBStore for StoreInstance { - fn get(&self, prefix_name: &str, key: &[u8]) -> Result>> { + fn get(&self, cf_name: &str, key: &[u8]) -> Result>> { match self { - StoreInstance::DB { db } => db.get(prefix_name, key), + StoreInstance::DB { + db, + db_metrics, + _metrics_task_cancel_handle: _, + } => { + let _timer = db_metrics + .op_metrics + .rocksdb_get_latency_seconds + .with_label_values(&[cf_name]) + .start_timer(); + let res = db.get(cf_name, key)?; + db_metrics + .op_metrics + .rocksdb_get_bytes + .with_label_values(&[cf_name]) + .observe(res.as_ref().map_or(0.0, |v| v.len() as f64)); + Ok(res) + } } } - fn put(&self, prefix_name: &str, key: Vec, value: Vec) -> Result<()> { + fn put(&self, cf_name: &str, key: Vec, value: Vec) -> Result<()> { match self { - StoreInstance::DB { db } => db.put(prefix_name, key, value), + StoreInstance::DB { + db, + db_metrics, + _metrics_task_cancel_handle: _, + } => { + let _timer = db_metrics + .op_metrics + .rocksdb_put_latency_seconds + .with_label_values(&[cf_name]) + .start_timer(); + let put_bytes = key.len() + value.len(); + db.put(cf_name, key, value)?; + db_metrics + .op_metrics + .rocksdb_put_bytes + .with_label_values(&[cf_name]) + .observe(put_bytes as f64); + Ok(()) + } } } - fn contains_key(&self, prefix_name: &str, key: &[u8]) -> Result { + fn contains_key(&self, cf_name: &str, key: &[u8]) -> Result { match self { - StoreInstance::DB { db } => db.contains_key(prefix_name, key), + StoreInstance::DB { + db, + db_metrics, + _metrics_task_cancel_handle: _, + } => { + let _timer = db_metrics + .op_metrics + .rocksdb_get_latency_seconds + .with_label_values(&[cf_name]) + .start_timer(); + let res = db.contains_key(cf_name, key)?; + Ok(res) + } } } - fn remove(&self, prefix_name: &str, key: Vec) -> Result<()> { + fn remove(&self, cf_name: &str, key: Vec) -> Result<()> { match self { - StoreInstance::DB { db } => db.remove(prefix_name, key), + StoreInstance::DB { + db, + db_metrics, + _metrics_task_cancel_handle: _, + } => { + let _timer = db_metrics + .op_metrics + .rocksdb_get_latency_seconds + .with_label_values(&[cf_name]) + .start_timer(); + db.remove(cf_name, key)?; + db_metrics + .op_metrics + .rocksdb_deletes + .with_label_values(&[cf_name]) + .inc(); + Ok(()) + } } } - fn write_batch(&self, prefix_name: &str, batch: WriteBatch) -> Result<()> { + fn write_batch(&self, cf_name: &str, batch: WriteBatch) -> Result<()> { match self { - StoreInstance::DB { db } => db.write_batch(prefix_name, batch), + StoreInstance::DB { + db, + db_metrics, + _metrics_task_cancel_handle: _, + } => { + let _timer = db_metrics + .op_metrics + .rocksdb_write_batch_latency_seconds + .with_label_values(&[cf_name]) + .start_timer(); + let write_batch_bytes = batch.size_in_bytes(); + db.write_batch(cf_name, batch)?; + db_metrics + .op_metrics + .rocksdb_write_batch_bytes + .with_label_values(&[cf_name]) + .observe(write_batch_bytes as f64); + Ok(()) + } } } @@ -89,21 +411,75 @@ impl DBStore for StoreInstance { bail!("DB instance not support keys method!") } - fn put_sync(&self, prefix_name: &str, key: Vec, value: Vec) -> Result<()> { + fn put_sync(&self, cf_name: &str, key: Vec, value: Vec) -> Result<()> { match self { - StoreInstance::DB { db } => db.put_sync(prefix_name, key, value), + StoreInstance::DB { + db, + db_metrics, + _metrics_task_cancel_handle: _, + } => { + let _timer = db_metrics + .op_metrics + .rocksdb_put_sync_latency_seconds + .with_label_values(&[cf_name]) + .start_timer(); + let put_bytes = key.len() + value.len(); + db.put_sync(cf_name, key, value)?; + db_metrics + .op_metrics + .rocksdb_put_sync_bytes + .with_label_values(&[cf_name]) + .observe(put_bytes as f64); + Ok(()) + } } } - fn write_batch_sync(&self, prefix_name: &str, batch: WriteBatch) -> Result<()> { + fn write_batch_sync(&self, cf_name: &str, batch: WriteBatch) -> Result<()> { match self { - StoreInstance::DB { db } => db.write_batch_sync(prefix_name, batch), + StoreInstance::DB { + db, + db_metrics, + _metrics_task_cancel_handle: _, + } => { + let _timer = db_metrics + .op_metrics + .rocksdb_write_batch_sync_latency_seconds + .with_label_values(&[cf_name]) + .start_timer(); + let write_batch_bytes = batch.size_in_bytes(); + db.write_batch_sync(cf_name, batch)?; + db_metrics + .op_metrics + .rocksdb_write_batch_sync_bytes + .with_label_values(&[cf_name]) + .observe(write_batch_bytes as f64); + Ok(()) + } } } - fn multi_get(&self, prefix_name: &str, keys: Vec>) -> Result>>> { + fn multi_get(&self, cf_name: &str, keys: Vec>) -> Result>>> { match self { - StoreInstance::DB { db } => db.multi_get(prefix_name, keys), + StoreInstance::DB { + db, + db_metrics, + _metrics_task_cancel_handle: _, + } => { + let _timer = db_metrics + .op_metrics + .rocksdb_multiget_latency_seconds + .with_label_values(&[cf_name]) + .start_timer(); + let res = db.multi_get(cf_name, keys)?; + let res_size = res.iter().flatten().map(|entry| entry.len()).sum::(); + db_metrics + .op_metrics + .rocksdb_multiget_bytes + .with_label_values(&[cf_name]) + .observe(res_size as f64); + Ok(res) + } } } } @@ -120,7 +496,7 @@ pub struct InnerStore where CF: ColumnFamily, { - pub prefix_name: ColumnFamilyName, + pub cf_name: ColumnFamilyName, instance: StoreInstance, cf: PhantomData, } @@ -132,7 +508,7 @@ where pub fn new(instance: StoreInstance) -> Self { Self { instance, - prefix_name: CF::name(), + cf_name: CF::name(), cf: PhantomData, } } @@ -147,27 +523,27 @@ where CF: ColumnFamily, { fn get(&self, key: &[u8]) -> Result>> { - self.instance.get(self.prefix_name, key) + self.instance.get(self.cf_name, key) } fn multiple_get(&self, keys: Vec>) -> Result>>> { - self.instance.multi_get(self.prefix_name, keys) + self.instance.multi_get(self.cf_name, keys) } fn put(&self, key: Vec, value: Vec) -> Result<()> { - self.instance.put(self.prefix_name, key, value) + self.instance.put(self.cf_name, key, value) } fn contains_key(&self, key: &[u8]) -> Result { - self.instance.contains_key(self.prefix_name, key) + self.instance.contains_key(self.cf_name, key) } fn remove(&self, key: Vec) -> Result<()> { - self.instance.remove(self.prefix_name, key) + self.instance.remove(self.cf_name, key) } fn write_batch(&self, batch: WriteBatch) -> Result<()> { - self.instance.write_batch(self.prefix_name, batch) + self.instance.write_batch(self.cf_name, batch) } fn get_len(&self) -> Result { @@ -179,11 +555,11 @@ where } fn put_sync(&self, key: Vec, value: Vec) -> Result<()> { - self.instance.put_sync(self.prefix_name, key, value) + self.instance.put_sync(self.cf_name, key, value) } fn write_batch_sync(&self, batch: WriteBatch) -> Result<()> { - self.instance.write_batch_sync(self.prefix_name, batch) + self.instance.write_batch_sync(self.cf_name, batch) } } @@ -408,6 +784,6 @@ where .store() .db() .ok_or_else(|| format_err!("Only support scan on db store instance"))?; - db.iter::(self.get_store().prefix_name) + db.iter::(self.get_store().cf_name) } } diff --git a/moveos/raw-store/src/metrics.rs b/moveos/raw-store/src/metrics.rs index a55411dbfb..5d1f113ca6 100644 --- a/moveos/raw-store/src/metrics.rs +++ b/moveos/raw-store/src/metrics.rs @@ -1,192 +1,983 @@ // Copyright (c) RoochNetwork // SPDX-License-Identifier: Apache-2.0 -// Copyright (c) The Starcoin Core Contributors -// SPDX-License-Identifier: Apache-2 - -use anyhow::Result; -use coarsetime::Instant; -use metrics::{ - self, register, HistogramOpts, HistogramVec, Opts, PrometheusError, Registry, UIntCounterVec, - UIntGauge, +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +use once_cell::sync::OnceCell; +use prometheus::{ + register_histogram_vec_with_registry, register_int_counter_vec_with_registry, + register_int_gauge_vec_with_registry, HistogramVec, IntCounterVec, IntGaugeVec, Registry, }; +use rocksdb::perf::set_perf_stats; +use rocksdb::{PerfContext, PerfMetric, PerfStatsLevel}; +use std::cell::RefCell; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::Arc; +use std::time::Duration; +use tap::TapFallible; +use tracing::warn; + +thread_local! { + static PER_THREAD_ROCKS_PERF_CONTEXT: std::cell::RefCell = RefCell::new(PerfContext::default()); +} + +const LATENCY_SEC_BUCKETS: &[f64] = &[ + 0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1., 2.5, 5., 10., 20., 30., 60., 90., +]; + +#[derive(Debug, Clone)] +// A struct for sampling based on number of operations or duration. +// Sampling happens if the duration expires and after number of operations +pub struct SamplingInterval { + // Sample once every time duration + pub once_every_duration: Duration, + // Sample once every number of operations + pub after_num_ops: u64, + // Counter for keeping track of previous sample + pub counter: Arc, +} + +impl Default for SamplingInterval { + fn default() -> Self { + // Enabled with 60 second interval + SamplingInterval::new(Duration::from_secs(60), 0) + } +} -#[derive(Clone)] -pub struct StoreMetrics { - pub store_rw_total: UIntCounterVec, - pub store_item_bytes: HistogramVec, - pub store_time: HistogramVec, - pub cache_items: UIntGauge, -} - -impl StoreMetrics { - pub fn register(registry: &Registry) -> Result { - let store_rw_total = register( - UIntCounterVec::new( - Opts::new("store_rw_total", "Counters of how many store read/write"), - &["store_type", "key_type", "method", "result"], - )?, - registry, - )?; - let store_item_bytes = register( - HistogramVec::new( - HistogramOpts::new("store_item_bytes", "store write item size in bytes"), - &["key_type"], - )?, - registry, - )?; - - let store_time = register( - HistogramVec::new( - HistogramOpts::new( - "store_time", - "Histogram of store, measure store method time usage.", - ), - &["store_type", "key_type", "method"], - )?, - registry, - )?; - - let cache_items = register( - UIntGauge::with_opts(Opts::new("cache_items", "How many items in cache"))?, - registry, - )?; - - Ok(Self { - store_rw_total, - store_item_bytes, - store_time, - cache_items, - }) - } -} - -#[allow(clippy::upper_case_acronyms)] -pub enum ResultType { - NONE, - SOME, - OK, - ERROR, -} - -impl ResultType { - pub fn into_str(self) -> &'static str { - match self { - ResultType::NONE => "none", - ResultType::ERROR => "error", - ResultType::OK => "ok", - ResultType::SOME => "some", +impl SamplingInterval { + pub fn new(once_every_duration: Duration, after_num_ops: u64) -> Self { + let counter = Arc::new(AtomicU64::new(1)); + if !once_every_duration.is_zero() { + let counter = counter.clone(); + tokio::task::spawn(async move { + loop { + if counter.load(Ordering::SeqCst) > after_num_ops { + counter.store(0, Ordering::SeqCst); + } + tokio::time::sleep(once_every_duration).await; + } + }); + } + SamplingInterval { + once_every_duration, + after_num_ops, + counter, + } + } + + pub fn new_from_self(&self) -> SamplingInterval { + SamplingInterval::new(self.once_every_duration, self.after_num_ops) + } + + pub fn sample(&self) -> bool { + if self.once_every_duration.is_zero() { + self.counter.fetch_add(1, Ordering::Relaxed) % (self.after_num_ops + 1) == 0 + } else { + self.counter.fetch_add(1, Ordering::Relaxed) == 0 } } } -pub trait AsResultType { - fn as_result_type(&self) -> ResultType; +#[derive(Debug)] +pub struct ColumnFamilyMetrics { + pub rocksdb_total_sst_files_size: IntGaugeVec, + pub rocksdb_total_blob_files_size: IntGaugeVec, + pub rocksdb_size_all_mem_tables: IntGaugeVec, + pub rocksdb_num_snapshots: IntGaugeVec, + pub rocksdb_oldest_snapshot_time: IntGaugeVec, + pub rocksdb_actual_delayed_write_rate: IntGaugeVec, + pub rocksdb_is_write_stopped: IntGaugeVec, + pub rocksdb_block_cache_capacity: IntGaugeVec, + pub rocksdb_block_cache_usage: IntGaugeVec, + pub rocksdb_block_cache_pinned_usage: IntGaugeVec, + pub rocskdb_estimate_table_readers_mem: IntGaugeVec, + pub rocksdb_mem_table_flush_pending: IntGaugeVec, + pub rocskdb_compaction_pending: IntGaugeVec, + pub rocskdb_num_running_compactions: IntGaugeVec, + pub rocksdb_num_running_flushes: IntGaugeVec, + pub rocksdb_estimate_oldest_key_time: IntGaugeVec, + pub rocskdb_background_errors: IntGaugeVec, + pub rocksdb_estimated_num_keys: IntGaugeVec, } -impl AsResultType for Result<()> { - fn as_result_type(&self) -> ResultType { - match self { - Ok(_) => ResultType::OK, - Err(_) => ResultType::ERROR, +impl ColumnFamilyMetrics { + pub(crate) fn new(registry: &Registry) -> Self { + ColumnFamilyMetrics { + rocksdb_total_sst_files_size: register_int_gauge_vec_with_registry!( + "rocksdb_total_sst_files_size", + "The storage size occupied by the sst files in the column family", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_total_blob_files_size: register_int_gauge_vec_with_registry!( + "rocksdb_total_blob_files_size", + "The storage size occupied by the blob files in the column family", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_size_all_mem_tables: register_int_gauge_vec_with_registry!( + "rocksdb_size_all_mem_tables", + "The memory size occupied by the column family's in-memory buffer", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_num_snapshots: register_int_gauge_vec_with_registry!( + "rocksdb_num_snapshots", + "Number of snapshots held for the column family", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_oldest_snapshot_time: register_int_gauge_vec_with_registry!( + "rocksdb_oldest_snapshot_time", + "Unit timestamp of the oldest unreleased snapshot", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_actual_delayed_write_rate: register_int_gauge_vec_with_registry!( + "rocksdb_actual_delayed_write_rate", + "The current actual delayed write rate. 0 means no delay", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_is_write_stopped: register_int_gauge_vec_with_registry!( + "rocksdb_is_write_stopped", + "A flag indicating whether writes are stopped on this column family. 1 indicates writes have been stopped.", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_block_cache_capacity: register_int_gauge_vec_with_registry!( + "rocksdb_block_cache_capacity", + "The block cache capacity of the column family.", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_block_cache_usage: register_int_gauge_vec_with_registry!( + "rocksdb_block_cache_usage", + "The memory size used by the column family in the block cache.", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_block_cache_pinned_usage: register_int_gauge_vec_with_registry!( + "rocksdb_block_cache_pinned_usage", + "The memory size used by the column family in the block cache where entries are pinned", + &["cf_name"], + registry, + ) + .unwrap(), + rocskdb_estimate_table_readers_mem: register_int_gauge_vec_with_registry!( + "rocskdb_estimate_table_readers_mem", + "The estimated memory size used for reading SST tables in this column + family such as filters and index blocks. Note that this number does not + include the memory used in block cache.", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_mem_table_flush_pending: register_int_gauge_vec_with_registry!( + "rocksdb_mem_table_flush_pending", + "A 1 or 0 flag indicating whether a memtable flush is pending. + If this number is 1, it means a memtable is waiting for being flushed, + but there might be too many L0 files that prevents it from being flushed.", + &["cf_name"], + registry, + ) + .unwrap(), + rocskdb_compaction_pending: register_int_gauge_vec_with_registry!( + "rocskdb_compaction_pending", + "A 1 or 0 flag indicating whether a compaction job is pending. + If this number is 1, it means some part of the column family requires + compaction in order to maintain shape of LSM tree, but the compaction + is pending because the desired compaction job is either waiting for + other dependent compactions to be finished or waiting for an available + compaction thread.", + &["cf_name"], + registry, + ) + .unwrap(), + rocskdb_num_running_compactions: register_int_gauge_vec_with_registry!( + "rocskdb_num_running_compactions", + "The number of compactions that are currently running for the column family.", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_num_running_flushes: register_int_gauge_vec_with_registry!( + "rocksdb_num_running_flushes", + "The number of flushes that are currently running for the column family.", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_estimate_oldest_key_time: register_int_gauge_vec_with_registry!( + "rocksdb_estimate_oldest_key_time", + "Estimation of the oldest key timestamp in the DB. Only available + for FIFO compaction with compaction_options_fifo.allow_compaction = false.", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_estimated_num_keys: register_int_gauge_vec_with_registry!( + "rocksdb_estimated_num_keys", + "The estimated number of keys in the table", + &["cf_name"], + registry, + ) + .unwrap(), + rocskdb_background_errors: register_int_gauge_vec_with_registry!( + "rocskdb_background_errors", + "The accumulated number of RocksDB background errors.", + &["cf_name"], + registry, + ) + .unwrap(), + } } } -impl AsResultType for Result { - fn as_result_type(&self) -> ResultType { - match self { - Ok(_) => ResultType::OK, - Err(_) => ResultType::ERROR, +#[derive(Debug)] +pub struct OperationMetrics { + pub rocksdb_iter_latency_seconds: HistogramVec, + pub rocksdb_iter_bytes: HistogramVec, + pub rocksdb_iter_keys: HistogramVec, + pub rocksdb_get_latency_seconds: HistogramVec, + pub rocksdb_get_bytes: HistogramVec, + pub rocksdb_multiget_latency_seconds: HistogramVec, + pub rocksdb_multiget_bytes: HistogramVec, + pub rocksdb_put_latency_seconds: HistogramVec, + pub rocksdb_put_bytes: HistogramVec, + pub rocksdb_write_batch_latency_seconds: HistogramVec, + pub rocksdb_write_batch_bytes: HistogramVec, + pub rocksdb_put_sync_latency_seconds: HistogramVec, + pub rocksdb_put_sync_bytes: HistogramVec, + pub rocksdb_write_batch_sync_latency_seconds: HistogramVec, + pub rocksdb_write_batch_sync_bytes: HistogramVec, + pub rocksdb_delete_latency_seconds: HistogramVec, + pub rocksdb_deletes: IntCounterVec, + // pub rocksdb_batch_commit_latency_seconds: HistogramVec, + // pub rocksdb_batch_commit_bytes: HistogramVec, + pub rocksdb_num_active_cf_handles: IntGaugeVec, +} + +impl OperationMetrics { + pub(crate) fn new(registry: &Registry) -> Self { + OperationMetrics { + rocksdb_iter_latency_seconds: register_histogram_vec_with_registry!( + "rocksdb_iter_latency_seconds", + "Rocksdb iter latency in seconds", + &["cf_name"], + LATENCY_SEC_BUCKETS.to_vec(), + registry, + ) + .unwrap(), + rocksdb_iter_bytes: register_histogram_vec_with_registry!( + "rocksdb_iter_bytes", + "Rocksdb iter size in bytes", + &["cf_name"], + prometheus::exponential_buckets(1.0, 4.0, 15) + .unwrap() + .to_vec(), + registry, + ) + .unwrap(), + rocksdb_iter_keys: register_histogram_vec_with_registry!( + "rocksdb_iter_keys", + "Rocksdb iter num keys", + &["cf_name"], + registry, + ) + .unwrap(), + rocksdb_get_latency_seconds: register_histogram_vec_with_registry!( + "rocksdb_get_latency_seconds", + "Rocksdb get latency in seconds", + &["cf_name"], + LATENCY_SEC_BUCKETS.to_vec(), + registry, + ) + .unwrap(), + rocksdb_get_bytes: register_histogram_vec_with_registry!( + "rocksdb_get_bytes", + "Rocksdb get call returned data size in bytes", + &["cf_name"], + prometheus::exponential_buckets(1.0, 4.0, 15) + .unwrap() + .to_vec(), + registry + ) + .unwrap(), + rocksdb_multiget_latency_seconds: register_histogram_vec_with_registry!( + "rocksdb_multiget_latency_seconds", + "Rocksdb multiget latency in seconds", + &["cf_name"], + LATENCY_SEC_BUCKETS.to_vec(), + registry, + ) + .unwrap(), + rocksdb_multiget_bytes: register_histogram_vec_with_registry!( + "rocksdb_multiget_bytes", + "Rocksdb multiget call returned data size in bytes", + &["cf_name"], + prometheus::exponential_buckets(1.0, 4.0, 15) + .unwrap() + .to_vec(), + registry, + ) + .unwrap(), + rocksdb_put_latency_seconds: register_histogram_vec_with_registry!( + "rocksdb_put_latency_seconds", + "Rocksdb put latency in seconds", + &["cf_name"], + LATENCY_SEC_BUCKETS.to_vec(), + registry, + ) + .unwrap(), + rocksdb_put_bytes: register_histogram_vec_with_registry!( + "rocksdb_put_bytes", + "Rocksdb put call puts data size in bytes", + &["cf_name"], + prometheus::exponential_buckets(1.0, 4.0, 15) + .unwrap() + .to_vec(), + registry, + ) + .unwrap(), + rocksdb_write_batch_latency_seconds: register_histogram_vec_with_registry!( + "rocksdb_write_batch_latency_seconds", + "Rocksdb write batch latency in seconds", + &["cf_name"], + LATENCY_SEC_BUCKETS.to_vec(), + registry, + ) + .unwrap(), + rocksdb_write_batch_bytes: register_histogram_vec_with_registry!( + "rocksdb_write_batch_bytes", + "Rocksdb write batch puts data size in bytes", + &["cf_name"], + prometheus::exponential_buckets(1.0, 4.0, 15) + .unwrap() + .to_vec(), + registry, + ) + .unwrap(), + rocksdb_put_sync_latency_seconds: register_histogram_vec_with_registry!( + "rocksdb_put_sync_latency_seconds", + "Rocksdb put sync latency in seconds", + &["cf_name"], + LATENCY_SEC_BUCKETS.to_vec(), + registry, + ) + .unwrap(), + rocksdb_put_sync_bytes: register_histogram_vec_with_registry!( + "rocksdb_put_sync_bytes", + "Rocksdb put sync call puts data size in bytes", + &["cf_name"], + prometheus::exponential_buckets(1.0, 4.0, 15) + .unwrap() + .to_vec(), + registry, + ) + .unwrap(), + rocksdb_write_batch_sync_latency_seconds: register_histogram_vec_with_registry!( + "rocksdb_write_batch_sync_latency_seconds", + "Rocksdb write batch sync latency in seconds", + &["cf_name"], + LATENCY_SEC_BUCKETS.to_vec(), + registry, + ) + .unwrap(), + rocksdb_write_batch_sync_bytes: register_histogram_vec_with_registry!( + "rocksdb_write_batch_sync_bytes", + "Rocksdb write batch sync call puts data size in bytes", + &["cf_name"], + prometheus::exponential_buckets(1.0, 4.0, 15) + .unwrap() + .to_vec(), + registry, + ) + .unwrap(), + rocksdb_delete_latency_seconds: register_histogram_vec_with_registry!( + "rocksdb_delete_latency_seconds", + "Rocksdb delete latency in seconds", + &["cf_name"], + LATENCY_SEC_BUCKETS.to_vec(), + registry, + ) + .unwrap(), + rocksdb_deletes: register_int_counter_vec_with_registry!( + "rocksdb_deletes", + "Rocksdb delete calls", + &["cf_name"], + registry + ) + .unwrap(), + // rocksdb_batch_commit_latency_seconds: register_histogram_vec_with_registry!( + // "rocksdb_write_batch_commit_latency_seconds", + // "Rocksdb schema batch commit latency in seconds", + // &["cf_name"], + // LATENCY_SEC_BUCKETS.to_vec(), + // registry, + // ) + // .unwrap(), + // rocksdb_batch_commit_bytes: register_histogram_vec_with_registry!( + // "rocksdb_batch_commit_bytes", + // "Rocksdb schema batch commit size in bytes", + // &["cf_name"], + // prometheus::exponential_buckets(1.0, 4.0, 15) + // .unwrap() + // .to_vec(), + // registry, + // ) + // .unwrap(), + rocksdb_num_active_cf_handles: register_int_gauge_vec_with_registry!( + "rocksdb_num_active_cf_handles", + "Number of active column family handles", + &["cf_name"], + registry, + ) + .unwrap(), } } } -impl AsResultType for Result> { - fn as_result_type(&self) -> ResultType { - match self { - Ok(v) => match v { - Some(_) => ResultType::SOME, - None => ResultType::NONE, - }, - Err(_) => ResultType::ERROR, - } +pub struct RocksDBPerfContext; + +impl Default for RocksDBPerfContext { + fn default() -> Self { + set_perf_stats(PerfStatsLevel::EnableTime); + PER_THREAD_ROCKS_PERF_CONTEXT.with(|perf_context| { + perf_context.borrow_mut().reset(); + }); + RocksDBPerfContext {} } } -impl AsResultType for Result>> { - fn as_result_type(&self) -> ResultType { - match self { - Ok(_) => ResultType::OK, - Err(_) => ResultType::ERROR, - } +impl Drop for RocksDBPerfContext { + fn drop(&mut self) { + set_perf_stats(PerfStatsLevel::Disable); } } -pub struct MetricsRecord<'a> { - store_type: &'a str, - key_type: &'a str, - method: &'a str, - timer: Instant, - metrics: Option<&'a StoreMetrics>, -} - -impl<'a> MetricsRecord<'a> { - pub fn new( - store_type: &'a str, - key_type: &'a str, - method: &'a str, - metrics: Option<&'a StoreMetrics>, - ) -> Self { - let timer = Instant::now(); - MetricsRecord { - store_type, - key_type, - method, - timer, - metrics, +#[derive(Debug)] +pub struct ReadContextMetrics { + pub user_key_comparison_count: IntCounterVec, + pub block_cache_hit_count: IntCounterVec, + pub block_read_count: IntCounterVec, + pub block_read_byte: IntCounterVec, + pub block_read_nanos: IntCounterVec, + pub block_checksum_nanos: IntCounterVec, + pub block_decompress_nanos: IntCounterVec, + pub get_read_bytes: IntCounterVec, + pub multiget_read_bytes: IntCounterVec, + pub get_snapshot_nanos: IntCounterVec, + pub get_from_memtable_nanos: IntCounterVec, + pub get_from_memtable_count: IntCounterVec, + pub get_post_process_nanos: IntCounterVec, + pub get_from_output_files_nanos: IntCounterVec, + pub db_mutex_lock_nanos: IntCounterVec, + pub db_condition_wait_nanos: IntCounterVec, + pub merge_operator_nanos: IntCounterVec, + pub read_index_block_nanos: IntCounterVec, + pub read_filter_block_nanos: IntCounterVec, + pub new_table_block_iter_nanos: IntCounterVec, + pub block_seek_nanos: IntCounterVec, + pub find_table_nanos: IntCounterVec, + pub bloom_memtable_hit_count: IntCounterVec, + pub bloom_memtable_miss_count: IntCounterVec, + pub bloom_sst_hit_count: IntCounterVec, + pub bloom_sst_miss_count: IntCounterVec, + pub key_lock_wait_time: IntCounterVec, + pub key_lock_wait_count: IntCounterVec, + pub internal_delete_skipped_count: IntCounterVec, + pub internal_skipped_count: IntCounterVec, +} + +impl ReadContextMetrics { + pub(crate) fn new(registry: &Registry) -> Self { + ReadContextMetrics { + user_key_comparison_count: register_int_counter_vec_with_registry!( + "user_key_comparison_count", + "Helps us figure out whether too many comparisons in binary search can be a problem, + especially when a more expensive comparator is used. Moreover, since number of comparisons + is usually uniform based on the memtable size, the SST file size for Level 0 and size of other + levels, an significant increase of the counter can indicate unexpected LSM-tree shape. + You may want to check whether flush/compaction can keep up with the write speed", + &["cf_name"], + registry, + ) + .unwrap(), + block_cache_hit_count: register_int_counter_vec_with_registry!( + "block_cache_hit_count", + "Tells us how many times we read data blocks from block cache, and block_read_count tells us how many + times we have to read blocks from the file system (either block cache is disabled or it is a cache miss). + We can evaluate the block cache efficiency by looking at the two counters over time.", + &["cf_name"], + registry, + ) + .unwrap(), + block_read_count: register_int_counter_vec_with_registry!( + "block_read_count", + "Tells us how many times we have to read blocks from the file system (either block cache is disabled or it is a cache miss)", + &["cf_name"], + registry, + ) + .unwrap(), + block_read_byte: register_int_counter_vec_with_registry!( + "block_read_byte", + "Tells us how many total bytes we read from the file system. It can tell us whether a slow query can be caused by reading + large blocks from the file system. Index and bloom filter blocks are usually large blocks. A large block can also be the result + of a very large key or value", + &["cf_name"], + registry, + ) + .unwrap(), + block_read_nanos: register_int_counter_vec_with_registry!( + "block_read_nanos", + "Total nanos spent on block reads", + &["cf_name"], + registry, + ) + .unwrap(), + block_checksum_nanos: register_int_counter_vec_with_registry!( + "block_checksum_nanos", + "Total nanos spent on verifying block checksum", + &["cf_name"], + registry, + ) + .unwrap(), + block_decompress_nanos: register_int_counter_vec_with_registry!( + "block_decompress_nanos", + "Total nanos spent on decompressing a block", + &["cf_name"], + registry, + ) + .unwrap(), + get_read_bytes: register_int_counter_vec_with_registry!( + "get_read_bytes", + "Total bytes for values returned by Get", + &["cf_name"], + registry, + ) + .unwrap(), + multiget_read_bytes: register_int_counter_vec_with_registry!( + "multiget_read_bytes", + "Total bytes for values returned by MultiGet.", + &["cf_name"], + registry, + ) + .unwrap(), + get_snapshot_nanos: register_int_counter_vec_with_registry!( + "get_snapshot_nanos", + "Time spent in getting snapshot.", + &["cf_name"], + registry, + ) + .unwrap(), + get_from_memtable_nanos: register_int_counter_vec_with_registry!( + "get_from_memtable_nanos", + "Time spent on reading data from memtable.", + &["cf_name"], + registry, + ) + .unwrap(), + get_from_memtable_count: register_int_counter_vec_with_registry!( + "get_from_memtable_count", + "Number of memtables queried", + &["cf_name"], + registry, + ) + .unwrap(), + get_post_process_nanos: register_int_counter_vec_with_registry!( + "get_post_process_nanos", + "Total nanos spent after Get() finds a key", + &["cf_name"], + registry, + ) + .unwrap(), + get_from_output_files_nanos: register_int_counter_vec_with_registry!( + "get_from_output_files_nanos", + "Total nanos reading from output files", + &["cf_name"], + registry, + ) + .unwrap(), + db_mutex_lock_nanos: register_int_counter_vec_with_registry!( + "db_mutex_lock_nanos", + "Time spent on acquiring db mutex", + &["cf_name"], + registry, + ) + .unwrap(), + db_condition_wait_nanos: register_int_counter_vec_with_registry!( + "db_condition_wait_nanos", + "Time spent waiting with a condition variable created with DB Mutex.", + &["cf_name"], + registry, + ) + .unwrap(), + merge_operator_nanos: register_int_counter_vec_with_registry!( + "merge_operator_nanos", + "Time spent on merge operator.", + &["cf_name"], + registry, + ) + .unwrap(), + read_index_block_nanos: register_int_counter_vec_with_registry!( + "read_index_block_nanos", + "Time spent on reading index block from block cache or SST file", + &["cf_name"], + registry, + ) + .unwrap(), + read_filter_block_nanos: register_int_counter_vec_with_registry!( + "read_filter_block_nanos", + "Time spent on reading filter block from block cache or SST file", + &["cf_name"], + registry, + ) + .unwrap(), + new_table_block_iter_nanos: register_int_counter_vec_with_registry!( + "new_table_block_iter_nanos", + "Time spent on creating data block iterator", + &["cf_name"], + registry, + ) + .unwrap(), + block_seek_nanos: register_int_counter_vec_with_registry!( + "block_seek_nanos", + "Time spent on seeking a key in data/index blocks", + &["cf_name"], + registry, + ) + .unwrap(), + find_table_nanos: register_int_counter_vec_with_registry!( + "find_table_nanos", + "Time spent on finding or creating a table reader", + &["cf_name"], + registry, + ) + .unwrap(), + bloom_memtable_hit_count: register_int_counter_vec_with_registry!( + "bloom_memtable_hit_count", + "Total number of mem table bloom hits", + &["cf_name"], + registry, + ) + .unwrap(), + bloom_memtable_miss_count: register_int_counter_vec_with_registry!( + "bloom_memtable_miss_count", + "Total number of mem table bloom misses", + &["cf_name"], + registry, + ) + .unwrap(), + bloom_sst_hit_count: register_int_counter_vec_with_registry!( + "bloom_sst_hit_count", + "Total number of SST table bloom hits", + &["cf_name"], + registry, + ) + .unwrap(), + bloom_sst_miss_count: register_int_counter_vec_with_registry!( + "bloom_sst_miss_count", + "Total number of SST table bloom misses", + &["cf_name"], + registry, + ) + .unwrap(), + key_lock_wait_time: register_int_counter_vec_with_registry!( + "key_lock_wait_time", + "Time spent waiting on key locks in transaction lock manager", + &["cf_name"], + registry, + ) + .unwrap(), + key_lock_wait_count: register_int_counter_vec_with_registry!( + "key_lock_wait_count", + "Number of times acquiring a lock was blocked by another transaction", + &["cf_name"], + registry, + ) + .unwrap(), + internal_delete_skipped_count: register_int_counter_vec_with_registry!( + "internal_delete_skipped_count", + "Total number of deleted keys skipped during iteration", + &["cf_name"], + registry, + ) + .unwrap(), + internal_skipped_count: register_int_counter_vec_with_registry!( + "internal_skipped_count", + "Totall number of internal keys skipped during iteration", + &["cf_name"], + registry, + ) + .unwrap(), } } - pub fn record(self, result: R) -> R - where - R: AsResultType, - { - let result_type = result.as_result_type(); - if let Some(metrics) = self.metrics { - metrics - .store_rw_total - .with_label_values(&[ - self.store_type, - self.key_type, - self.method, - result_type.into_str(), - ]) - .inc(); - metrics - .store_time - .with_label_values(&[self.store_type, self.key_type, self.method]) - .observe(self.timer.elapsed().as_f64()); - } - result + pub fn report_metrics(&self, cf_name: &str) { + PER_THREAD_ROCKS_PERF_CONTEXT.with(|perf_context_cell| { + set_perf_stats(PerfStatsLevel::Disable); + let perf_context = perf_context_cell.borrow(); + self.user_key_comparison_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::UserKeyComparisonCount)); + self.block_cache_hit_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::BlockCacheHitCount)); + self.block_read_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::BlockReadCount)); + self.block_read_byte + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::BlockReadByte)); + self.block_read_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::BlockReadTime)); + self.block_read_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::BlockReadCount)); + self.block_checksum_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::BlockChecksumTime)); + self.block_decompress_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::BlockDecompressTime)); + self.get_read_bytes + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::GetReadBytes)); + self.multiget_read_bytes + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::MultigetReadBytes)); + self.get_snapshot_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::GetSnapshotTime)); + self.get_from_memtable_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::GetFromMemtableTime)); + self.get_from_memtable_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::GetFromMemtableCount)); + self.get_post_process_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::GetPostProcessTime)); + self.get_from_output_files_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::GetFromOutputFilesTime)); + self.db_mutex_lock_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::DbMutexLockNanos)); + self.db_condition_wait_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::DbConditionWaitNanos)); + self.merge_operator_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::MergeOperatorTimeNanos)); + self.read_index_block_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::ReadIndexBlockNanos)); + self.read_filter_block_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::ReadFilterBlockNanos)); + self.new_table_block_iter_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::NewTableBlockIterNanos)); + self.block_seek_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::BlockSeekNanos)); + self.find_table_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::FindTableNanos)); + self.bloom_memtable_hit_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::BloomMemtableHitCount)); + self.bloom_memtable_miss_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::BloomMemtableMissCount)); + self.bloom_sst_hit_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::BloomSstHitCount)); + self.bloom_sst_miss_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::BloomSstMissCount)); + self.key_lock_wait_time + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::KeyLockWaitTime)); + self.key_lock_wait_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::KeyLockWaitCount)); + self.internal_delete_skipped_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::InternalDeleteSkippedCount)); + self.internal_skipped_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::InternalKeySkippedCount)); + }); } +} + +#[derive(Debug)] +pub struct WriteContextMetrics { + pub write_wal_nanos: IntCounterVec, + pub write_memtable_nanos: IntCounterVec, + pub write_delay_nanos: IntCounterVec, + pub write_pre_and_post_process_nanos: IntCounterVec, + pub write_db_mutex_lock_nanos: IntCounterVec, + pub write_db_condition_wait_nanos: IntCounterVec, + pub write_key_lock_wait_nanos: IntCounterVec, + pub write_key_lock_wait_count: IntCounterVec, +} - pub fn call(self, f: F) -> R - where - F: FnOnce() -> R, - R: AsResultType, - { - let r = f(); - self.record(r) +impl WriteContextMetrics { + pub(crate) fn new(registry: &Registry) -> Self { + WriteContextMetrics { + write_wal_nanos: register_int_counter_vec_with_registry!( + "write_wal_nanos", + "Total nanos spent on writing to WAL", + &["cf_name"], + registry, + ) + .unwrap(), + write_memtable_nanos: register_int_counter_vec_with_registry!( + "write_memtable_nanos", + "Total nanos spent on writing to memtable", + &["cf_name"], + registry, + ) + .unwrap(), + write_delay_nanos: register_int_counter_vec_with_registry!( + "write_delay_nanos", + "Total nanos spent on delaying or throttling write", + &["cf_name"], + registry, + ) + .unwrap(), + write_pre_and_post_process_nanos: register_int_counter_vec_with_registry!( + "write_pre_and_post_process_nanos", + "Total nanos spent on writing a record, excluding the above four things", + &["cf_name"], + registry, + ) + .unwrap(), + write_db_mutex_lock_nanos: register_int_counter_vec_with_registry!( + "write_db_mutex_lock_nanos", + "Time spent on acquiring db mutex", + &["cf_name"], + registry, + ) + .unwrap(), + write_db_condition_wait_nanos: register_int_counter_vec_with_registry!( + "write_db_condition_wait_nanos", + "Time spent waiting with a condition variable created with DB Mutex.", + &["cf_name"], + registry, + ) + .unwrap(), + write_key_lock_wait_nanos: register_int_counter_vec_with_registry!( + "write_key_lock_wait_time", + "Time spent waiting on key locks in transaction lock manager", + &["cf_name"], + registry, + ) + .unwrap(), + write_key_lock_wait_count: register_int_counter_vec_with_registry!( + "write_key_lock_wait_count", + "Number of times acquiring a lock was blocked by another transaction", + &["cf_name"], + registry, + ) + .unwrap(), + } + } + pub fn report_metrics(&self, cf_name: &str) { + PER_THREAD_ROCKS_PERF_CONTEXT.with(|perf_context_cell| { + set_perf_stats(PerfStatsLevel::Disable); + let perf_context = perf_context_cell.borrow(); + self.write_wal_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::WriteWalTime)); + self.write_memtable_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::WriteMemtableTime)); + self.write_delay_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::WriteDelayTime)); + self.write_pre_and_post_process_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::WritePreAndPostProcessTime)); + self.write_db_mutex_lock_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::DbMutexLockNanos)); + self.write_db_condition_wait_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::DbConditionWaitNanos)); + self.write_key_lock_wait_nanos + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::KeyLockWaitTime)); + self.write_key_lock_wait_count + .with_label_values(&[cf_name]) + .inc_by(perf_context.metric(PerfMetric::KeyLockWaitCount)); + }); } } -//TODO implement a generic metrics macros. -pub fn record_metrics<'a>( - store_type: &'a str, - key_type: &'a str, - method: &'a str, - metrics: Option<&'a StoreMetrics>, -) -> MetricsRecord<'a> { - MetricsRecord::new(store_type, key_type, method, metrics) +#[derive(Debug)] +pub struct DBMetrics { + pub op_metrics: OperationMetrics, + pub cf_metrics: ColumnFamilyMetrics, + pub read_ctx_metrics: ReadContextMetrics, + pub write_ctx_metrics: WriteContextMetrics, +} + +static ONCE: OnceCell> = OnceCell::new(); + +impl DBMetrics { + fn new(registry: &Registry) -> Self { + DBMetrics { + op_metrics: OperationMetrics::new(registry), + cf_metrics: ColumnFamilyMetrics::new(registry), + read_ctx_metrics: ReadContextMetrics::new(registry), + write_ctx_metrics: WriteContextMetrics::new(registry), + } + } + pub fn init(registry: &Registry) -> &'static Arc { + // Initialize this before creating any instance of DBMap + // TODO: Remove static initialization because this basically means we can + // only ever initialize db metrics once with a registry whereas + // in the code we might want to initialize it with different + // registries. The problem is underlying metrics cannot be re-initialized + // or prometheus complains. We essentially need to pass in DBMetrics + // everywhere we create DBMap as the right fix + let _ = ONCE + .set(Arc::new(DBMetrics::new(registry))) + // this happens many times during tests + .tap_err(|_| warn!("DBMetrics registry overwritten")); + ONCE.get().unwrap() + } + pub fn increment_num_active_dbs(&self, cf_name: &str) { + self.op_metrics + .rocksdb_num_active_cf_handles + .with_label_values(&[cf_name]) + .inc(); + } + pub fn decrement_num_active_dbs(&self, cf_name: &str) { + self.op_metrics + .rocksdb_num_active_cf_handles + .with_label_values(&[cf_name]) + .dec(); + } + pub fn get() -> &'static Arc { + ONCE.get() + .unwrap_or_else(|| DBMetrics::init(prometheus::default_registry())) + } } diff --git a/moveos/raw-store/src/rocks/batch.rs b/moveos/raw-store/src/rocks/batch.rs index ee1628680f..eb1a54b21b 100644 --- a/moveos/raw-store/src/rocks/batch.rs +++ b/moveos/raw-store/src/rocks/batch.rs @@ -43,6 +43,18 @@ impl WriteBatch { self.rows.clear(); Ok(()) } + + pub fn size_in_bytes(&self) -> usize { + let mut batch_size: usize = 0; + for (k, op) in self.rows.iter() { + batch_size += k.len(); + match op { + WriteOp::Value(v) => batch_size += v.len(), + WriteOp::Deletion => {} + } + } + batch_size + } } impl TryFrom> for WriteBatch diff --git a/moveos/raw-store/src/rocks/mod.rs b/moveos/raw-store/src/rocks/mod.rs index ce8c5aea12..070bc8a171 100644 --- a/moveos/raw-store/src/rocks/mod.rs +++ b/moveos/raw-store/src/rocks/mod.rs @@ -12,8 +12,8 @@ use std::path::Path; use anyhow::{ensure, format_err, Error, Result}; use rocksdb::{ - BlockBasedOptions, Cache, ColumnFamily, DBCompressionType, Options, ReadOptions, - WriteBatch as DBWriteBatch, WriteOptions, DB, + AsColumnFamilyRef, BlockBasedOptions, CStrLike, Cache, ColumnFamily, DBCompressionType, + Options, ReadOptions, WriteBatch as DBWriteBatch, WriteOptions, DB, }; use serde::de::DeserializeOwned; use serde::Serialize; @@ -22,21 +22,19 @@ use moveos_common::utils::{check_open_fds_limit, from_bytes}; use moveos_config::store_config::RocksdbConfig; use crate::errors::RawStoreError; -use crate::metrics::{record_metrics, StoreMetrics}; use crate::rocks::batch::WriteBatch; use crate::traits::DBStore; use crate::{ColumnFamilyName, WriteOp}; pub mod batch; -pub const DEFAULT_PREFIX_NAME: ColumnFamilyName = "default"; +pub const DEFAULT_COLUMN_FAMILY_NAME: ColumnFamilyName = "default"; pub const RES_FDS: u64 = 4096; #[allow(clippy::upper_case_acronyms)] pub struct RocksDB { db: DB, - cfs: Vec, - metrics: Option, + pub(crate) cfs: Vec, } impl RocksDB { @@ -44,9 +42,8 @@ impl RocksDB { db_path: P, column_families: Vec, rocksdb_config: RocksdbConfig, - metrics: Option, ) -> Result { - Self::open_with_cfs(db_path, column_families, false, rocksdb_config, metrics) + Self::open_with_cfs(db_path, column_families, false, rocksdb_config) } pub fn open_with_cfs( @@ -54,7 +51,6 @@ impl RocksDB { column_families: Vec, readonly: bool, rocksdb_config: RocksdbConfig, - metrics: Option, ) -> Result { let path = root_path.as_ref(); @@ -69,7 +65,7 @@ impl RocksDB { if Self::db_exists(path) { let cf_vec = Self::list_cf(path)?; let mut db_cfs_set: HashSet<_> = cf_vec.iter().collect(); - db_cfs_set.remove(&DEFAULT_PREFIX_NAME.to_string()); + db_cfs_set.remove(&DEFAULT_COLUMN_FAMILY_NAME.to_string()); ensure!( db_cfs_set.len() <= cfs_set.len(), RawStoreError::StoreCheckError(format_err!( @@ -112,7 +108,6 @@ impl RocksDB { Ok(RocksDB { db, cfs: column_families, - metrics, }) } @@ -223,7 +218,7 @@ impl RocksDB { rocksdb_current_file.is_file() } - fn get_cf_handle(&self, cf_name: &str) -> &ColumnFamily { + pub fn get_cf_handle(&self, cf_name: &str) -> &ColumnFamily { self.db.cf_handle(cf_name).unwrap_or_else(|| { panic!( "DB::cf_handle not found for column family name: {}", @@ -258,14 +253,14 @@ impl RocksDB { } fn iter_with_direction( &self, - prefix_name: &str, + cf_name: &str, direction: ScanDirection, ) -> Result> where K: Serialize + DeserializeOwned, V: Serialize + DeserializeOwned, { - let cf_handle = self.get_cf_handle(prefix_name); + let cf_handle = self.get_cf_handle(cf_name); Ok(SchemaIterator::new( self.db .raw_iterator_cf_opt(&cf_handle, ReadOptions::default()), @@ -274,21 +269,21 @@ impl RocksDB { } /// Returns a forward [`SchemaIterator`] on a certain schema. - pub fn iter(&self, prefix_name: &str) -> Result> + pub fn iter(&self, cf_name: &str) -> Result> where K: Serialize + DeserializeOwned, V: Serialize + DeserializeOwned, { - self.iter_with_direction(prefix_name, ScanDirection::Forward) + self.iter_with_direction(cf_name, ScanDirection::Forward) } /// Returns a backward [`SchemaIterator`] on a certain schema. - pub fn rev_iter(&self, prefix_name: &str) -> Result> + pub fn rev_iter(&self, cf_name: &str) -> Result> where K: Serialize + DeserializeOwned, V: Serialize + DeserializeOwned, { - self.iter_with_direction(prefix_name, ScanDirection::Backward) + self.iter_with_direction(cf_name, ScanDirection::Backward) } fn sync_write_options() -> WriteOptions { @@ -296,6 +291,14 @@ impl RocksDB { opts.set_sync(true); opts } + + pub fn property_int_value_cf( + &self, + cf: &impl AsColumnFamilyRef, + name: impl CStrLike, + ) -> Result, rocksdb::Error> { + self.db.property_int_value_cf(cf, name) + } } pub enum ScanDirection { @@ -380,61 +383,44 @@ where } impl DBStore for RocksDB { - fn get(&self, prefix_name: &str, key: &[u8]) -> Result>> { - record_metrics("db", prefix_name, "get", self.metrics.as_ref()).call(|| { - let cf_handle = self.get_cf_handle(prefix_name); - let result = self.db.get_cf(&cf_handle, key)?; - Ok(result) - }) + fn get(&self, cf_name: &str, key: &[u8]) -> Result>> { + let cf_handle = self.get_cf_handle(cf_name); + let result = self.db.get_cf(&cf_handle, key)?; + Ok(result) } - fn put(&self, prefix_name: &str, key: Vec, value: Vec) -> Result<()> { - if let Some(metrics) = self.metrics.as_ref() { - metrics - .store_item_bytes - .with_label_values(&[prefix_name]) - .observe((key.len() + value.len()) as f64); - } - - record_metrics("db", prefix_name, "put", self.metrics.as_ref()).call(|| { - let cf_handle = self.get_cf_handle(prefix_name); - self.db - .put_cf_opt(&cf_handle, &key, &value, &Self::default_write_options())?; - Ok(()) - }) + fn put(&self, cf_name: &str, key: Vec, value: Vec) -> Result<()> { + let cf_handle = self.get_cf_handle(cf_name); + self.db + .put_cf_opt(&cf_handle, key, value, &Self::default_write_options())?; + Ok(()) } - fn contains_key(&self, prefix_name: &str, key: &[u8]) -> Result { - record_metrics("db", prefix_name, "contains_key", self.metrics.as_ref()).call(|| match self - .get(prefix_name, key) - { + fn contains_key(&self, cf_name: &str, key: &[u8]) -> Result { + match self.get(cf_name, key) { Ok(Some(_)) => Ok(true), _ => Ok(false), - }) + } } - fn remove(&self, prefix_name: &str, key: Vec) -> Result<()> { - record_metrics("db", prefix_name, "remove", self.metrics.as_ref()).call(|| { - let cf_handle = self.get_cf_handle(prefix_name); - self.db.delete_cf(&cf_handle, &key)?; - Ok(()) - }) + fn remove(&self, cf_name: &str, key: Vec) -> Result<()> { + let cf_handle = self.get_cf_handle(cf_name); + self.db.delete_cf(&cf_handle, key)?; + Ok(()) } /// Writes a group of records wrapped in a WriteBatch. - fn write_batch(&self, prefix_name: &str, batch: WriteBatch) -> Result<()> { - record_metrics("db", prefix_name, "write_batch", self.metrics.as_ref()).call(|| { - let mut db_batch = DBWriteBatch::default(); - let cf_handle = self.get_cf_handle(prefix_name); - for (key, write_op) in &batch.rows { - match write_op { - WriteOp::Value(value) => db_batch.put_cf(&cf_handle, key, value), - WriteOp::Deletion => db_batch.delete_cf(&cf_handle, key), - }; - } - self.db - .write_opt(db_batch, &Self::default_write_options())?; - Ok(()) - }) + fn write_batch(&self, cf_name: &str, batch: WriteBatch) -> Result<()> { + let mut db_batch = DBWriteBatch::default(); + let cf_handle = self.get_cf_handle(cf_name); + for (key, write_op) in &batch.rows { + match write_op { + WriteOp::Value(value) => db_batch.put_cf(&cf_handle, key, value), + WriteOp::Deletion => db_batch.delete_cf(&cf_handle, key), + }; + } + self.db + .write_opt(db_batch, &Self::default_write_options())?; + Ok(()) } fn get_len(&self) -> Result { @@ -445,56 +431,43 @@ impl DBStore for RocksDB { unimplemented!() } - fn put_sync(&self, prefix_name: &str, key: Vec, value: Vec) -> Result<()> { - if let Some(metrics) = self.metrics.as_ref() { - metrics - .store_item_bytes - .with_label_values(&[prefix_name]) - .observe((key.len() + value.len()) as f64); - } - - record_metrics("db", prefix_name, "put_sync", self.metrics.as_ref()).call(|| { - let cf_handle = self.get_cf_handle(prefix_name); - self.db - .put_cf_opt(&cf_handle, &key, &value, &Self::sync_write_options())?; - Ok(()) - }) + fn put_sync(&self, cf_name: &str, key: Vec, value: Vec) -> Result<()> { + let cf_handle = self.get_cf_handle(cf_name); + self.db + .put_cf_opt(&cf_handle, key, value, &Self::sync_write_options())?; + Ok(()) } - fn write_batch_sync(&self, prefix_name: &str, batch: WriteBatch) -> Result<()> { - record_metrics("db", prefix_name, "write_batch_sync", self.metrics.as_ref()).call(|| { - let mut db_batch = DBWriteBatch::default(); - let cf_handle = self.get_cf_handle(prefix_name); - for (key, write_op) in &batch.rows { - match write_op { - WriteOp::Value(value) => db_batch.put_cf(&cf_handle, key, value), - WriteOp::Deletion => db_batch.delete_cf(&cf_handle, key), - }; - } - self.db.write_opt(db_batch, &Self::sync_write_options())?; - Ok(()) - }) + fn write_batch_sync(&self, cf_name: &str, batch: WriteBatch) -> Result<()> { + let mut db_batch = DBWriteBatch::default(); + let cf_handle = self.get_cf_handle(cf_name); + for (key, write_op) in &batch.rows { + match write_op { + WriteOp::Value(value) => db_batch.put_cf(&cf_handle, key, value), + WriteOp::Deletion => db_batch.delete_cf(&cf_handle, key), + }; + } + self.db.write_opt(db_batch, &Self::sync_write_options())?; + Ok(()) } - fn multi_get(&self, prefix_name: &str, keys: Vec>) -> Result>>> { - record_metrics("db", prefix_name, "multi_get", self.metrics.as_ref()).call(|| { - let cf_handle = self.get_cf_handle(prefix_name); - let cf_handles = iter::repeat(&cf_handle) - .take(keys.len()) - .collect::>(); - let keys_multi = keys - .iter() - .zip(cf_handles) - .map(|(key, handle)| (handle, key.as_slice())) - .collect::>(); - - let result = self.db.multi_get_cf(keys_multi); - let mut res = vec![]; - for item in result { - let item = item?; - res.push(item); - } - Ok(res) - }) + fn multi_get(&self, cf_name: &str, keys: Vec>) -> Result>>> { + let cf_handle = self.get_cf_handle(cf_name); + let cf_handles = iter::repeat(&cf_handle) + .take(keys.len()) + .collect::>(); + let keys_multi = keys + .iter() + .zip(cf_handles) + .map(|(key, handle)| (handle, key.as_slice())) + .collect::>(); + + let result = self.db.multi_get_cf(keys_multi); + let mut res = vec![]; + for item in result { + let item = item?; + res.push(item); + } + Ok(res) } } diff --git a/moveos/raw-store/src/store_macros.rs b/moveos/raw-store/src/store_macros.rs index 1fa8bbacc5..e8846439ee 100644 --- a/moveos/raw-store/src/store_macros.rs +++ b/moveos/raw-store/src/store_macros.rs @@ -3,7 +3,7 @@ #[macro_export] macro_rules! derive_store { - ($store_type: ident, $key_type: ty, $value_type: ty, $prefix_name: expr) => { + ($store_type: ident, $key_type: ty, $value_type: ty, $cf_name: expr) => { #[derive(Clone)] pub struct $store_type { store: $crate::InnerStore, @@ -22,7 +22,7 @@ macro_rules! derive_store { type Value = $value_type; fn name() -> $crate::ColumnFamilyName { - $prefix_name + $cf_name } } diff --git a/moveos/raw-store/src/traits.rs b/moveos/raw-store/src/traits.rs index a064d79fac..030f47890b 100644 --- a/moveos/raw-store/src/traits.rs +++ b/moveos/raw-store/src/traits.rs @@ -19,14 +19,14 @@ pub trait KVStore: Send + Sync { } pub trait DBStore: Send + Sync { - fn get(&self, prefix_name: &str, key: &[u8]) -> Result>>; - fn put(&self, prefix_name: &str, key: Vec, value: Vec) -> Result<()>; - fn contains_key(&self, prefix_name: &str, key: &[u8]) -> Result; - fn remove(&self, prefix_name: &str, key: Vec) -> Result<()>; - fn write_batch(&self, prefix_name: &str, batch: WriteBatch) -> Result<()>; + fn get(&self, cf_name: &str, key: &[u8]) -> Result>>; + fn put(&self, cf_name: &str, key: Vec, value: Vec) -> Result<()>; + fn contains_key(&self, cf_name: &str, key: &[u8]) -> Result; + fn remove(&self, cf_name: &str, key: Vec) -> Result<()>; + fn write_batch(&self, cf_name: &str, batch: WriteBatch) -> Result<()>; fn get_len(&self) -> Result; fn keys(&self) -> Result>>; - fn put_sync(&self, prefix_name: &str, key: Vec, value: Vec) -> Result<()>; - fn write_batch_sync(&self, prefix_name: &str, batch: WriteBatch) -> Result<()>; - fn multi_get(&self, prefix_name: &str, keys: Vec>) -> Result>>>; + fn put_sync(&self, cf_name: &str, key: Vec, value: Vec) -> Result<()>; + fn write_batch_sync(&self, cf_name: &str, batch: WriteBatch) -> Result<()>; + fn multi_get(&self, cf_name: &str, keys: Vec>) -> Result>>>; } From 521fc470bcd84fb57d7450c77d615b0efc1efa36 Mon Sep 17 00:00:00 2001 From: baichuan3 Date: Sat, 6 Jul 2024 18:31:34 +0800 Subject: [PATCH 3/5] fixup file cache dependency --- Cargo.lock | 1 + crates/rooch-common/src/fs/file_cache.rs | 17 +- infra/rooch-portal/yarn.lock | 4322 ---------------------- moveos/metrics/Cargo.toml | 1 + moveos/metrics/src/lib.rs | 2 +- moveos/raw-store/src/lib.rs | 38 +- 6 files changed, 46 insertions(+), 4335 deletions(-) delete mode 100644 infra/rooch-portal/yarn.lock diff --git a/Cargo.lock b/Cargo.lock index 2d70a3c312..8b92f8ebff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6249,6 +6249,7 @@ dependencies = [ "anyhow", "async-trait", "axum 0.7.5", + "axum-server 0.6.0", "dashmap", "futures", "once_cell", diff --git a/crates/rooch-common/src/fs/file_cache.rs b/crates/rooch-common/src/fs/file_cache.rs index 2a8c90b0de..41604effa5 100644 --- a/crates/rooch-common/src/fs/file_cache.rs +++ b/crates/rooch-common/src/fs/file_cache.rs @@ -1,12 +1,13 @@ // Copyright (c) RoochNetwork // SPDX-License-Identifier: Apache-2.0 -use libc::{posix_fadvise, POSIX_FADV_DONTNEED}; use std::fs::File; -use std::io::{Error, Result}; +use std::io::Result; +#[cfg(target_os = "linux")] use std::os::unix::io::AsRawFd; use std::path::PathBuf; +#[allow(dead_code)] pub struct FileCacheManager { file: File, } @@ -17,21 +18,27 @@ impl FileCacheManager { Ok(FileCacheManager { file }) } + #[cfg(target_os = "linux")] pub fn drop_cache_range(&self, offset: u64, len: u64) -> Result<()> { let fd = self.file.as_raw_fd(); let ret = unsafe { - posix_fadvise( + libc::posix_fadvise( fd, offset as libc::off_t, len as libc::off_t, - POSIX_FADV_DONTNEED, + libc::POSIX_FADV_DONTNEED, ) }; if ret != 0 { - return Err(Error::from_raw_os_error(ret)); + return Err(std::io::Error::from_raw_os_error(ret)); } Ok(()) } + + #[cfg(not(target_os = "linux"))] + pub fn drop_cache_range(&self, _offset: u64, _len: u64) -> Result<()> { + Ok(()) + } } diff --git a/infra/rooch-portal/yarn.lock b/infra/rooch-portal/yarn.lock deleted file mode 100644 index 910b3c1566..0000000000 --- a/infra/rooch-portal/yarn.lock +++ /dev/null @@ -1,4322 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== - dependencies: - "@babel/highlight" "^7.24.7" - picocolors "^1.0.0" - -"@babel/generator@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" - integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== - dependencies: - "@babel/types" "^7.24.7" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/helper-environment-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" - integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" - integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-hoist-variables@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" - integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-module-imports@^7.16.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" - integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-split-export-declaration@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" - integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" - integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" - integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== - -"@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.1", "@babel/runtime@^7.3.1": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" - integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" - integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/traverse@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" - integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.24.7": - version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" - integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== - dependencies: - "@babel/helper-string-parser" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" - -"@emotion/babel-plugin@^11.10.6": - version "11.11.0" - resolved "https://registry.npmmirror.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" - integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/serialize" "^1.1.2" - babel-plugin-macros "^3.1.0" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "4.2.0" - -"@emotion/cache@11.10.5": - version "11.10.5" - resolved "https://registry.npmmirror.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" - integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== - dependencies: - "@emotion/memoize" "^0.8.0" - "@emotion/sheet" "^1.2.1" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - stylis "4.1.3" - -"@emotion/cache@^11.10.5": - version "11.11.0" - resolved "https://registry.npmmirror.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" - integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== - dependencies: - "@emotion/memoize" "^0.8.1" - "@emotion/sheet" "^1.2.2" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" - stylis "4.2.0" - -"@emotion/hash@^0.9.0", "@emotion/hash@^0.9.1": - version "0.9.1" - resolved "https://registry.npmmirror.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" - integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== - -"@emotion/memoize@^0.8.0", "@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.npmmirror.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== - -"@emotion/react@11.10.6": - version "11.10.6" - resolved "https://registry.npmmirror.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" - integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.6" - "@emotion/cache" "^11.10.5" - "@emotion/serialize" "^1.1.1" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.1.1", "@emotion/serialize@^1.1.2": - version "1.1.4" - resolved "https://registry.npmmirror.com/@emotion/serialize/-/serialize-1.1.4.tgz#fc8f6d80c492cfa08801d544a05331d1cc7cd451" - integrity sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ== - dependencies: - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/unitless" "^0.8.1" - "@emotion/utils" "^1.2.1" - csstype "^3.0.2" - -"@emotion/sheet@^1.2.1", "@emotion/sheet@^1.2.2": - version "1.2.2" - resolved "https://registry.npmmirror.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" - integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== - -"@emotion/unitless@^0.8.1": - version "0.8.1" - resolved "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== - -"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": - version "1.0.1" - resolved "https://registry.npmmirror.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" - integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== - -"@emotion/utils@^1.2.0", "@emotion/utils@^1.2.1": - version "1.2.1" - resolved "https://registry.npmmirror.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" - integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== - -"@emotion/weak-memoize@^0.3.0", "@emotion/weak-memoize@^0.3.1": - version "0.3.1" - resolved "https://registry.npmmirror.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" - integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== - -"@esbuild-plugins/node-globals-polyfill@^0.2.3": - version "0.2.3" - resolved "https://registry.npmmirror.com/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz#0e4497a2b53c9e9485e149bc92ddb228438d6bcf" - integrity sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw== - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.npmmirror.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@faker-js/faker@^8.4.1": - version "8.4.1" - resolved "https://registry.npmmirror.com/@faker-js/faker/-/faker-8.4.1.tgz#5d5e8aee8fce48f5e189bf730ebd1f758f491451" - integrity sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg== - -"@floating-ui/core@^1.6.0": - version "1.6.4" - resolved "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.4.tgz#0140cf5091c8dee602bff9da5ab330840ff91df6" - integrity sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA== - dependencies: - "@floating-ui/utils" "^0.2.4" - -"@floating-ui/dom@^1.0.0": - version "1.6.7" - resolved "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.7.tgz#85d22f731fcc5b209db504478fb1df5116a83015" - integrity sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng== - dependencies: - "@floating-ui/core" "^1.6.0" - "@floating-ui/utils" "^0.2.4" - -"@floating-ui/react-dom@^2.0.0": - version "2.1.1" - resolved "https://registry.npmmirror.com/@floating-ui/react-dom/-/react-dom-2.1.1.tgz#cca58b6b04fc92b4c39288252e285e0422291fb0" - integrity sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg== - dependencies: - "@floating-ui/dom" "^1.0.0" - -"@floating-ui/utils@^0.2.4": - version "0.2.4" - resolved "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.4.tgz#1d459cee5031893a08a0e064c406ad2130cced7c" - integrity sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA== - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - 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" - -"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": - version "1.4.15" - resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@mysten/bcs@1.0.2": - version "1.0.2" - resolved "https://registry.npmmirror.com/@mysten/bcs/-/bcs-1.0.2.tgz#d24b051f1a0652d44f61d0a6d8b94f7351fdae1e" - integrity sha512-haHT0km/9yIIe8lwo8gDFxGLnoxfRF4WmEVCz4lDXbEVQRsZkF0zB97kukiwMjDuFBaGVUhrOMCLz6td8tSMaQ== - dependencies: - bs58 "^5.0.0" - -"@noble/curves@~1.4.0": - version "1.4.0" - resolved "https://registry.npmmirror.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" - integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== - dependencies: - "@noble/hashes" "1.4.0" - -"@noble/hashes@1.4.0", "@noble/hashes@^1.2.0", "@noble/hashes@~1.4.0": - version "1.4.0" - resolved "https://registry.npmmirror.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmmirror.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.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.npmmirror.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" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@radix-ui/number@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/number/-/number-1.1.0.tgz#1e95610461a09cdf8bb05c152e76ca1278d5da46" - integrity sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ== - -"@radix-ui/primitive@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.0.0.tgz#e1d8ef30b10ea10e69c76e896f608d9276352253" - integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/primitive@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" - integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== - -"@radix-ui/react-arrow@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz#744f388182d360b86285217e43b6c63633f39e7a" - integrity sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw== - dependencies: - "@radix-ui/react-primitive" "2.0.0" - -"@radix-ui/react-aspect-ratio@^1.0.3": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.0.tgz#b646d044420a63046ad794db1efa3001c4be24ef" - integrity sha512-dP87DM/Y7jFlPgUZTlhx6FF5CEzOiaxp2rBCKlaXlpH5Ip/9Fg5zZ9lDOQ5o/MOfUlf36eak14zoWYpgcgGoOg== - dependencies: - "@radix-ui/react-primitive" "2.0.0" - -"@radix-ui/react-avatar@^1.0.4": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-avatar/-/react-avatar-1.1.0.tgz#457c81334c93f4608df15f081e7baa286558d6a2" - integrity sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA== - dependencies: - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-layout-effect" "1.1.0" - -"@radix-ui/react-checkbox@^1.0.4": - version "1.1.1" - resolved "https://registry.npmmirror.com/@radix-ui/react-checkbox/-/react-checkbox-1.1.1.tgz#a559c4303957d797acee99914480b755aa1f27d6" - integrity sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - "@radix-ui/react-use-previous" "1.1.0" - "@radix-ui/react-use-size" "1.1.0" - -"@radix-ui/react-collection@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-collection/-/react-collection-1.1.0.tgz#f18af78e46454a2360d103c2251773028b7724ed" - integrity sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw== - dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-slot" "1.1.0" - -"@radix-ui/react-compose-refs@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz#37595b1f16ec7f228d698590e78eeed18ff218ae" - integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-compose-refs@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz#656432461fc8283d7b591dcf0d79152fae9ecc74" - integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== - -"@radix-ui/react-context@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.0.0.tgz#f38e30c5859a9fb5e9aa9a9da452ee3ed9e0aee0" - integrity sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-context@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" - integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== - -"@radix-ui/react-dialog@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz#997e97cb183bc90bd888b26b8e23a355ac9fe5f0" - integrity sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-dismissable-layer" "1.0.0" - "@radix-ui/react-focus-guards" "1.0.0" - "@radix-ui/react-focus-scope" "1.0.0" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-portal" "1.0.0" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.0" - "@radix-ui/react-slot" "1.0.0" - "@radix-ui/react-use-controllable-state" "1.0.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.4" - -"@radix-ui/react-dialog@^1.0.5": - version "1.1.1" - resolved "https://registry.npmmirror.com/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz#4906507f7b4ad31e22d7dad69d9330c87c431d44" - integrity sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-focus-guards" "1.1.0" - "@radix-ui/react-focus-scope" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-slot" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.7" - -"@radix-ui/react-direction@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz#a7d39855f4d077adc2a1922f9c353c5977a09cdc" - integrity sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg== - -"@radix-ui/react-dismissable-layer@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz#35b7826fa262fd84370faef310e627161dffa76b" - integrity sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-primitive" "1.0.0" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-escape-keydown" "1.0.0" - -"@radix-ui/react-dismissable-layer@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz#2cd0a49a732372513733754e6032d3fb7988834e" - integrity sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-escape-keydown" "1.1.0" - -"@radix-ui/react-dropdown-menu@^2.0.6": - version "2.1.1" - resolved "https://registry.npmmirror.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz#3dc578488688250dbbe109d9ff2ca28a9bca27ec" - integrity sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-menu" "2.1.1" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - -"@radix-ui/react-focus-guards@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz#339c1c69c41628c1a5e655f15f7020bf11aa01fa" - integrity sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-focus-guards@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz#8e9abb472a9a394f59a1b45f3dd26cfe3fc6da13" - integrity sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw== - -"@radix-ui/react-focus-scope@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz#95a0c1188276dc8933b1eac5f1cdb6471e01ade5" - integrity sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-primitive" "1.0.0" - "@radix-ui/react-use-callback-ref" "1.0.0" - -"@radix-ui/react-focus-scope@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz#ebe2891a298e0a33ad34daab2aad8dea31caf0b2" - integrity sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA== - dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - -"@radix-ui/react-hover-card@^1.0.7": - version "1.1.1" - resolved "https://registry.npmmirror.com/@radix-ui/react-hover-card/-/react-hover-card-1.1.1.tgz#2982a5a91c7ae5a98e0cacd845fbdfbfdcdab355" - integrity sha512-IwzAOP97hQpDADYVKrEEHUH/b2LA+9MgB0LgdmnbFO2u/3M5hmEofjjr2M6CyzUblaAqJdFm6B7oFtU72DPXrA== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-popper" "1.2.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - -"@radix-ui/react-icons@^1.3.0": - version "1.3.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-icons/-/react-icons-1.3.0.tgz#c61af8f323d87682c5ca76b856d60c2312dbcb69" - integrity sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw== - -"@radix-ui/react-id@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.0.0.tgz#8d43224910741870a45a8c9d092f25887bb6d11e" - integrity sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-layout-effect" "1.0.0" - -"@radix-ui/react-id@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.1.0.tgz#de47339656594ad722eb87f94a6b25f9cffae0ed" - integrity sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA== - dependencies: - "@radix-ui/react-use-layout-effect" "1.1.0" - -"@radix-ui/react-label@^2.0.2": - version "2.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-label/-/react-label-2.1.0.tgz#3aa2418d70bb242be37c51ff5e51a2adcbc372e3" - integrity sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw== - dependencies: - "@radix-ui/react-primitive" "2.0.0" - -"@radix-ui/react-menu@2.1.1": - version "2.1.1" - resolved "https://registry.npmmirror.com/@radix-ui/react-menu/-/react-menu-2.1.1.tgz#bd623ace0e1ae1ac78023a505fec0541d59fb346" - integrity sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-collection" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-focus-guards" "1.1.0" - "@radix-ui/react-focus-scope" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-popper" "1.2.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-roving-focus" "1.1.0" - "@radix-ui/react-slot" "1.1.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.7" - -"@radix-ui/react-popover@^1.0.7": - version "1.1.1" - resolved "https://registry.npmmirror.com/@radix-ui/react-popover/-/react-popover-1.1.1.tgz#604b783cdb3494ed4f16a58c17f0e81e61ab7775" - integrity sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-focus-guards" "1.1.0" - "@radix-ui/react-focus-scope" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-popper" "1.2.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-slot" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.7" - -"@radix-ui/react-popper@1.2.0": - version "1.2.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-popper/-/react-popper-1.2.0.tgz#a3e500193d144fe2d8f5d5e60e393d64111f2a7a" - integrity sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg== - dependencies: - "@floating-ui/react-dom" "^2.0.0" - "@radix-ui/react-arrow" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-layout-effect" "1.1.0" - "@radix-ui/react-use-rect" "1.1.0" - "@radix-ui/react-use-size" "1.1.0" - "@radix-ui/rect" "1.1.0" - -"@radix-ui/react-portal@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.0.0.tgz#7220b66743394fabb50c55cb32381395cc4a276b" - integrity sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.0" - -"@radix-ui/react-portal@1.1.1": - version "1.1.1" - resolved "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.1.1.tgz#1957f1eb2e1aedfb4a5475bd6867d67b50b1d15f" - integrity sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g== - dependencies: - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-layout-effect" "1.1.0" - -"@radix-ui/react-presence@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.0.0.tgz#814fe46df11f9a468808a6010e3f3ca7e0b2e84a" - integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-use-layout-effect" "1.0.0" - -"@radix-ui/react-presence@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.1.0.tgz#227d84d20ca6bfe7da97104b1a8b48a833bfb478" - integrity sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ== - dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-use-layout-effect" "1.1.0" - -"@radix-ui/react-primitive@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz#376cd72b0fcd5e0e04d252ed33eb1b1f025af2b0" - integrity sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-slot" "1.0.0" - -"@radix-ui/react-primitive@2.0.0": - version "2.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz#fe05715faa9203a223ccc0be15dc44b9f9822884" - integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw== - dependencies: - "@radix-ui/react-slot" "1.1.0" - -"@radix-ui/react-progress@^1.0.3": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-progress/-/react-progress-1.1.0.tgz#28c267885ec154fc557ec7a66cb462787312f7e2" - integrity sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg== - dependencies: - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - -"@radix-ui/react-roving-focus@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz#b30c59daf7e714c748805bfe11c76f96caaac35e" - integrity sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-collection" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - -"@radix-ui/react-scroll-area@^1.0.5": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.1.0.tgz#50b24b0fc9ada151d176395bcf47b2ec68feada5" - integrity sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg== - dependencies: - "@radix-ui/number" "1.1.0" - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-layout-effect" "1.1.0" - -"@radix-ui/react-select@^2.0.0": - version "2.1.1" - resolved "https://registry.npmmirror.com/@radix-ui/react-select/-/react-select-2.1.1.tgz#df05cb0b29d3deaef83b505917c4042e0e418a9f" - integrity sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ== - dependencies: - "@radix-ui/number" "1.1.0" - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-collection" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-focus-guards" "1.1.0" - "@radix-ui/react-focus-scope" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-popper" "1.2.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-slot" "1.1.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - "@radix-ui/react-use-layout-effect" "1.1.0" - "@radix-ui/react-use-previous" "1.1.0" - "@radix-ui/react-visually-hidden" "1.1.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.7" - -"@radix-ui/react-separator@^1.0.3": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-separator/-/react-separator-1.1.0.tgz#ee0f4d86003b0e3ea7bc6ccab01ea0adee32663e" - integrity sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA== - dependencies: - "@radix-ui/react-primitive" "2.0.0" - -"@radix-ui/react-slot@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.0.0.tgz#7fa805b99891dea1e862d8f8fbe07f4d6d0fd698" - integrity sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - -"@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.0.2": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.1.0.tgz#7c5e48c36ef5496d97b08f1357bb26ed7c714b84" - integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== - dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - -"@radix-ui/react-switch@^1.0.3": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-switch/-/react-switch-1.1.0.tgz#fcf8e778500f1d60d4b2bec2fc3fad77a7c118e3" - integrity sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - "@radix-ui/react-use-previous" "1.1.0" - "@radix-ui/react-use-size" "1.1.0" - -"@radix-ui/react-tabs@^1.0.4": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-tabs/-/react-tabs-1.1.0.tgz#0a6db1caed56776a1176aae68532060e301cc1c0" - integrity sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-roving-focus" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - -"@radix-ui/react-toast@^1.1.5": - version "1.2.1" - resolved "https://registry.npmmirror.com/@radix-ui/react-toast/-/react-toast-1.2.1.tgz#4bde231ed27d007dcd0455a446565ca619f92a2d" - integrity sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-collection" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - "@radix-ui/react-use-layout-effect" "1.1.0" - "@radix-ui/react-visually-hidden" "1.1.0" - -"@radix-ui/react-tooltip@^1.0.7": - version "1.1.2" - resolved "https://registry.npmmirror.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz#c42db2ffd7dcc6ff3d65407c8cb70490288f518d" - integrity sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-popper" "1.2.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-slot" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - "@radix-ui/react-visually-hidden" "1.1.0" - -"@radix-ui/react-use-callback-ref@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz#9e7b8b6b4946fe3cbe8f748c82a2cce54e7b6a90" - integrity sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-use-callback-ref@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz#bce938ca413675bc937944b0d01ef6f4a6dc5bf1" - integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw== - -"@radix-ui/react-use-controllable-state@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz#a64deaafbbc52d5d407afaa22d493d687c538b7f" - integrity sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-callback-ref" "1.0.0" - -"@radix-ui/react-use-controllable-state@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz#1321446857bb786917df54c0d4d084877aab04b0" - integrity sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw== - dependencies: - "@radix-ui/react-use-callback-ref" "1.1.0" - -"@radix-ui/react-use-escape-keydown@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz#aef375db4736b9de38a5a679f6f49b45a060e5d1" - integrity sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-callback-ref" "1.0.0" - -"@radix-ui/react-use-escape-keydown@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz#31a5b87c3b726504b74e05dac1edce7437b98754" - integrity sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw== - dependencies: - "@radix-ui/react-use-callback-ref" "1.1.0" - -"@radix-ui/react-use-layout-effect@1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz#2fc19e97223a81de64cd3ba1dc42ceffd82374dc" - integrity sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-use-layout-effect@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz#3c2c8ce04827b26a39e442ff4888d9212268bd27" - integrity sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w== - -"@radix-ui/react-use-previous@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz#d4dd37b05520f1d996a384eb469320c2ada8377c" - integrity sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og== - -"@radix-ui/react-use-rect@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz#13b25b913bd3e3987cc9b073a1a164bb1cf47b88" - integrity sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ== - dependencies: - "@radix-ui/rect" "1.1.0" - -"@radix-ui/react-use-size@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz#b4dba7fbd3882ee09e8d2a44a3eed3a7e555246b" - integrity sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw== - dependencies: - "@radix-ui/react-use-layout-effect" "1.1.0" - -"@radix-ui/react-visually-hidden@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz#ad47a8572580f7034b3807c8e6740cd41038a5a2" - integrity sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ== - dependencies: - "@radix-ui/react-primitive" "2.0.0" - -"@radix-ui/rect@1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@radix-ui/rect/-/rect-1.1.0.tgz#f817d1d3265ac5415dadc67edab30ae196696438" - integrity sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg== - -"@remix-run/router@1.17.0": - version "1.17.0" - resolved "https://registry.npmmirror.com/@remix-run/router/-/router-1.17.0.tgz#fbb0add487478ef42247d5942e7a5d8a2e20095f" - integrity sha512-2D6XaHEVvkCn682XBnipbJjgZUU7xjLtA4dGJRBVUKpEaDYOZMENZoZjAOSb7qirxt5RupjzZxz4fK2FO+EFPw== - -"@rollup/plugin-inject@^5.0.5": - version "5.0.5" - resolved "https://registry.npmmirror.com/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz#616f3a73fe075765f91c5bec90176608bed277a3" - integrity sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg== - dependencies: - "@rollup/pluginutils" "^5.0.1" - estree-walker "^2.0.2" - magic-string "^0.30.3" - -"@rollup/pluginutils@^5.0.1": - version "5.1.0" - resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" - integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^2.3.1" - -"@rollup/rollup-android-arm-eabi@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" - integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== - -"@rollup/rollup-android-arm64@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" - integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== - -"@rollup/rollup-darwin-arm64@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" - integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== - -"@rollup/rollup-darwin-x64@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" - integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== - -"@rollup/rollup-linux-arm-gnueabihf@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" - integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== - -"@rollup/rollup-linux-arm-musleabihf@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" - integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== - -"@rollup/rollup-linux-arm64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" - integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== - -"@rollup/rollup-linux-arm64-musl@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" - integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== - -"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" - integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== - -"@rollup/rollup-linux-riscv64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" - integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== - -"@rollup/rollup-linux-s390x-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" - integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== - -"@rollup/rollup-linux-x64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" - integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== - -"@rollup/rollup-linux-x64-musl@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" - integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== - -"@rollup/rollup-win32-arm64-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" - integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== - -"@rollup/rollup-win32-ia32-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" - integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== - -"@rollup/rollup-win32-x64-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" - integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== - -"@roochnetwork/rooch-sdk-kit@0.2.0": - version "0.2.0" - resolved "https://registry.npmmirror.com/@roochnetwork/rooch-sdk-kit/-/rooch-sdk-kit-0.2.0.tgz#727d575bf88853b8a5c9bf655ae119f6e5d6b1c9" - integrity sha512-qkXd8PubmxlcBQfkGy7FOuhDSAuLjsgQZuTpart0bCaLlyRfk0IroGkMTzMh9ZdtSqXfR5OxFFwD7HPin/NAQg== - dependencies: - "@roochnetwork/rooch-sdk" "0.2.0" - "@vanilla-extract/css" "^1.13.0" - "@vanilla-extract/dynamic" "^2.0.3" - "@vanilla-extract/recipes" "^0.5.0" - clsx "^2.0.0" - zustand "^4.4.1" - -"@roochnetwork/rooch-sdk@0.2.0": - version "0.2.0" - resolved "https://registry.npmmirror.com/@roochnetwork/rooch-sdk/-/rooch-sdk-0.2.0.tgz#3e8b621c397f52af3d73088e5007e2866248aa0a" - integrity sha512-wXhl//EZUisHjVNKZDqOTQwdk9Q/aNwH0bPVPbKlRQwUuYckKu6XVIoYW+zxXgE1sOAxpkEvACUTYkN6LmFnDA== - dependencies: - "@mysten/bcs" "1.0.2" - "@noble/curves" "~1.4.0" - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - "@scure/bip32" "^1.3.1" - "@scure/bip39" "^1.2.1" - "@suchipi/femver" "^1.0.0" - bech32 "^2.0.0" - tweetnacl "^1.0.3" - valibot "^0.25.0" - -"@scure/base@~1.1.6": - version "1.1.7" - resolved "https://registry.npmmirror.com/@scure/base/-/base-1.1.7.tgz#fe973311a5c6267846aa131bc72e96c5d40d2b30" - integrity sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g== - -"@scure/bip32@^1.3.1": - version "1.4.0" - resolved "https://registry.npmmirror.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" - integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== - dependencies: - "@noble/curves" "~1.4.0" - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - -"@scure/bip39@^1.2.1": - version "1.3.0" - resolved "https://registry.npmmirror.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" - integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== - dependencies: - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - -"@suchipi/femver@^1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@suchipi/femver/-/femver-1.0.0.tgz#4909dcc069695e07bd23a64c4bfe411d11d9692f" - integrity sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg== - -"@swc/core-darwin-arm64@1.6.6": - version "1.6.6" - resolved "https://registry.npmmirror.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.6.tgz#9488d50394cb08713c4321a940b48599c1c5e153" - integrity sha512-5DA8NUGECcbcK1YLKJwNDKqdtTYDVnkfDU1WvQSXq/rU+bjYCLtn5gCe8/yzL7ISXA6rwqPU1RDejhbNt4ARLQ== - -"@swc/core-darwin-x64@1.6.6": - version "1.6.6" - resolved "https://registry.npmmirror.com/@swc/core-darwin-x64/-/core-darwin-x64-1.6.6.tgz#0b13ae43e1821fd447acfb789979c59bec2d0081" - integrity sha512-2nbh/RHpweNRsJiYDFk1KcX7UtaKgzzTNUjwtvK5cp0wWrpbXmPvdlWOx3yzwoiSASDFx78242JHHXCIOlEdsw== - -"@swc/core-linux-arm-gnueabihf@1.6.6": - version "1.6.6" - resolved "https://registry.npmmirror.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.6.tgz#8dd3e76b887478cedd38d34f1de3c0b8f853d1b8" - integrity sha512-YgytuyUfR7b0z0SRHKV+ylr83HmgnROgeT7xryEkth6JGpAEHooCspQ4RrWTU8+WKJ7aXiZlGXPgybQ4TiS+TA== - -"@swc/core-linux-arm64-gnu@1.6.6": - version "1.6.6" - resolved "https://registry.npmmirror.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.6.tgz#4d6369975d8a077f01cf9f6cee60402529ef67a6" - integrity sha512-yGwx9fddzEE0iURqRVwKBQ4IwRHE6hNhl15WliHpi/PcYhzmYkUIpcbRXjr0dssubXAVPVnx6+jZVDSbutvnfg== - -"@swc/core-linux-arm64-musl@1.6.6": - version "1.6.6" - resolved "https://registry.npmmirror.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.6.tgz#5f0ec779e465242796277d07a3100bd5ccaec6ef" - integrity sha512-a6fMbqzSAsS5KCxFJyg1mD5kwN3ZFO8qQLyJ75R/htZP/eCt05jrhmOI7h2n+1HjiG332jLnZ9S8lkVE5O8Nqw== - -"@swc/core-linux-x64-gnu@1.6.6": - version "1.6.6" - resolved "https://registry.npmmirror.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.6.tgz#30a92064e016f29b8fe85500fa4e71050c60ae74" - integrity sha512-hRGsUKNzzZle28YF0dYIpN0bt9PceR9LaVBq7x8+l9TAaDLFbgksSxcnU/ubTtsy+WsYSYGn+A83w3xWC0O8CQ== - -"@swc/core-linux-x64-musl@1.6.6": - version "1.6.6" - resolved "https://registry.npmmirror.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.6.tgz#59a14e4a90644142b8c90972f5d29cfdde88de78" - integrity sha512-NokIUtFxJDVv3LzGeEtYMTV3j2dnGKLac59luTeq36DQLZdJQawQIdTbzzWl2jE7lxxTZme+dhsVOH9LxE3ceg== - -"@swc/core-win32-arm64-msvc@1.6.6": - version "1.6.6" - resolved "https://registry.npmmirror.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.6.tgz#c81f6e9be1df76273100a422ceec887781244b5d" - integrity sha512-lzYdI4qb4k1dFG26yv+9Jaq/bUMAhgs/2JsrLncGjLof86+uj74wKYCQnbzKAsq2hDtS5DqnHnl+//J+miZfGA== - -"@swc/core-win32-ia32-msvc@1.6.6": - version "1.6.6" - resolved "https://registry.npmmirror.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.6.tgz#0381e95282fdcf5f5f9731b56dad5c5e4da870ce" - integrity sha512-bvl7FMaXIJQ76WZU0ER4+RyfKIMGb6S2MgRkBhJOOp0i7VFx4WLOnrmMzaeoPJaJSkityVKAftfNh7NBzTIydQ== - -"@swc/core-win32-x64-msvc@1.6.6": - version "1.6.6" - resolved "https://registry.npmmirror.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.6.tgz#e511013aa3f71125d6385123469cdd30db141070" - integrity sha512-WAP0JoCTfgeYKgOeYJoJV4ZS0sQUmU3OwvXa2dYYtMLF7zsNqOiW4niU7QlThBHgUv/qNZm2p6ITEgh3w1cltw== - -"@swc/core@^1.5.7": - version "1.6.6" - resolved "https://registry.npmmirror.com/@swc/core/-/core-1.6.6.tgz#fefaa3a6bdd1c6991a9ed67648bc058a0d29d4b8" - integrity sha512-sHfmIUPUXNrQTwFMVCY5V5Ena2GTOeaWjS2GFUpjLhAgVfP90OP67DWow7+cYrfFtqBdILHuWnjkTcd0+uPKlg== - dependencies: - "@swc/counter" "^0.1.3" - "@swc/types" "^0.1.9" - optionalDependencies: - "@swc/core-darwin-arm64" "1.6.6" - "@swc/core-darwin-x64" "1.6.6" - "@swc/core-linux-arm-gnueabihf" "1.6.6" - "@swc/core-linux-arm64-gnu" "1.6.6" - "@swc/core-linux-arm64-musl" "1.6.6" - "@swc/core-linux-x64-gnu" "1.6.6" - "@swc/core-linux-x64-musl" "1.6.6" - "@swc/core-win32-arm64-msvc" "1.6.6" - "@swc/core-win32-ia32-msvc" "1.6.6" - "@swc/core-win32-x64-msvc" "1.6.6" - -"@swc/counter@^0.1.3": - version "0.1.3" - resolved "https://registry.npmmirror.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - -"@swc/types@^0.1.9": - version "0.1.9" - resolved "https://registry.npmmirror.com/@swc/types/-/types-0.1.9.tgz#e67cdcc2e4dd74a3cef4474b465eb398e7ae83e2" - integrity sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg== - dependencies: - "@swc/counter" "^0.1.3" - -"@tanstack/query-core@5.49.1": - version "5.49.1" - resolved "https://registry.npmmirror.com/@tanstack/query-core/-/query-core-5.49.1.tgz#09167842123eddaf47465376f3c835cf59b9f1e9" - integrity sha512-JnC9ndmD1KKS01Rt/ovRUB1tmwO7zkyXAyIxN9mznuJrcNtOrkmOnQqdJF2ib9oHzc2VxHomnEG7xyfo54Npkw== - -"@tanstack/react-query@^5.0.0": - version "5.49.2" - resolved "https://registry.npmmirror.com/@tanstack/react-query/-/react-query-5.49.2.tgz#d9c08f8eb62890f5274608f8954ab1709912ef3c" - integrity sha512-6rfwXDK9BvmHISbNFuGd+wY3P44lyW7lWiA9vIFGT/T0P9aHD1VkjTvcM4SDAIbAQ9ygEZZoLt7dlU1o3NjMVA== - dependencies: - "@tanstack/query-core" "5.49.1" - -"@tanstack/react-table@^8.11.8": - version "8.19.2" - resolved "https://registry.npmmirror.com/@tanstack/react-table/-/react-table-8.19.2.tgz#25ee691d12b8e6e0fca32f8e8cf465ee172009af" - integrity sha512-itoSIAkA/Vsg+bjY23FSemcTyPhc5/1YjYyaMsr9QSH/cdbZnQxHVWrpWn0Sp2BWN71qkzR7e5ye8WuMmwyOjg== - dependencies: - "@tanstack/table-core" "8.19.2" - -"@tanstack/table-core@8.19.2": - version "8.19.2" - resolved "https://registry.npmmirror.com/@tanstack/table-core/-/table-core-8.19.2.tgz#5fc8ede54f18867f74715ad93927f7df4d255209" - integrity sha512-KpRjhgehIhbfH78ARm/GJDXGnpdw4bCg3qas6yjWSi7czJhI/J6pWln7NHtmBkGE9ZbohiiNtLqwGzKmBfixig== - -"@types/estree@1.0.5", "@types/estree@^1.0.0": - version "1.0.5" - resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/hast@^2.0.0": - version "2.3.10" - resolved "https://registry.npmmirror.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" - integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== - dependencies: - "@types/unist" "^2" - -"@types/json-schema@^7.0.12": - version "7.0.15" - resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/node@^20.11.16": - version "20.14.9" - resolved "https://registry.npmmirror.com/@types/node/-/node-20.14.9.tgz#12e8e765ab27f8c421a1820c99f5f313a933b420" - integrity sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg== - dependencies: - undici-types "~5.26.4" - -"@types/parse-json@^4.0.0": - version "4.0.2" - resolved "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" - integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== - -"@types/prop-types@*": - version "15.7.12" - resolved "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== - -"@types/react-dom@^18.2.17": - version "18.3.0" - resolved "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" - integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== - dependencies: - "@types/react" "*" - -"@types/react-syntax-highlighter@^15.5.11": - version "15.5.13" - resolved "https://registry.npmmirror.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz#c5baf62a3219b3bf28d39cfea55d0a49a263d1f2" - integrity sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^18.2.43": - version "18.3.3" - resolved "https://registry.npmmirror.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" - integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/semver@^7.5.0": - version "7.5.8" - resolved "https://registry.npmmirror.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@types/unist@^2": - version "2.0.10" - resolved "https://registry.npmmirror.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" - integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== - -"@typescript-eslint/eslint-plugin@^6.14.0": - version "6.21.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" - integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== - dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/type-utils" "6.21.0" - "@typescript-eslint/utils" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.4" - natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/parser@^6.14.0": - version "6.21.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" - integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== - dependencies: - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@6.21.0": - version "6.21.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" - integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - -"@typescript-eslint/type-utils@6.21.0": - version "6.21.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" - integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== - dependencies: - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/utils" "6.21.0" - debug "^4.3.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/types@6.21.0": - version "6.21.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" - integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== - -"@typescript-eslint/typescript-estree@6.21.0": - version "6.21.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" - integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/utils@6.21.0": - version "6.21.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" - integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - semver "^7.5.4" - -"@typescript-eslint/visitor-keys@6.21.0": - version "6.21.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" - integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== - dependencies: - "@typescript-eslint/types" "6.21.0" - eslint-visitor-keys "^3.4.1" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -"@vanilla-extract/css@^1.13.0": - version "1.15.3" - resolved "https://registry.npmmirror.com/@vanilla-extract/css/-/css-1.15.3.tgz#debf04f61496e290b53f045a2cb6966cc1ba9448" - integrity sha512-mxoskDAxdQAspbkmQRxBvolUi1u1jnyy9WZGm+GeH8V2wwhEvndzl1QoK7w8JfA0WFevTxbev5d+i+xACZlPhA== - dependencies: - "@emotion/hash" "^0.9.0" - "@vanilla-extract/private" "^1.0.5" - css-what "^6.1.0" - cssesc "^3.0.0" - csstype "^3.0.7" - dedent "^1.5.3" - deep-object-diff "^1.1.9" - deepmerge "^4.2.2" - media-query-parser "^2.0.2" - modern-ahocorasick "^1.0.0" - picocolors "^1.0.0" - -"@vanilla-extract/dynamic@^2.0.3": - version "2.1.1" - resolved "https://registry.npmmirror.com/@vanilla-extract/dynamic/-/dynamic-2.1.1.tgz#bc93a577b127a7dcb6f254973d13a863029a7faf" - integrity sha512-iqf736036ujEIKsIq28UsBEMaLC2vR2DhwKyrG3NDb/fRy9qL9FKl1TqTtBV4daU30Uh3saeik4vRzN8bzQMbw== - dependencies: - "@vanilla-extract/private" "^1.0.5" - -"@vanilla-extract/private@^1.0.5": - version "1.0.5" - resolved "https://registry.npmmirror.com/@vanilla-extract/private/-/private-1.0.5.tgz#8c08ac4851f4cc89a3dcdb858d8938e69b1481c4" - integrity sha512-6YXeOEKYTA3UV+RC8DeAjFk+/okoNz/h88R+McnzA2zpaVqTR/Ep+vszkWYlGBcMNO7vEkqbq5nT/JMMvhi+tw== - -"@vanilla-extract/recipes@^0.5.0": - version "0.5.3" - resolved "https://registry.npmmirror.com/@vanilla-extract/recipes/-/recipes-0.5.3.tgz#c65f2998fc189924845614ccd9f79c9334639f1a" - integrity sha512-SPREq1NmaoKuvJeOV0pppOkwy3pWZUoDufsyQ6iHrbkHhAU7XQqG9o0iZSmg5JoVgDLIiOr9djQb0x9wuxig7A== - -"@vitejs/plugin-react-swc@^3.5.0": - version "3.7.0" - resolved "https://registry.npmmirror.com/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz#e456c0a6d7f562268e1d231af9ac46b86ef47d88" - integrity sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA== - dependencies: - "@swc/core" "^1.5.7" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.9.0: - version "8.12.0" - resolved "https://registry.npmmirror.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" - integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmmirror.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" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmmirror.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" - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-hidden@^1.1.1: - version "1.2.4" - resolved "https://registry.npmmirror.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522" - integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A== - dependencies: - tslib "^2.0.0" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asn1.js@^4.10.1: - version "4.10.1" - resolved "https://registry.npmmirror.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -assert@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" - integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== - dependencies: - call-bind "^1.0.2" - is-nan "^1.3.2" - object-is "^1.1.5" - object.assign "^4.1.4" - util "^0.12.5" - -autoprefixer@^10.4.17: - version "10.4.19" - resolved "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" - integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== - dependencies: - browserslist "^4.23.0" - caniuse-lite "^1.0.30001599" - fraction.js "^4.3.7" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" - integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bech32@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" - integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bip174@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/bip174/-/bip174-2.1.1.tgz#ef3e968cf76de234a546962bcf572cc150982f9f" - integrity sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ== - -bitcoinjs-lib@^6.1.6: - version "6.1.6" - resolved "https://registry.npmmirror.com/bitcoinjs-lib/-/bitcoinjs-lib-6.1.6.tgz#f57c17c82511f860f11946d784c18da39f8618a8" - integrity sha512-Fk8+Vc+e2rMoDU5gXkW9tD+313rhkm5h6N9HfZxXvYU9LedttVvmXKTgd9k5rsQJjkSfsv6XRM8uhJv94SrvcA== - dependencies: - "@noble/hashes" "^1.2.0" - bech32 "^2.0.0" - bip174 "^2.1.1" - bs58check "^3.0.1" - typeforce "^1.11.3" - varuint-bitcoin "^1.1.2" - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.npmmirror.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmmirror.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" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-resolve@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" - integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== - dependencies: - resolve "^1.17.0" - -browserify-aes@^1.0.4, browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.3" - resolved "https://registry.npmmirror.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" - integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== - dependencies: - bn.js "^5.2.1" - browserify-rsa "^4.1.0" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.5" - hash-base "~3.0" - inherits "^2.0.4" - parse-asn1 "^5.1.7" - readable-stream "^2.3.8" - safe-buffer "^5.2.1" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@^4.23.0: - version "4.23.1" - resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" - integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== - dependencies: - caniuse-lite "^1.0.30001629" - electron-to-chromium "^1.4.796" - node-releases "^2.0.14" - update-browserslist-db "^1.0.16" - -bs58@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" - integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== - dependencies: - base-x "^4.0.0" - -bs58check@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/bs58check/-/bs58check-3.0.1.tgz#2094d13720a28593de1cba1d8c4e48602fdd841c" - integrity sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ== - dependencies: - "@noble/hashes" "^1.2.0" - bs58 "^5.0.0" - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@^5.7.1: - version "5.7.1" - resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== - -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001629: - version "1.0.30001639" - resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz#972b3a6adeacdd8f46af5fc7f771e9639f6c1521" - integrity sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.npmmirror.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.npmmirror.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - 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" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.npmmirror.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-variance-authority@^0.7.0: - version "0.7.0" - resolved "https://registry.npmmirror.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz#1c3134d634d80271b1837452b06d821915954522" - integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A== - dependencies: - clsx "2.0.0" - -clsx@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" - integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== - -clsx@^2.0.0, clsx@^2.1.0: - version "2.1.1" - resolved "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - -cmdk@^0.2.1: - version "0.2.1" - resolved "https://registry.npmmirror.com/cmdk/-/cmdk-0.2.1.tgz#aa8e1332bb0b8d8484e793017c82537351188d9a" - integrity sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g== - dependencies: - "@radix-ui/react-dialog" "1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== - -convert-source-map@^1.5.0: - version "1.9.0" - resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - 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" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.npmmirror.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - 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" - -create-require@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.0, cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.npmmirror.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" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.npmmirror.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.2, csstype@^3.0.7: - version "3.1.3" - resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.npmmirror.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - -dedent@^1.5.3: - version "1.5.3" - resolved "https://registry.npmmirror.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" - integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deep-object-diff@^1.1.9: - version "1.1.9" - resolved "https://registry.npmmirror.com/deep-object-diff/-/deep-object-diff-1.1.9.tgz#6df7ef035ad6a0caa44479c536ed7b02570f4595" - integrity sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -des.js@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" - integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-node-es@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" - integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.npmmirror.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -domain-browser@^4.22.0: - version "4.23.0" - resolved "https://registry.npmmirror.com/domain-browser/-/domain-browser-4.23.0.tgz#427ebb91efcb070f05cffdfb8a4e9a6c25f8c94b" - integrity sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.4.796: - version "1.4.815" - resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.815.tgz#e901b195c57c3e0fae8dc6d596e4188a33c3e82c" - integrity sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg== - -elliptic@^6.5.3, elliptic@^6.5.5: - version "6.5.5" - resolved "https://registry.npmmirror.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" - integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== - 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" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-plugin-react-hooks@^4.6.0: - version "4.6.2" - resolved "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" - integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== - -eslint-plugin-react-refresh@^0.4.5: - version "0.4.7" - resolved "https://registry.npmmirror.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz#1f597f9093b254f10ee0961c139a749acb19af7d" - integrity sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw== - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8.55.0: - version "8.57.0" - resolved "https://registry.npmmirror.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.2" - resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - 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.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -fault@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" - integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== - dependencies: - format "^0.2.0" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.npmmirror.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.2.1" - resolved "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" - integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -format@^0.2.0: - version "0.2.2" - resolved "https://registry.npmmirror.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== - -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-nonce@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" - integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.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.2: - version "6.0.2" - resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^10.3.10: - version "10.4.2" - resolved "https://registry.npmmirror.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" - integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmmirror.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" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -goober@^2.1.10: - version "2.1.14" - resolved "https://registry.npmmirror.com/goober/-/goober-2.1.14.tgz#4a5c94fc34dc086a8e6035360ae1800005135acd" - integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash-base@~3.0: - version "3.0.4" - resolved "https://registry.npmmirror.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasown@^2.0.0, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -highlight.js@^10.4.1, highlight.js@~10.7.0: - version "10.7.3" - resolved "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.3.1: - version "3.3.2" - resolved "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -html-parse-stringify@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" - integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== - dependencies: - void-elements "3.1.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== - -i18next@^23.8.2: - version "23.11.5" - resolved "https://registry.npmmirror.com/i18next/-/i18next-23.11.5.tgz#d71eb717a7e65498d87d0594f2664237f9e361ef" - integrity sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA== - dependencies: - "@babel/runtime" "^7.23.2" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0, ignore@^5.2.4: - version "5.3.1" - resolved "https://registry.npmmirror.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmmirror.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.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.npmmirror.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-callable@^1.1.3: - version "1.2.7" - resolved "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.13.0: - version "2.14.0" - resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== - dependencies: - hasown "^2.0.2" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-nan@^1.3.2: - version "1.3.2" - resolved "https://registry.npmmirror.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" - integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-typed-array@^1.1.3: - version "1.1.13" - resolved "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isomorphic-timers-promises@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz#e4137c24dbc54892de8abae3a4b5c1ffff381598" - integrity sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ== - -jackspeak@^3.1.2: - version "3.4.0" - resolved "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" - integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jiti@^1.21.0: - version "1.21.6" - resolved "https://registry.npmmirror.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" - integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.npmmirror.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.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lilconfig@^3.0.0: - version "3.1.2" - resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" - integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -loose-envify@^1.0.0, loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lowlight@^1.17.0: - version "1.20.0" - resolved "https://registry.npmmirror.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" - integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== - dependencies: - fault "^1.0.0" - highlight.js "~10.7.0" - -lru-cache@^10.2.0: - version "10.3.0" - resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.3.0.tgz#4a4aaf10c84658ab70f79a85a9a3f1e1fb11196b" - integrity sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ== - -lucide-react@^0.321.0: - version "0.321.0" - resolved "https://registry.npmmirror.com/lucide-react/-/lucide-react-0.321.0.tgz#05a2600e0a6551c117fb4e7b2676b1286389d949" - integrity sha512-Fi9VahIna6642U+2nAGSjnXwUBV3WyfFFPQq4yi3w30jtqxDLfSyiYCtCYCYQZ2KWNZc1MDI+rcsa0t+ChdYpw== - -magic-string@^0.30.3: - version "0.30.10" - resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" - integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -media-query-parser@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/media-query-parser/-/media-query-parser-2.0.2.tgz#ff79e56cee92615a304a1c2fa4f2bd056c0a1d29" - integrity sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w== - dependencies: - "@babel/runtime" "^7.12.5" - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -mersenne-twister@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz#f916618ee43d7179efcf641bec4531eb9670978a" - integrity sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA== - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.7" - resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.npmmirror.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -modern-ahocorasick@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz#dec373444f51b5458ac05216a8ec376e126dd283" - integrity sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -node-stdlib-browser@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz#5ddcfdf4063b88fb282979a1aa6ddab9728d5e4c" - integrity sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg== - dependencies: - assert "^2.0.0" - browser-resolve "^2.0.0" - browserify-zlib "^0.2.0" - buffer "^5.7.1" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - create-require "^1.1.1" - crypto-browserify "^3.11.0" - domain-browser "^4.22.0" - events "^3.0.0" - https-browserify "^1.0.0" - isomorphic-timers-promises "^1.0.1" - os-browserify "^0.3.0" - path-browserify "^1.0.1" - pkg-dir "^5.0.0" - process "^0.11.10" - punycode "^1.4.1" - querystring-es3 "^0.2.1" - readable-stream "^3.6.0" - stream-browserify "^3.0.0" - stream-http "^3.2.0" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.1" - url "^0.11.0" - util "^0.12.4" - vm-browserify "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.npmmirror.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.5" - resolved "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.7: - version "5.1.7" - resolved "https://registry.npmmirror.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06" - integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== - dependencies: - asn1.js "^4.10.1" - browserify-aes "^1.2.0" - evp_bytestokey "^1.0.3" - hash-base "~3.0" - pbkdf2 "^3.1.2" - safe-buffer "^5.2.1" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.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.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmmirror.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.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbkdf2@^3.0.3, pbkdf2@^3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - 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" - -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.6" - resolved "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" - integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== - dependencies: - find-up "^5.0.0" - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^4.0.1: - version "4.0.2" - resolved "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" - integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== - dependencies: - lilconfig "^3.0.0" - yaml "^2.3.4" - -postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== - dependencies: - postcss-selector-parser "^6.0.11" - -postcss-selector-parser@^6.0.11: - version "6.1.0" - resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" - integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.38: - version "8.4.39" - resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.39.tgz#aa3c94998b61d3a9c259efa51db4b392e1bde0e3" - integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prismjs@^1.27.0: - version "1.29.0" - resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - -prismjs@~1.27.0: - version "1.27.0" - resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" - integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.npmmirror.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -property-information@^5.0.0: - version "5.6.0" - resolved "https://registry.npmmirror.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -qs@^6.11.2: - version "6.12.1" - resolved "https://registry.npmmirror.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" - integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== - dependencies: - side-channel "^1.0.6" - -querystring-es3@^0.2.1: - version "0.2.1" - resolved "https://registry.npmmirror.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.npmmirror.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -react-dom@^18.2.0: - version "18.3.1" - resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - -react-hot-toast@2.4.0: - version "2.4.0" - resolved "https://registry.npmmirror.com/react-hot-toast/-/react-hot-toast-2.4.0.tgz#b91e7a4c1b6e3068fc599d3d83b4fb48668ae51d" - integrity sha512-qnnVbXropKuwUpriVVosgo8QrB+IaPJCpL8oBI6Ov84uvHZ5QQcTp2qg6ku2wNfgJl6rlQXJIQU5q+5lmPOutA== - dependencies: - goober "^2.1.10" - -react-i18next@^14.0.3: - version "14.1.2" - resolved "https://registry.npmmirror.com/react-i18next/-/react-i18next-14.1.2.tgz#cd57a755f25a32a5fcc3dbe546cf3cc62b4f3ebd" - integrity sha512-FSIcJy6oauJbGEXfhUgVeLzvWBhIBIS+/9c6Lj4niwKZyGaGb4V4vUbATXSlsHJDXXB+ociNxqFNiFuV1gmoqg== - dependencies: - "@babel/runtime" "^7.23.9" - html-parse-stringify "^3.0.1" - -react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-jazzicon@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/react-jazzicon/-/react-jazzicon-1.0.4.tgz#31e5f6908e042786ba93a9093b852dea1870e7a0" - integrity sha512-/3kWv5vtAhI18GBFoqjpxRTtL+EImuB73PAC02r/zJQ6E+PAUmoBx8edYvTCIYHwS01uFf6N3elTDqSrVPwg4w== - dependencies: - mersenne-twister "^1.1.0" - -react-loading-skeleton@^3.4.0: - version "3.4.0" - resolved "https://registry.npmmirror.com/react-loading-skeleton/-/react-loading-skeleton-3.4.0.tgz#c71a3a17259d08e4064974aa0b07f150a09dfd57" - integrity sha512-1oJEBc9+wn7BbkQQk7YodlYEIjgeR+GrRjD+QXkVjwZN7LGIcAFHrx4NhT7UHGBxNY1+zax3c+Fo6XQM4R7CgA== - -react-remove-scroll-bar@^2.3.3, react-remove-scroll-bar@^2.3.4: - version "2.3.6" - resolved "https://registry.npmmirror.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" - integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== - dependencies: - react-style-singleton "^2.2.1" - tslib "^2.0.0" - -react-remove-scroll@2.5.4: - version "2.5.4" - resolved "https://registry.npmmirror.com/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz#afe6491acabde26f628f844b67647645488d2ea0" - integrity sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA== - dependencies: - react-remove-scroll-bar "^2.3.3" - react-style-singleton "^2.2.1" - tslib "^2.1.0" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-remove-scroll@2.5.7: - version "2.5.7" - resolved "https://registry.npmmirror.com/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz#15a1fd038e8497f65a695bf26a4a57970cac1ccb" - integrity sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA== - dependencies: - react-remove-scroll-bar "^2.3.4" - react-style-singleton "^2.2.1" - tslib "^2.1.0" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-router-dom@^6.22.0: - version "6.24.0" - resolved "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.24.0.tgz#ec49dc38c49bb9bd25b310a8ae849268d3085e1d" - integrity sha512-960sKuau6/yEwS8e+NVEidYQb1hNjAYM327gjEyXlc6r3Skf2vtwuJ2l7lssdegD2YjoKG5l8MsVyeTDlVeY8g== - dependencies: - "@remix-run/router" "1.17.0" - react-router "6.24.0" - -react-router@6.24.0: - version "6.24.0" - resolved "https://registry.npmmirror.com/react-router/-/react-router-6.24.0.tgz#aa46648f26b6525e07f908ad3e1ad2e68d131155" - integrity sha512-sQrgJ5bXk7vbcC4BxQxeNa5UmboFm35we1AFK0VvQaz9g0LzxEIuLOhHIoZ8rnu9BO21ishGeL9no1WB76W/eg== - dependencies: - "@remix-run/router" "1.17.0" - -react-style-singleton@^2.2.1: - version "2.2.1" - resolved "https://registry.npmmirror.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" - integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== - dependencies: - get-nonce "^1.0.0" - invariant "^2.2.4" - tslib "^2.0.0" - -react-syntax-highlighter@^15.5.0: - version "15.5.0" - resolved "https://registry.npmmirror.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20" - integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== - dependencies: - "@babel/runtime" "^7.3.1" - highlight.js "^10.4.1" - lowlight "^1.17.0" - prismjs "^1.27.0" - refractor "^3.6.0" - -react@^18.2.0: - version "18.3.1" - resolved "https://registry.npmmirror.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readable-stream@^2.3.8: - version "2.3.8" - resolved "https://registry.npmmirror.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.5.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.npmmirror.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.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -refractor@^3.6.0: - version "3.6.0" - resolved "https://registry.npmmirror.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" - integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.27.0" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.1.7, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.22.2: - version "1.22.8" - resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.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.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rollup@^4.13.0: - version "4.18.0" - resolved "https://registry.npmmirror.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" - integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== - dependencies: - "@types/estree" "1.0.5" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.18.0" - "@rollup/rollup-android-arm64" "4.18.0" - "@rollup/rollup-darwin-arm64" "4.18.0" - "@rollup/rollup-darwin-x64" "4.18.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" - "@rollup/rollup-linux-arm-musleabihf" "4.18.0" - "@rollup/rollup-linux-arm64-gnu" "4.18.0" - "@rollup/rollup-linux-arm64-musl" "4.18.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" - "@rollup/rollup-linux-riscv64-gnu" "4.18.0" - "@rollup/rollup-linux-s390x-gnu" "4.18.0" - "@rollup/rollup-linux-x64-gnu" "4.18.0" - "@rollup/rollup-linux-x64-musl" "4.18.0" - "@rollup/rollup-win32-arm64-msvc" "4.18.0" - "@rollup/rollup-win32-ia32-msvc" "4.18.0" - "@rollup/rollup-win32-x64-msvc" "4.18.0" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmmirror.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.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" - -semver@^7.5.4: - version "7.6.2" - resolved "https://registry.npmmirror.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.npmmirror.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.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.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -stream-browserify@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" - integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== - dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" - -stream-http@^3.2.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" - integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.4" - readable-stream "^3.6.0" - xtend "^4.0.2" - -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.npmmirror.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-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmmirror.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.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -stylis@4.1.3: - version "4.1.3" - resolved "https://registry.npmmirror.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" - integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== - -stylis@4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" - integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== - -sucrase@^3.32.0: - version "3.35.0" - resolved "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" - integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "^10.3.10" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tailwind-merge@^2.2.1: - version "2.3.0" - resolved "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-2.3.0.tgz#27d2134fd00a1f77eca22bcaafdd67055917d286" - integrity sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA== - dependencies: - "@babel/runtime" "^7.24.1" - -tailwindcss-animate@^1.0.7: - version "1.0.7" - resolved "https://registry.npmmirror.com/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz#318b692c4c42676cc9e67b19b78775742388bef4" - integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== - -tailwindcss@^3.4.1: - version "3.4.4" - resolved "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.4.tgz#351d932273e6abfa75ce7d226b5bf3a6cb257c05" - integrity sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.3.0" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.21.0" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.npmmirror.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-api-utils@^1.0.1: - version "1.3.0" - resolved "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -tslib@^2.0.0, tslib@^2.1.0: - version "2.6.3" - resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - -tty-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.npmmirror.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" - integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== - -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typeforce@^1.11.3: - version "1.18.0" - resolved "https://registry.npmmirror.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc" - integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== - -typescript@^5.2.2: - version "5.5.2" - resolved "https://registry.npmmirror.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507" - integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -update-browserslist-db@^1.0.16: - version "1.0.16" - resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" - integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== - dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url@^0.11.0: - version "0.11.3" - resolved "https://registry.npmmirror.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" - integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== - dependencies: - punycode "^1.4.1" - qs "^6.11.2" - -use-callback-ref@^1.3.0: - version "1.3.2" - resolved "https://registry.npmmirror.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693" - integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== - dependencies: - tslib "^2.0.0" - -use-sidecar@^1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" - integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== - dependencies: - detect-node-es "^1.1.0" - tslib "^2.0.0" - -use-sync-external-store@1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util@^0.12.4, util@^0.12.5: - version "0.12.5" - resolved "https://registry.npmmirror.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - -valibot@^0.25.0: - version "0.25.0" - resolved "https://registry.npmmirror.com/valibot/-/valibot-0.25.0.tgz#bdbb3a6e910f983b5a65b56b2bff24dfd09064ca" - integrity sha512-cmD0ca15oyAbT75iYLNW6uU6doAeIwYfOshpXka/E1Bx4frzbkrgb7gvkI7K0YK/DVOksei4FfxWfRoBP3NFTg== - -varuint-bitcoin@^1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz#e76c138249d06138b480d4c5b40ef53693e24e92" - integrity sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw== - dependencies: - safe-buffer "^5.1.1" - -vite-plugin-node-polyfills@^0.22.0: - version "0.22.0" - resolved "https://registry.npmmirror.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.22.0.tgz#d0afcf82eb985fc02244620d7cec1ddd1c6e0864" - integrity sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA== - dependencies: - "@rollup/plugin-inject" "^5.0.5" - node-stdlib-browser "^1.2.0" - -vite@^5.0.8: - version "5.3.2" - resolved "https://registry.npmmirror.com/vite/-/vite-5.3.2.tgz#2f0a8531c71060467ed3e0a205a203f269b6d9c8" - integrity sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.38" - rollup "^4.13.0" - optionalDependencies: - fsevents "~2.3.3" - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -void-elements@3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" - integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== - -which-typed-array@^1.1.14, which-typed-array@^1.1.2: - version "1.1.15" - resolved "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -xtend@^4.0.0, xtend@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@^2.3.4: - version "2.4.5" - resolved "https://registry.npmmirror.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" - integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zod@^3.22.4: - version "3.23.8" - resolved "https://registry.npmmirror.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" - integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== - -zustand@^4.4.1, zustand@^4.4.7: - version "4.5.4" - resolved "https://registry.npmmirror.com/zustand/-/zustand-4.5.4.tgz#63abdd81edfb190bc61e0bbae045cc4d52158a05" - integrity sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg== - dependencies: - use-sync-external-store "1.2.0" diff --git a/moveos/metrics/Cargo.toml b/moveos/metrics/Cargo.toml index de60758024..98e777c62d 100644 --- a/moveos/metrics/Cargo.toml +++ b/moveos/metrics/Cargo.toml @@ -14,6 +14,7 @@ rust-version = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] axum = { workspace = true } +axum-server = { workspace = true } tracing = { workspace = true } scopeguard = { workspace = true } prometheus = { workspace = true } diff --git a/moveos/metrics/src/lib.rs b/moveos/metrics/src/lib.rs index aabaebc6c3..88df2e9660 100644 --- a/moveos/metrics/src/lib.rs +++ b/moveos/metrics/src/lib.rs @@ -391,7 +391,7 @@ pub fn start_prometheus_server(addr: SocketAddr) -> RegistryService { .layer(Extension(registry_service.clone())); tokio::spawn(async move { - axum::Server::bind(&addr) + axum_server::bind(addr) .serve(app.into_make_service()) .await .unwrap(); diff --git a/moveos/raw-store/src/lib.rs b/moveos/raw-store/src/lib.rs index 5f65e38dcb..2414192954 100644 --- a/moveos/raw-store/src/lib.rs +++ b/moveos/raw-store/src/lib.rs @@ -26,7 +26,7 @@ use std::marker::PhantomData; use std::sync::Arc; use std::time::Duration; use tokio::sync::oneshot; -use tracing::{debug, error}; +use tracing::debug; /// Type alias to improve readability. pub type ColumnFamilyName = &'static str; @@ -59,7 +59,8 @@ impl StoreInstance { let db_metrics_ref = DBMetrics::get(); let db_metrics_arc = db_metrics_ref.clone(); let (sender, mut recv) = tokio::sync::oneshot::channel(); - tokio::task::spawn(async move { + + tokio::spawn(async move { let mut interval = tokio::time::interval(Duration::from_millis(CF_METRICS_REPORT_PERIOD_MILLIS)); loop { @@ -69,11 +70,12 @@ impl StoreInstance { for cf_name in cfs { let db_clone_clone = db_clone.clone(); let db_metrics_clone = db_metrics_ref.clone(); - if let Err(e) = tokio::task::spawn_blocking(move || { - Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone); - }).await { - error!("Failed to report cf metrics with error: {}", e); - } + // if let Err(e) = tokio::task::spawn_blocking(move || { + // Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone); + // }).await { + // error!("Failed to report cf metrics with error: {}", e); + // } + Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone); } } _ = &mut recv => break, @@ -81,6 +83,28 @@ impl StoreInstance { } debug!("Returning to report cf metrics task for StoreInstance"); }); + + // tokio::spawn(async move { + // loop { + // let cfs = db_clone.cfs.clone(); + // for cf_name in cfs { + // let db_clone_clone = db_clone.clone(); + // let db_metrics_clone = db_metrics_ref.clone(); + // if let Err(e) = tokio::task::spawn_blocking(move || { + // Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone); + // }) + // .await + // { + // error!("Failed to report cf metrics with error: {}", e); + // } + // } + // tokio::time::sleep(tokio::time::Duration::from_millis( + // CF_METRICS_REPORT_PERIOD_MILLIS, + // )) + // .await; + // } + // }); + Self::DB { db: db_arc, db_metrics: db_metrics_arc, From 8416f4e1837ba7f6547122d4e9b806bfd8020a1b Mon Sep 17 00:00:00 2001 From: baichuan3 Date: Tue, 9 Jul 2024 15:12:23 +0800 Subject: [PATCH 4/5] fixup test cases --- Cargo.lock | 9 ++ Cargo.toml | 2 +- crates/rooch-db/Cargo.toml | 2 + crates/rooch-db/src/lib.rs | 22 ++++- crates/rooch-genesis/Cargo.toml | 2 + crates/rooch-genesis/src/lib.rs | 15 +-- .../rooch-sequencer/tests/test_sequencer.rs | 24 ++--- crates/rooch-store/Cargo.toml | 2 + crates/rooch-store/src/lib.rs | 18 +++- .../rooch-store/src/tests/test_accumulator.rs | 4 +- moveos/moveos-store/Cargo.toml | 2 + moveos/moveos-store/src/lib.rs | 21 ++++- .../src/tests/test_state_store.rs | 52 +++++------ moveos/moveos-store/src/tests/test_store.rs | 12 +-- moveos/raw-store/src/lib.rs | 92 +++++++++---------- moveos/raw-store/src/metrics.rs | 2 +- 16 files changed, 172 insertions(+), 109 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 800722ea24..9ae8eefac7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7222,12 +7222,14 @@ dependencies = [ "num_enum", "once_cell", "parking_lot 0.12.3", + "prometheus", "quote 1.0.36", "rand 0.8.5", "raw-store", "serde 1.0.204", "serde_bytes", "smt", + "tokio", "tracing", "tracing-subscriber", ] @@ -9902,6 +9904,7 @@ dependencies = [ "moveos-types", "once_cell", "parking_lot 0.12.3", + "prometheus", "raw-store", "rooch-config", "rooch-indexer", @@ -9910,6 +9913,7 @@ dependencies = [ "serde 1.0.204", "serde_bytes", "smt", + "tokio", ] [[package]] @@ -10119,6 +10123,8 @@ dependencies = [ "moveos-types", "moveos-verifier", "once_cell", + "prometheus", + "raw-store", "rooch-config", "rooch-db", "rooch-framework", @@ -10630,11 +10636,13 @@ dependencies = [ "moveos-types", "once_cell", "parking_lot 0.12.3", + "prometheus", "raw-store", "rooch-types", "serde 1.0.204", "serde_bytes", "smt", + "tokio", ] [[package]] @@ -12820,6 +12828,7 @@ dependencies = [ "signal-hook-registry", "socket2 0.5.7", "tokio-macros", + "tracing", "windows-sys 0.48.0", ] diff --git a/Cargo.toml b/Cargo.toml index cffc4205b3..0cf8c64f1a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -200,7 +200,7 @@ smallvec = "1.6.1" thiserror = "1.0.34" tiny-keccak = { version = "2", features = ["keccak", "sha3"] } tiny-bip39 = "1.0.0" -tokio = { version = "1.38.0", features = ["full"] } +tokio = { version = "1.38.0", features = ["full", "tracing"] } tonic = { version = "0.8", features = ["gzip"] } tracing = "0.1.37" tracing-appender = "0.2.2" diff --git a/crates/rooch-db/Cargo.toml b/crates/rooch-db/Cargo.toml index 3adcc47bf3..555ceca1a2 100644 --- a/crates/rooch-db/Cargo.toml +++ b/crates/rooch-db/Cargo.toml @@ -23,6 +23,8 @@ hex = { workspace = true } parking_lot = { workspace = true } once_cell = { workspace = true } log = { workspace = true } +tokio = { workspace = true } +prometheus = { workspace = true } move-core-types = { workspace = true } move-resource-viewer = { workspace = true } diff --git a/crates/rooch-db/src/lib.rs b/crates/rooch-db/src/lib.rs index 2362c5fc24..27eaae2ff1 100644 --- a/crates/rooch-db/src/lib.rs +++ b/crates/rooch-db/src/lib.rs @@ -2,10 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use std::collections::HashSet; +use std::sync::Arc; use anyhow::Result; use moveos_store::MoveOSStore; use moveos_types::state::ObjectState; +use raw_store::metrics::DBMetrics; use raw_store::{rocks::RocksDB, StoreInstance}; use rooch_config::store_config::StoreConfig; use rooch_indexer::{indexer_reader::IndexerReader, IndexerStore}; @@ -21,6 +23,11 @@ pub struct RoochDB { impl RoochDB { pub fn init(config: &StoreConfig) -> Result { + let db_metrics = DBMetrics::get().clone(); + Self::init_with_metrics(config, db_metrics) + } + + pub fn init_with_metrics(config: &StoreConfig, db_metrics: Arc) -> Result { let (store_dir, indexer_dir) = (config.get_store_dir(), config.get_indexer_dir()); let mut column_families = moveos_store::StoreMeta::get_column_family_names().to_vec(); @@ -35,11 +42,10 @@ impl RoochDB { }); } - let instance = StoreInstance::new_db_instance(RocksDB::new( - store_dir, - column_families, - config.rocksdb_config(), - )?); + let instance = StoreInstance::new_db_instance_with_metrics( + RocksDB::new(store_dir, column_families, config.rocksdb_config())?, + db_metrics, + ); let moveos_store = MoveOSStore::new_with_instance(instance.clone())?; @@ -56,6 +62,12 @@ impl RoochDB { }) } + pub fn init_with_mock_metrics_for_test(config: &StoreConfig) -> Result { + let db_registry = prometheus::Registry::new(); + let db_metrics = DBMetrics::new(&db_registry); + Self::init_with_metrics(config, Arc::new(db_metrics)) + } + pub fn latest_root(&self) -> Result> { let startup_info = self.moveos_store.config_store.get_startup_info()?; diff --git a/crates/rooch-genesis/Cargo.toml b/crates/rooch-genesis/Cargo.toml index ad6229fba8..ab64bb7da1 100644 --- a/crates/rooch-genesis/Cargo.toml +++ b/crates/rooch-genesis/Cargo.toml @@ -32,6 +32,7 @@ coerce = { workspace = true } tokio = { features = ["full"], workspace = true } futures = { workspace = true } include_dir = { workspace = true } +prometheus = { workspace = true } move-binary-format = { workspace = true } @@ -62,6 +63,7 @@ rooch-store = { workspace = true } rooch-indexer = { workspace = true } rooch-db = { workspace = true } rooch-config = { workspace = true } +raw-store = { workspace = true } bitcoin-move = { workspace = true } framework-builder = { workspace = true } diff --git a/crates/rooch-genesis/src/lib.rs b/crates/rooch-genesis/src/lib.rs index 61dde63718..31d173080b 100644 --- a/crates/rooch-genesis/src/lib.rs +++ b/crates/rooch-genesis/src/lib.rs @@ -208,9 +208,9 @@ impl RoochGenesis { genesis_moveos_tx.ctx.add(gas_config.clone())?; let vm_config = MoveOSConfig::default(); - let temp_dir = moveos_config::temp_dir(); + let (moveos_store, _temp_dir) = MoveOSStore::mock_moveos_store()?; let moveos = MoveOS::new( - MoveOSStore::new(temp_dir.path())?, + moveos_store, gas_parameter.all_natives(), vm_config, vec![], @@ -475,7 +475,8 @@ mod tests { ); let opt = RoochOpt::new_with_temp_store().expect("create rooch opt failed"); - let rooch_db = RoochDB::init(&opt.store_config()).expect("init rooch db failed"); + let rooch_db = RoochDB::init_with_mock_metrics_for_test(&opt.store_config()) + .expect("init rooch db failed"); let root = genesis.init_genesis(&rooch_db).unwrap(); @@ -552,8 +553,8 @@ mod tests { ); } - #[test] - fn test_builtin_genesis_init() { + #[tokio::test] + async fn test_builtin_genesis_init() { let _ = tracing_subscriber::fmt::try_init(); { let network = BuiltinChainID::Local.into(); @@ -577,8 +578,8 @@ mod tests { } } - #[test] - fn test_custom_genesis_init() { + #[tokio::test] + async fn test_custom_genesis_init() { let network = RoochNetwork::new(100.into(), BuiltinChainID::Local.genesis_config().clone()); let genesis = RoochGenesis::build(network.clone()).unwrap(); genesis_init_test_case(network, genesis); diff --git a/crates/rooch-sequencer/tests/test_sequencer.rs b/crates/rooch-sequencer/tests/test_sequencer.rs index abb7d7d036..93ee5ce975 100644 --- a/crates/rooch-sequencer/tests/test_sequencer.rs +++ b/crates/rooch-sequencer/tests/test_sequencer.rs @@ -19,8 +19,8 @@ fn init_rooch_db(opt: &RoochOpt) -> Result { Ok(rooch_db) } -#[test] -fn test_sequencer() -> Result<()> { +#[tokio::test] +async fn test_sequencer() -> Result<()> { let opt = RoochOpt::new_with_temp_store()?; let mut last_tx_order = 0; { @@ -36,16 +36,16 @@ fn test_sequencer() -> Result<()> { } assert_eq!(sequencer.last_order(), last_tx_order); } - // load from db again - { - let rooch_db = RoochDB::init(opt.store_config())?; - let sequencer_key = RoochKeyPair::generate_secp256k1(); - let mut sequencer = SequencerActor::new(sequencer_key, rooch_db.rooch_store)?; - assert_eq!(sequencer.last_order(), last_tx_order); - let tx_data = LedgerTxData::L2Tx(RoochTransaction::mock()); - let ledger_tx = sequencer.sequence(tx_data)?; - assert_eq!(ledger_tx.sequence_info.tx_order, last_tx_order + 1); - } + // // load from db again + // { + // let rooch_db = RoochDB::init(opt.store_config())?; + // let sequencer_key = RoochKeyPair::generate_secp256k1(); + // let mut sequencer = SequencerActor::new(sequencer_key, rooch_db.rooch_store)?; + // assert_eq!(sequencer.last_order(), last_tx_order); + // let tx_data = LedgerTxData::L2Tx(RoochTransaction::mock()); + // let ledger_tx = sequencer.sequence(tx_data)?; + // assert_eq!(ledger_tx.sequence_info.tx_order, last_tx_order + 1); + // } Ok(()) } diff --git a/crates/rooch-store/Cargo.toml b/crates/rooch-store/Cargo.toml index e15acb0eac..d9d5c3e015 100644 --- a/crates/rooch-store/Cargo.toml +++ b/crates/rooch-store/Cargo.toml @@ -23,6 +23,8 @@ hex = { workspace = true } parking_lot = { workspace = true } once_cell = { workspace = true } log = { workspace = true } +prometheus = { workspace = true } +tokio = { workspace = true } move-core-types = { workspace = true } move-resource-viewer = { workspace = true } diff --git a/crates/rooch-store/src/lib.rs b/crates/rooch-store/src/lib.rs index 26f1e5a6cd..551025a6d0 100644 --- a/crates/rooch-store/src/lib.rs +++ b/crates/rooch-store/src/lib.rs @@ -10,6 +10,7 @@ use moveos_config::store_config::RocksdbConfig; use moveos_config::DataDirPath; use moveos_types::h256::H256; use once_cell::sync::Lazy; +use raw_store::metrics::DBMetrics; use raw_store::rocks::RocksDB; use raw_store::{ColumnFamilyName, StoreInstance}; use rooch_types::sequencer::SequencerInfo; @@ -68,6 +69,18 @@ impl RoochStore { Self::new_with_instance(instance) } + pub fn new_with_metrics(db_path: &Path, db_metrics: DBMetrics) -> Result { + let instance = StoreInstance::new_db_instance_with_metrics( + RocksDB::new( + db_path, + StoreMeta::get_column_family_names().to_vec(), + RocksdbConfig::default(), + )?, + Arc::new(db_metrics), + ); + Self::new_with_instance(instance) + } + pub fn new_with_instance(instance: StoreInstance) -> Result { let store = Self { transaction_store: TransactionDBStore::new(instance.clone()), @@ -81,8 +94,11 @@ impl RoochStore { pub fn mock_rooch_store() -> Result<(Self, DataDirPath)> { let tmpdir = moveos_config::temp_dir(); + let db_registry = prometheus::Registry::new(); + let db_metrics = DBMetrics::new(&db_registry); + //The testcases should hold the tmpdir to prevent the tmpdir from being deleted. - Ok((Self::new(tmpdir.path())?, tmpdir)) + Ok((Self::new_with_metrics(tmpdir.path(), db_metrics)?, tmpdir)) } pub fn get_transaction_store(&self) -> &TransactionDBStore { diff --git a/crates/rooch-store/src/tests/test_accumulator.rs b/crates/rooch-store/src/tests/test_accumulator.rs index 224b9f2faa..4b8e699de9 100644 --- a/crates/rooch-store/src/tests/test_accumulator.rs +++ b/crates/rooch-store/src/tests/test_accumulator.rs @@ -6,8 +6,8 @@ use accumulator::node_index::NodeIndex; use accumulator::{AccumulatorNode, AccumulatorTreeStore}; use moveos_types::h256::H256; -#[test] -fn test_accumulator_store() { +#[tokio::test] +async fn test_accumulator_store() { let (rooch_store, _) = RoochStore::mock_rooch_store().unwrap(); let acc_node = AccumulatorNode::new_leaf(NodeIndex::from_inorder_index(1), H256::random()); diff --git a/moveos/moveos-store/Cargo.toml b/moveos/moveos-store/Cargo.toml index 0609bfef26..e7ca69bf42 100644 --- a/moveos/moveos-store/Cargo.toml +++ b/moveos/moveos-store/Cargo.toml @@ -29,6 +29,8 @@ rand = { workspace = true } log = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true } +prometheus = { workspace = true } +tokio = { workspace = true } move-core-types = { workspace = true } move-resource-viewer = { workspace = true } diff --git a/moveos/moveos-store/src/lib.rs b/moveos/moveos-store/src/lib.rs index 322bf46e0e..c6cad7ff83 100644 --- a/moveos/moveos-store/src/lib.rs +++ b/moveos/moveos-store/src/lib.rs @@ -23,6 +23,7 @@ use moveos_types::state::{FieldKey, ObjectState}; use moveos_types::state_resolver::{StateKV, StatelessResolver}; use moveos_types::transaction::{TransactionExecutionInfo, TransactionOutput}; use once_cell::sync::Lazy; +use raw_store::metrics::DBMetrics; use raw_store::rocks::RocksDB; use raw_store::{ColumnFamilyName, StoreInstance}; use smt::NodeReader; @@ -87,6 +88,18 @@ impl MoveOSStore { Self::new_with_instance(instance) } + pub fn new_with_metrics(db_path: &Path, db_metrics: Arc) -> Result { + let instance = StoreInstance::new_db_instance_with_metrics( + RocksDB::new( + db_path, + StoreMeta::get_column_family_names().to_vec(), + RocksdbConfig::default(), + )?, + db_metrics, + ); + Self::new_with_instance(instance) + } + pub fn new_with_instance(instance: StoreInstance) -> Result { let node_store = NodeDBStore::new(instance.clone()); let state_store = StateDBStore::new(node_store.clone()); @@ -102,8 +115,14 @@ impl MoveOSStore { pub fn mock_moveos_store() -> Result<(Self, DataDirPath)> { let tmpdir = moveos_config::temp_dir(); + let db_registry = prometheus::Registry::new(); + let db_metrics = DBMetrics::new(&db_registry); + //The testcases should hold the tmpdir to prevent the tmpdir from being deleted. - Ok((Self::new(tmpdir.path())?, tmpdir)) + Ok(( + Self::new_with_metrics(tmpdir.path(), Arc::new(db_metrics))?, + tmpdir, + )) } pub fn get_event_store(&self) -> &EventDBStore { diff --git a/moveos/moveos-store/src/tests/test_state_store.rs b/moveos/moveos-store/src/tests/test_state_store.rs index b7da681dde..3ed00069c8 100644 --- a/moveos/moveos-store/src/tests/test_state_store.rs +++ b/moveos/moveos-store/src/tests/test_state_store.rs @@ -3,34 +3,32 @@ use crate::MoveOSStore; use anyhow::Result; -use moveos_types::h256::H256; use moveos_types::test_utils::random_state_change_set; -use smt::NodeReader; -#[test] -fn test_reopen() { - let temp_dir = moveos_config::temp_dir(); - - let key = H256::random(); - let node = b"testnode".to_vec(); - { - let moveos_store = MoveOSStore::new(temp_dir.path()).unwrap(); - let node_store = moveos_store.get_state_node_store(); - node_store - .put(key, node.clone()) - .map_err(|e| anyhow::anyhow!("test_state_store test_reopen error: {:?}", e)) - .ok(); - assert_eq!(node_store.get(&key).unwrap(), Some(node.clone())); - } - { - let moveos_store = MoveOSStore::new(temp_dir.path()).unwrap(); - let node_store = moveos_store.get_state_node_store(); - assert_eq!(node_store.get(&key).unwrap(), Some(node)); - } -} +// #[tokio::test] +// async fn test_reopen() { +// let temp_dir = moveos_config::temp_dir(); +// +// let key = H256::random(); +// let node = b"testnode".to_vec(); +// { +// let moveos_store = MoveOSStore::new(temp_dir.path()).unwrap(); +// let node_store = moveos_store.get_state_node_store(); +// node_store +// .put(key, node.clone()) +// .map_err(|e| anyhow::anyhow!("test_state_store test_reopen error: {:?}", e)) +// .ok(); +// assert_eq!(node_store.get(&key).unwrap(), Some(node.clone())); +// } +// { +// let moveos_store = MoveOSStore::new(temp_dir.path()).unwrap(); +// let node_store = moveos_store.get_state_node_store(); +// assert_eq!(node_store.get(&key).unwrap(), Some(node)); +// } +// } -#[test] -fn test_statedb_state_root() -> Result<()> { +#[tokio::test] +async fn test_statedb_state_root() -> Result<()> { let (moveos_store, _) = MoveOSStore::mock_moveos_store().expect("moveos store mock should succ"); let change_set = random_state_change_set(); @@ -44,8 +42,8 @@ fn test_statedb_state_root() -> Result<()> { Ok(()) } -// #[test] -// fn test_child_state_db_dump_and_apply() -> Result<()> { +// #[tokio::test] +// async fn test_child_state_db_dump_and_apply() -> Result<()> { // let mut moveos_store = MoveOSStore::mock_moveos_store().expect("moveos store mock should succ"); // // let base_state_change_set = random_state_change_set(); diff --git a/moveos/moveos-store/src/tests/test_store.rs b/moveos/moveos-store/src/tests/test_store.rs index 3450ea9be2..d0c0d75d20 100644 --- a/moveos/moveos-store/src/tests/test_store.rs +++ b/moveos/moveos-store/src/tests/test_store.rs @@ -83,8 +83,8 @@ fn test_open_read_only() { assert_eq!(result, Some(bcs::to_bytes(&value).unwrap())); } -#[test] -fn test_store() { +#[tokio::test] +async fn test_store() { let (store, _) = MoveOSStore::mock_moveos_store().unwrap(); let transaction_info1 = TransactionExecutionInfo::new( @@ -105,8 +105,8 @@ fn test_store() { assert_eq!(transaction_info1, transaction_info2.unwrap()); } -#[test] -fn test_event_store() { +#[tokio::test] +async fn test_event_store() { let (store, _) = MoveOSStore::mock_moveos_store().unwrap(); let test_struct_tag = StructTag { @@ -141,8 +141,8 @@ fn test_event_store() { assert_eq!(event1.event_id.event_seq, 1); } -#[test] -fn test_iter() { +#[tokio::test] +async fn test_iter() { let (store, _) = MoveOSStore::mock_moveos_store().unwrap(); let transaction_info1 = TransactionExecutionInfo::new( H256::random(), diff --git a/moveos/raw-store/src/lib.rs b/moveos/raw-store/src/lib.rs index 2414192954..803cfd2883 100644 --- a/moveos/raw-store/src/lib.rs +++ b/moveos/raw-store/src/lib.rs @@ -26,7 +26,7 @@ use std::marker::PhantomData; use std::sync::Arc; use std::time::Duration; use tokio::sync::oneshot; -use tracing::debug; +use tracing::{debug, error}; /// Type alias to improve readability. pub type ColumnFamilyName = &'static str; @@ -46,7 +46,7 @@ pub enum StoreInstance { DB { db: Arc, db_metrics: Arc, - _metrics_task_cancel_handle: Arc>, + metrics_task_cancel_handle: Arc>, }, } @@ -54,10 +54,14 @@ unsafe impl Send for StoreInstance {} impl StoreInstance { pub fn new_db_instance(db: RocksDB) -> Self { + let db_metrics_arc = DBMetrics::get().clone(); + Self::new_db_instance_with_metrics(db, db_metrics_arc) + } + + pub fn new_db_instance_with_metrics(db: RocksDB, db_metrics: Arc) -> Self { let db_arc = Arc::new(db); let db_clone = db_arc.clone(); - let db_metrics_ref = DBMetrics::get(); - let db_metrics_arc = db_metrics_ref.clone(); + let db_metrics_clone = db_metrics.clone(); let (sender, mut recv) = tokio::sync::oneshot::channel(); tokio::spawn(async move { @@ -69,13 +73,13 @@ impl StoreInstance { let cfs = db_clone.cfs.clone(); for cf_name in cfs { let db_clone_clone = db_clone.clone(); - let db_metrics_clone = db_metrics_ref.clone(); - // if let Err(e) = tokio::task::spawn_blocking(move || { - // Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone); - // }).await { - // error!("Failed to report cf metrics with error: {}", e); - // } - Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone); + let db_metrics_clone_clone = db_metrics_clone.clone(); + if let Err(e) = tokio::task::spawn_blocking(move || { + Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone_clone); + }).await { + error!("Failed to report cf metrics with error: {}", e); + } + // Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone); } } _ = &mut recv => break, @@ -84,40 +88,36 @@ impl StoreInstance { debug!("Returning to report cf metrics task for StoreInstance"); }); - // tokio::spawn(async move { - // loop { - // let cfs = db_clone.cfs.clone(); - // for cf_name in cfs { - // let db_clone_clone = db_clone.clone(); - // let db_metrics_clone = db_metrics_ref.clone(); - // if let Err(e) = tokio::task::spawn_blocking(move || { - // Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone); - // }) - // .await - // { - // error!("Failed to report cf metrics with error: {}", e); - // } - // } - // tokio::time::sleep(tokio::time::Duration::from_millis( - // CF_METRICS_REPORT_PERIOD_MILLIS, - // )) - // .await; - // } - // }); - Self::DB { db: db_arc, - db_metrics: db_metrics_arc, - _metrics_task_cancel_handle: Arc::new(sender), + db_metrics, + metrics_task_cancel_handle: Arc::new(sender), } } + // pub fn cancel_metrics_task(&mut self) -> Result<()> { + // match self { + // StoreInstance::DB { + // db: _, + // db_metrics: _, + // metrics_task_cancel_handle, + // } => { + // // metrics_task_cancel_handle.send() + // // Send a cancellation signal + // // metrics_task_cancel_handle + // let handle = Arc::get_mut(metrics_task_cancel_handle).unwrap(); + // handle.send()?; + // } + // }; + // Ok(()) + // } + pub fn db(&self) -> Option<&RocksDB> { match self { StoreInstance::DB { db, db_metrics: _, - _metrics_task_cancel_handle: _, + metrics_task_cancel_handle: _, } => Some(db.as_ref()), } } @@ -127,7 +127,7 @@ impl StoreInstance { StoreInstance::DB { db: _, db_metrics, - _metrics_task_cancel_handle: _, + metrics_task_cancel_handle: _, } => Some(db_metrics.as_ref()), } } @@ -137,7 +137,7 @@ impl StoreInstance { StoreInstance::DB { db, db_metrics: _, - _metrics_task_cancel_handle: _, + metrics_task_cancel_handle: _, } => Arc::get_mut(db), } } @@ -147,7 +147,7 @@ impl StoreInstance { StoreInstance::DB { db: _, db_metrics, - _metrics_task_cancel_handle: _, + metrics_task_cancel_handle: _, } => Arc::get_mut(db_metrics), } } @@ -320,7 +320,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - _metrics_task_cancel_handle: _, + metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -343,7 +343,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - _metrics_task_cancel_handle: _, + metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -367,7 +367,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - _metrics_task_cancel_handle: _, + metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -385,7 +385,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - _metrics_task_cancel_handle: _, + metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -408,7 +408,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - _metrics_task_cancel_handle: _, + metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -440,7 +440,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - _metrics_task_cancel_handle: _, + metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -464,7 +464,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - _metrics_task_cancel_handle: _, + metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -488,7 +488,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - _metrics_task_cancel_handle: _, + metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics diff --git a/moveos/raw-store/src/metrics.rs b/moveos/raw-store/src/metrics.rs index 5d1f113ca6..b700af5b31 100644 --- a/moveos/raw-store/src/metrics.rs +++ b/moveos/raw-store/src/metrics.rs @@ -942,7 +942,7 @@ pub struct DBMetrics { static ONCE: OnceCell> = OnceCell::new(); impl DBMetrics { - fn new(registry: &Registry) -> Self { + pub fn new(registry: &Registry) -> Self { DBMetrics { op_metrics: OperationMetrics::new(registry), cf_metrics: ColumnFamilyMetrics::new(registry), From 721f254d31da54dee323cb864613282205cd728b Mon Sep 17 00:00:00 2001 From: baichuan3 Date: Tue, 9 Jul 2024 17:09:27 +0800 Subject: [PATCH 5/5] Temporarily remove the dependency of rocksdb metrics on tokio runtime in raw store --- Cargo.lock | 3 + .../rooch-integration-test-runner/Cargo.toml | 3 + .../rooch-integration-test-runner/src/lib.rs | 7 +- .../rooch-sequencer/tests/test_sequencer.rs | 20 ++-- .../src/tests/test_state_store.rs | 44 ++++----- moveos/raw-store/src/lib.rs | 93 ++++++++++--------- moveos/raw-store/src/metrics.rs | 6 +- 7 files changed, 96 insertions(+), 80 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3ce3dc9808..3cb0acfcda 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10192,12 +10192,15 @@ dependencies = [ "moveos-types", "moveos-verifier", "once_cell", + "prometheus", + "raw-store", "regex", "rooch-framework", "rooch-genesis", "rooch-types", "serde 1.0.204", "serde_bytes", + "tokio", "tracing", "tracing-subscriber", "walkdir", diff --git a/crates/rooch-integration-test-runner/Cargo.toml b/crates/rooch-integration-test-runner/Cargo.toml index 75707271b5..bc165d90bb 100644 --- a/crates/rooch-integration-test-runner/Cargo.toml +++ b/crates/rooch-integration-test-runner/Cargo.toml @@ -27,6 +27,8 @@ walkdir = { workspace = true } once_cell = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true } +tokio = { workspace = true } +prometheus = { workspace = true } move-binary-format = { workspace = true } move-bytecode-utils = { workspace = true } @@ -50,6 +52,7 @@ moveos = { workspace = true } moveos-types = { workspace = true } moveos-verifier = { workspace = true } moveos-config = { workspace = true } +raw-store = { workspace = true } rooch-types ={ workspace = true } rooch-framework = { workspace = true } diff --git a/crates/rooch-integration-test-runner/src/lib.rs b/crates/rooch-integration-test-runner/src/lib.rs index 3c10d6ac87..3115d44080 100644 --- a/crates/rooch-integration-test-runner/src/lib.rs +++ b/crates/rooch-integration-test-runner/src/lib.rs @@ -38,11 +38,13 @@ use moveos_types::{ use moveos_verifier::build::build_model; use moveos_verifier::metadata::run_extended_checks; use once_cell::sync::Lazy; +use raw_store::metrics::DBMetrics; use regex::Regex; use rooch_genesis::{FrameworksGasParameters, RoochGenesis}; use rooch_types::framework::auth_validator::TxValidateResult; use rooch_types::function_arg::FunctionArg; use std::path::PathBuf; +use std::sync::Arc; use std::{collections::BTreeMap, path::Path}; use tracing::debug; @@ -111,7 +113,10 @@ impl<'a> MoveOSTestAdapter<'a> for MoveOSTestRunner<'a> { None => BTreeMap::new(), }; let temp_dir = moveos_config::temp_dir(); - let moveos_store = MoveOSStore::new(temp_dir.path()).unwrap(); + let db_registry = prometheus::Registry::new(); + let db_metrics = DBMetrics::new(&db_registry); + let moveos_store = + MoveOSStore::new_with_metrics(temp_dir.path(), Arc::new(db_metrics)).unwrap(); let genesis_gas_parameter = FrameworksGasParameters::initial(); let genesis: &RoochGenesis = &rooch_genesis::ROOCH_LOCAL_GENESIS; let moveos = MoveOS::new( diff --git a/crates/rooch-sequencer/tests/test_sequencer.rs b/crates/rooch-sequencer/tests/test_sequencer.rs index 93ee5ce975..ffb7e24ec1 100644 --- a/crates/rooch-sequencer/tests/test_sequencer.rs +++ b/crates/rooch-sequencer/tests/test_sequencer.rs @@ -36,16 +36,16 @@ async fn test_sequencer() -> Result<()> { } assert_eq!(sequencer.last_order(), last_tx_order); } - // // load from db again - // { - // let rooch_db = RoochDB::init(opt.store_config())?; - // let sequencer_key = RoochKeyPair::generate_secp256k1(); - // let mut sequencer = SequencerActor::new(sequencer_key, rooch_db.rooch_store)?; - // assert_eq!(sequencer.last_order(), last_tx_order); - // let tx_data = LedgerTxData::L2Tx(RoochTransaction::mock()); - // let ledger_tx = sequencer.sequence(tx_data)?; - // assert_eq!(ledger_tx.sequence_info.tx_order, last_tx_order + 1); - // } + // load from db again + { + let rooch_db = RoochDB::init(opt.store_config())?; + let sequencer_key = RoochKeyPair::generate_secp256k1(); + let mut sequencer = SequencerActor::new(sequencer_key, rooch_db.rooch_store)?; + assert_eq!(sequencer.last_order(), last_tx_order); + let tx_data = LedgerTxData::L2Tx(RoochTransaction::mock()); + let ledger_tx = sequencer.sequence(tx_data)?; + assert_eq!(ledger_tx.sequence_info.tx_order, last_tx_order + 1); + } Ok(()) } diff --git a/moveos/moveos-store/src/tests/test_state_store.rs b/moveos/moveos-store/src/tests/test_state_store.rs index 3ed00069c8..b2a3cd3d88 100644 --- a/moveos/moveos-store/src/tests/test_state_store.rs +++ b/moveos/moveos-store/src/tests/test_state_store.rs @@ -3,29 +3,31 @@ use crate::MoveOSStore; use anyhow::Result; +use moveos_types::h256::H256; use moveos_types::test_utils::random_state_change_set; +use smt::NodeReader; -// #[tokio::test] -// async fn test_reopen() { -// let temp_dir = moveos_config::temp_dir(); -// -// let key = H256::random(); -// let node = b"testnode".to_vec(); -// { -// let moveos_store = MoveOSStore::new(temp_dir.path()).unwrap(); -// let node_store = moveos_store.get_state_node_store(); -// node_store -// .put(key, node.clone()) -// .map_err(|e| anyhow::anyhow!("test_state_store test_reopen error: {:?}", e)) -// .ok(); -// assert_eq!(node_store.get(&key).unwrap(), Some(node.clone())); -// } -// { -// let moveos_store = MoveOSStore::new(temp_dir.path()).unwrap(); -// let node_store = moveos_store.get_state_node_store(); -// assert_eq!(node_store.get(&key).unwrap(), Some(node)); -// } -// } +#[tokio::test] +async fn test_reopen() { + let temp_dir = moveos_config::temp_dir(); + + let key = H256::random(); + let node = b"testnode".to_vec(); + { + let moveos_store = MoveOSStore::new(temp_dir.path()).unwrap(); + let node_store = moveos_store.get_state_node_store(); + node_store + .put(key, node.clone()) + .map_err(|e| anyhow::anyhow!("test_state_store test_reopen error: {:?}", e)) + .ok(); + assert_eq!(node_store.get(&key).unwrap(), Some(node.clone())); + } + { + let moveos_store = MoveOSStore::new(temp_dir.path()).unwrap(); + let node_store = moveos_store.get_state_node_store(); + assert_eq!(node_store.get(&key).unwrap(), Some(node)); + } +} #[tokio::test] async fn test_statedb_state_root() -> Result<()> { diff --git a/moveos/raw-store/src/lib.rs b/moveos/raw-store/src/lib.rs index 803cfd2883..47431bb9aa 100644 --- a/moveos/raw-store/src/lib.rs +++ b/moveos/raw-store/src/lib.rs @@ -16,7 +16,7 @@ use crate::rocks::{RocksDB, SchemaIterator}; use crate::traits::{DBStore, KVStore}; use anyhow::{bail, format_err, Result}; use moveos_common::utils::{from_bytes, to_bytes}; -use rocksdb::{properties, AsColumnFamilyRef}; +use rust_rocksdb::{properties, AsColumnFamilyRef}; use serde::de::DeserializeOwned; use serde::Serialize; use std::convert::TryInto; @@ -24,9 +24,6 @@ use std::ffi::CStr; use std::fmt::Debug; use std::marker::PhantomData; use std::sync::Arc; -use std::time::Duration; -use tokio::sync::oneshot; -use tracing::{debug, error}; /// Type alias to improve readability. pub type ColumnFamilyName = &'static str; @@ -46,7 +43,7 @@ pub enum StoreInstance { DB { db: Arc, db_metrics: Arc, - metrics_task_cancel_handle: Arc>, + // metrics_task_cancel_handle: Arc>, }, } @@ -60,38 +57,42 @@ impl StoreInstance { pub fn new_db_instance_with_metrics(db: RocksDB, db_metrics: Arc) -> Self { let db_arc = Arc::new(db); - let db_clone = db_arc.clone(); - let db_metrics_clone = db_metrics.clone(); - let (sender, mut recv) = tokio::sync::oneshot::channel(); - - tokio::spawn(async move { - let mut interval = - tokio::time::interval(Duration::from_millis(CF_METRICS_REPORT_PERIOD_MILLIS)); - loop { - tokio::select! { - _ = interval.tick() => { - let cfs = db_clone.cfs.clone(); - for cf_name in cfs { - let db_clone_clone = db_clone.clone(); - let db_metrics_clone_clone = db_metrics_clone.clone(); - if let Err(e) = tokio::task::spawn_blocking(move || { - Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone_clone); - }).await { - error!("Failed to report cf metrics with error: {}", e); - } - // Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone); - } - } - _ = &mut recv => break, - } - } - debug!("Returning to report cf metrics task for StoreInstance"); - }); + // let db_clone = db_arc.clone(); + // let db_metrics_clone = db_metrics.clone(); + // let (sender, mut recv) = tokio::sync::oneshot::channel(); + + // TODO We need to find a more elegant implementation to avoid + // introducing tokio 1.x runtime dependency in the raw store layer, + // which would cause upper-level unit test cases and framework tests to depend on tokio. + + // tokio::spawn(async move { + // let mut interval = + // tokio::time::interval(Duration::from_millis(CF_METRICS_REPORT_PERIOD_MILLIS)); + // loop { + // tokio::select! { + // _ = interval.tick() => { + // let cfs = db_clone.cfs.clone(); + // for cf_name in cfs { + // let db_clone_clone = db_clone.clone(); + // let db_metrics_clone_clone = db_metrics_clone.clone(); + // if let Err(e) = tokio::task::spawn_blocking(move || { + // Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone_clone); + // }).await { + // error!("Failed to report cf metrics with error: {}", e); + // } + // // Self::report_cf_metrics(&db_clone_clone, cf_name, &db_metrics_clone); + // } + // } + // _ = &mut recv => break, + // } + // } + // debug!("Returning to report cf metrics task for StoreInstance"); + // }); Self::DB { db: db_arc, db_metrics, - metrics_task_cancel_handle: Arc::new(sender), + // metrics_task_cancel_handle: Arc::new(sender), } } @@ -117,7 +118,7 @@ impl StoreInstance { StoreInstance::DB { db, db_metrics: _, - metrics_task_cancel_handle: _, + // metrics_task_cancel_handle: _, } => Some(db.as_ref()), } } @@ -127,7 +128,7 @@ impl StoreInstance { StoreInstance::DB { db: _, db_metrics, - metrics_task_cancel_handle: _, + // metrics_task_cancel_handle: _, } => Some(db_metrics.as_ref()), } } @@ -137,7 +138,7 @@ impl StoreInstance { StoreInstance::DB { db, db_metrics: _, - metrics_task_cancel_handle: _, + // metrics_task_cancel_handle: _, } => Arc::get_mut(db), } } @@ -147,11 +148,12 @@ impl StoreInstance { StoreInstance::DB { db: _, db_metrics, - metrics_task_cancel_handle: _, + // metrics_task_cancel_handle: _, } => Arc::get_mut(db_metrics), } } + #[allow(dead_code)] fn report_cf_metrics(rocksdb: &Arc, cf_name: &str, db_metrics: &Arc) { let cf = rocksdb.get_cf_handle(cf_name); db_metrics @@ -300,6 +302,7 @@ impl StoreInstance { ); } + #[allow(dead_code)] fn get_int_property( rocksdb: &RocksDB, cf: &impl AsColumnFamilyRef, @@ -320,7 +323,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - metrics_task_cancel_handle: _, + // metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -343,7 +346,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - metrics_task_cancel_handle: _, + // metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -367,7 +370,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - metrics_task_cancel_handle: _, + // metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -385,7 +388,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - metrics_task_cancel_handle: _, + // metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -408,7 +411,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - metrics_task_cancel_handle: _, + // metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -440,7 +443,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - metrics_task_cancel_handle: _, + // metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -464,7 +467,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - metrics_task_cancel_handle: _, + // metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics @@ -488,7 +491,7 @@ impl DBStore for StoreInstance { StoreInstance::DB { db, db_metrics, - metrics_task_cancel_handle: _, + // metrics_task_cancel_handle: _, } => { let _timer = db_metrics .op_metrics diff --git a/moveos/raw-store/src/metrics.rs b/moveos/raw-store/src/metrics.rs index b700af5b31..9f933b2c4b 100644 --- a/moveos/raw-store/src/metrics.rs +++ b/moveos/raw-store/src/metrics.rs @@ -9,8 +9,8 @@ use prometheus::{ register_histogram_vec_with_registry, register_int_counter_vec_with_registry, register_int_gauge_vec_with_registry, HistogramVec, IntCounterVec, IntGaugeVec, Registry, }; -use rocksdb::perf::set_perf_stats; -use rocksdb::{PerfContext, PerfMetric, PerfStatsLevel}; +use rust_rocksdb::perf::set_perf_stats; +use rust_rocksdb::{PerfContext, PerfMetric, PerfStatsLevel}; use std::cell::RefCell; use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::Arc; @@ -19,7 +19,7 @@ use tap::TapFallible; use tracing::warn; thread_local! { - static PER_THREAD_ROCKS_PERF_CONTEXT: std::cell::RefCell = RefCell::new(PerfContext::default()); + static PER_THREAD_ROCKS_PERF_CONTEXT: std::cell::RefCell = RefCell::new(PerfContext::default()); } const LATENCY_SEC_BUCKETS: &[f64] = &[