From 87645bfad3943e1110e4cb2e038124083e8ae793 Mon Sep 17 00:00:00 2001 From: vnugent Date: Sun, 28 Jan 2024 19:56:02 -0500 Subject: progress update --- .../src/ContextExtensions.cs | 274 ------ .../NVault.Crypto.Secp256k1/src/IRandomSource.cs | 32 - .../NVault.Crypto.Secp256k1/src/LibSecp256k1.cs | 284 ------- .../src/NVault.Crypto.Secp256k1.csproj | 27 - .../src/Secp256HashFuncState.cs | 56 -- .../src/Secp256k1Context.cs | 76 -- .../src/Secp256k1SecretKey.cs | 58 -- .../src/UnmanagedRandomSource.cs | 101 --- .../src/IClientAccessScope.cs | 48 -- .../NVault.VaultExtensions/src/IKvVaultStore.cs | 52 -- .../src/IVaultClientScope.cs | 33 - .../src/IVaultKvClientScope.cs | 29 - .../NVault.VaultExtensions/src/KvVaultStorage.cs | 66 -- .../src/NVault.VaultExtensions.csproj | 27 - .../src/VaultClientExtensions.cs | 156 ---- .../NVault.VaultExtensions/src/VaultUserScope.cs | 25 - back-end/plugins/nvault/src/Endpoints/Endpoint.cs | 88 +- back-end/plugins/nvault/src/Model/NostrContext.cs | 29 +- back-end/plugins/nvault/src/Model/NostrEvent.cs | 2 + .../plugins/nvault/src/Model/NostrEventEntry.cs | 47 ++ .../nvault/src/Model/NostrEventHistoryStore.cs | 69 ++ .../plugins/nvault/src/Model/NostrKeyMetaStore.cs | 9 +- .../plugins/nvault/src/Model/NostrRelayStore.cs | 11 +- back-end/plugins/nvault/src/NVault.csproj | 6 +- extension/package-lock.json | 933 ++++++++++----------- extension/package.json | 2 +- extension/src/components/ListBox.vue | 86 ++ extension/src/components/Pagination.vue | 36 + .../primary/components/PromptPopup.vue | 88 +- .../src/entries/contentScript/primary/main.js | 2 + extension/src/entries/contentScript/util.ts | 4 +- extension/src/entries/options/App.vue | 32 +- .../src/entries/options/components/Activity.vue | 121 +++ .../src/entries/options/components/AutoRules.vue | 54 +- .../entries/options/components/EvHistoryTable.vue | 6 +- .../entries/options/components/EventHistory.vue | 222 ++--- .../src/entries/options/components/Identities.vue | 27 +- .../entries/options/components/SiteSettings.vue | 21 + extension/src/entries/options/main.js | 2 + .../entries/popup/Components/IdentitySelection.vue | 4 +- extension/src/entries/store/features.ts | 13 +- extension/src/entries/store/identity.ts | 7 +- extension/src/entries/store/index.ts | 5 +- extension/src/entries/store/types.ts | 3 +- extension/src/features/auth-api.ts | 5 +- extension/src/features/framework/index.ts | 26 + extension/src/features/history.ts | 64 +- extension/src/features/identity-api.ts | 8 +- extension/src/features/index.ts | 6 +- extension/src/features/nip07allow-api.ts | 7 +- extension/src/features/nostr-api.ts | 28 +- extension/src/features/permissions.ts | 158 ++-- extension/src/features/server-api/index.ts | 25 +- extension/src/features/settings.ts | 13 +- extension/src/features/tagfilter-api.ts | 138 ++- extension/src/features/types.ts | 25 +- extension/src/features/util.ts | 85 +- lib/NVault.Crypto.Noscrypt/src/LibNoscrypt.cs | 107 +++ .../src/NVault.Crypto.Noscrypt.csproj | 27 + .../src/ContextExtensions.cs | 274 ++++++ lib/NVault.Crypto.Secp256k1/src/IRandomSource.cs | 32 + lib/NVault.Crypto.Secp256k1/src/LibSecp256k1.cs | 284 +++++++ .../src/NVault.Crypto.Secp256k1.csproj | 27 + .../src/Secp256HashFuncState.cs | 56 ++ .../src/Secp256k1Context.cs | 76 ++ .../src/Secp256k1SecretKey.cs | 58 ++ .../src/UnmanagedRandomSource.cs | 101 +++ .../src/IClientAccessScope.cs | 48 ++ lib/NVault.VaultExtensions/src/IKvVaultStore.cs | 52 ++ .../src/IVaultClientScope.cs | 33 + .../src/IVaultKvClientScope.cs | 29 + lib/NVault.VaultExtensions/src/KvVaultStorage.cs | 66 ++ .../src/NVault.VaultExtensions.csproj | 27 + .../src/VaultClientExtensions.cs | 156 ++++ lib/NVault.VaultExtensions/src/VaultUserScope.cs | 25 + nvault.build.sln | 33 +- 76 files changed, 3109 insertions(+), 2263 deletions(-) delete mode 100644 back-end/libs/NVault.Crypto.Secp256k1/src/ContextExtensions.cs delete mode 100644 back-end/libs/NVault.Crypto.Secp256k1/src/IRandomSource.cs delete mode 100644 back-end/libs/NVault.Crypto.Secp256k1/src/LibSecp256k1.cs delete mode 100644 back-end/libs/NVault.Crypto.Secp256k1/src/NVault.Crypto.Secp256k1.csproj delete mode 100644 back-end/libs/NVault.Crypto.Secp256k1/src/Secp256HashFuncState.cs delete mode 100644 back-end/libs/NVault.Crypto.Secp256k1/src/Secp256k1Context.cs delete mode 100644 back-end/libs/NVault.Crypto.Secp256k1/src/Secp256k1SecretKey.cs delete mode 100644 back-end/libs/NVault.Crypto.Secp256k1/src/UnmanagedRandomSource.cs delete mode 100644 back-end/libs/NVault.VaultExtensions/src/IClientAccessScope.cs delete mode 100644 back-end/libs/NVault.VaultExtensions/src/IKvVaultStore.cs delete mode 100644 back-end/libs/NVault.VaultExtensions/src/IVaultClientScope.cs delete mode 100644 back-end/libs/NVault.VaultExtensions/src/IVaultKvClientScope.cs delete mode 100644 back-end/libs/NVault.VaultExtensions/src/KvVaultStorage.cs delete mode 100644 back-end/libs/NVault.VaultExtensions/src/NVault.VaultExtensions.csproj delete mode 100644 back-end/libs/NVault.VaultExtensions/src/VaultClientExtensions.cs delete mode 100644 back-end/libs/NVault.VaultExtensions/src/VaultUserScope.cs create mode 100644 back-end/plugins/nvault/src/Model/NostrEventEntry.cs create mode 100644 back-end/plugins/nvault/src/Model/NostrEventHistoryStore.cs create mode 100644 extension/src/components/ListBox.vue create mode 100644 extension/src/components/Pagination.vue create mode 100644 extension/src/entries/options/components/Activity.vue create mode 100644 lib/NVault.Crypto.Noscrypt/src/LibNoscrypt.cs create mode 100644 lib/NVault.Crypto.Noscrypt/src/NVault.Crypto.Noscrypt.csproj create mode 100644 lib/NVault.Crypto.Secp256k1/src/ContextExtensions.cs create mode 100644 lib/NVault.Crypto.Secp256k1/src/IRandomSource.cs create mode 100644 lib/NVault.Crypto.Secp256k1/src/LibSecp256k1.cs create mode 100644 lib/NVault.Crypto.Secp256k1/src/NVault.Crypto.Secp256k1.csproj create mode 100644 lib/NVault.Crypto.Secp256k1/src/Secp256HashFuncState.cs create mode 100644 lib/NVault.Crypto.Secp256k1/src/Secp256k1Context.cs create mode 100644 lib/NVault.Crypto.Secp256k1/src/Secp256k1SecretKey.cs create mode 100644 lib/NVault.Crypto.Secp256k1/src/UnmanagedRandomSource.cs create mode 100644 lib/NVault.VaultExtensions/src/IClientAccessScope.cs create mode 100644 lib/NVault.VaultExtensions/src/IKvVaultStore.cs create mode 100644 lib/NVault.VaultExtensions/src/IVaultClientScope.cs create mode 100644 lib/NVault.VaultExtensions/src/IVaultKvClientScope.cs create mode 100644 lib/NVault.VaultExtensions/src/KvVaultStorage.cs create mode 100644 lib/NVault.VaultExtensions/src/NVault.VaultExtensions.csproj create mode 100644 lib/NVault.VaultExtensions/src/VaultClientExtensions.cs create mode 100644 lib/NVault.VaultExtensions/src/VaultUserScope.cs diff --git a/back-end/libs/NVault.Crypto.Secp256k1/src/ContextExtensions.cs b/back-end/libs/NVault.Crypto.Secp256k1/src/ContextExtensions.cs deleted file mode 100644 index bb014df..0000000 --- a/back-end/libs/NVault.Crypto.Secp256k1/src/ContextExtensions.cs +++ /dev/null @@ -1,274 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System; -using System.Security.Cryptography; -using System.Runtime.InteropServices; - -using VNLib.Hashing; -using VNLib.Utils; -using VNLib.Utils.Memory; -using VNLib.Utils.Extensions; - -using static NVault.Crypto.Secp256k1.LibSecp256k1; - -namespace NVault.Crypto.Secp256k1 -{ - /// - /// The callback function signature required for ECDH hash functions - /// - /// The callback state - /// The return value to be passed as a result of the operation - public delegate int Secp256k1EcdhHashFunc(in Secp256HashFuncState state); - - public static unsafe class ContextExtensions - { - /// - /// Signs a 32byte message digest with the specified secret key on the current context and writes the signature to the specified buffer - /// - /// - /// The 32byte secret key used to sign messages from the user - /// The 32byte message digest to compute the signature of - /// The buffer to write the signature output to, must be at-least 64 bytes - /// The number of bytes written to the signature buffer, or less than 1 if the operation failed - public static ERRNO SchnorSignDigest(this in Secp256k1Context context, ReadOnlySpan secretKey, ReadOnlySpan digest, Span signature) - { - //Check the signature buffer size - if (signature.Length < SignatureSize) - { - return ERRNO.E_FAIL; - } - - //Message digest must be exactly 32 bytes long - if (digest.Length != (int)HashAlg.SHA256) - { - return ERRNO.E_FAIL; - } - - //Secret key size must be exactly the size of the secret key struct - if(secretKey.Length != sizeof(Secp256k1SecretKey)) - { - return ERRNO.E_FAIL; - } - - //Stack allocated keypair - KeyPair keyPair = new(); - - //Init the secret key struct from key data - Secp256k1SecretKey secKeyStruct = MemoryMarshal.Read(secretKey); - - //Randomize the context and create the keypair - if (!context.CreateKeyPair(&keyPair, &secKeyStruct)) - { - return ERRNO.E_FAIL; - } - - //Create the random nonce - byte* random = stackalloc byte[RandomBufferSize]; - - //Fill the buffer with random bytes - context.Lib.GetRandomBytes(new Span(random, RandomBufferSize)); - - try - { - fixed (byte* sigPtr = &MemoryMarshal.GetReference(signature), - digestPtr = &MemoryMarshal.GetReference(digest)) - { - //Sign the message hash and write the output to the signature buffer - if (context.Lib._signHash(context.Context, sigPtr, digestPtr, &keyPair, random) != 1) - { - return ERRNO.E_FAIL; - } - } - } - finally - { - //Erase entropy - MemoryUtil.InitializeBlock(random, RandomBufferSize); - - //Clear the keypair, contains the secret key, even if its stack allocated - MemoryUtil.ZeroStruct(&keyPair); - } - - //Signature size is always 64 bytes - return SignatureSize; - } - - /// - /// Generates an x-only Schnor encoded public key from the specified secret key on the - /// current context and writes it to the specified buffer. - /// - /// - /// The 32byte secret key used to derrive the public key from - /// The buffer to write the x-only Schnor encoded public key - /// The number of bytes written to the output buffer, or 0 if the operation failed - /// - public static ERRNO GeneratePubKeyFromSecret(this in Secp256k1Context context, ReadOnlySpan secretKey, Span pubKeyBuffer) - { - if (secretKey.Length != sizeof(Secp256k1SecretKey)) - { - throw new CryptographicException($"Your secret key must be exactly {sizeof(Secp256k1SecretKey)} bytes long"); - } - - if (pubKeyBuffer.Length < XOnlyPublicKeySize) - { - throw new CryptographicException($"Your public key buffer must be at least {XOnlyPublicKeySize} bytes long"); - } - - //Protect for released lib - context.Lib.SafeLibHandle.ThrowIfClosed(); - - //Stack allocated keypair and x-only public key - Secp256k1PublicKey xOnlyPubKey = new(); - Secp256k1SecretKey secKeyStruct = MemoryMarshal.Read(secretKey); - KeyPair keyPair = new(); - - try - { - //Init context and keypair - if (!context.CreateKeyPair(&keyPair, &secKeyStruct)) - { - return ERRNO.E_FAIL; - } - - //X-only public key from the keypair - if (context.Lib._createXonly(context.Context, &xOnlyPubKey, 0, &keyPair) != 1) - { - return ERRNO.E_FAIL; - } - - fixed (byte* pubBuffer = &MemoryMarshal.GetReference(pubKeyBuffer)) - { - //Serialize the public key to the buffer as an X-only public key without leading status byte - if (context.Lib._serializeXonly(context.Context, pubBuffer, &xOnlyPubKey) != 1) - { - return ERRNO.E_FAIL; - } - } - } - finally - { - //Clear the keypair, contains the secret key, even if its stack allocated - MemoryUtil.ZeroStruct(&keyPair); - } - - //PubKey length is constant - return XOnlyPublicKeySize; - } - - /// - /// Verifies that a given secret key is valid using the current context - /// - /// - /// The secret key to verify - /// A boolean value that indicates if the secret key is valid or not - /// - public static bool VerifySecretKey(this in Secp256k1Context context, ReadOnlySpan secretKey) - { - if (secretKey.Length != sizeof(Secp256k1SecretKey)) - { - throw new CryptographicException($"Your secret key must be exactly {sizeof(Secp256k1SecretKey)} bytes long"); - } - - context.Lib.SafeLibHandle.ThrowIfClosed(); - - //Get sec key ref and verify - fixed(byte* ptr = &MemoryMarshal.GetReference(secretKey)) - { - return context.Lib._secKeyVerify.Invoke(context.Context, ptr) == 1; - } - } - - - [StructLayout(LayoutKind.Sequential)] - private readonly ref struct EcdhHashFuncState - { - public readonly IntPtr HashFunc { get; init; } - public readonly IntPtr Opaque { get; init; } - public readonly int OutLen { get; init; } - } - - /// - /// Verifies that a given secret key is valid using the current context - /// - /// - /// The secret key to verify - /// A boolean value that indicates if the secret key is valid or not - /// - public static bool ComputeSharedKey(this in Secp256k1Context context, Span data, ReadOnlySpan xOnlyPubKey, ReadOnlySpan secretKey, Secp256k1EcdhHashFunc callback, IntPtr opaque) - { - if (secretKey.Length != sizeof(Secp256k1SecretKey)) - { - throw new ArgumentException($"Your secret key buffer must be exactly {sizeof(Secp256k1SecretKey)} bytes long"); - } - - //Init callback state struct - EcdhHashFuncState state = new() - { - HashFunc = Marshal.GetFunctionPointerForDelegate(callback), - Opaque = opaque, - OutLen = data.Length - }; - - context.Lib.SafeLibHandle.ThrowIfClosed(); - - //Stack allocated keypair and x-only public key - Secp256k1PublicKey peerPubKey = new(); - - //Parse the public key from the buffer - fixed (byte* pubkeyPtr = &MemoryMarshal.GetReference(xOnlyPubKey)) - { - context.Lib._xOnlyPubkeyParse(context.Context, &peerPubKey, pubkeyPtr); - } - - fixed (byte* dataPtr = &MemoryMarshal.GetReference(data), - secKeyPtr = &MemoryMarshal.GetReference(secretKey)) - { - return context.Lib._ecdh.Invoke( - context.Context, - dataPtr, - &peerPubKey, - secKeyPtr, - UmanagedEcdhHashFuncCallback, - &state - ) == 1; - } - - /* - * Umanaged wrapper function for invoking the safe user callback - * from the unmanaged lib - */ - static int UmanagedEcdhHashFuncCallback(byte* output, byte* x32, byte* y32, void* opaque) - { - //Recover the callback - if (opaque == null) - { - return 0; - } - - EcdhHashFuncState* state = (EcdhHashFuncState*)opaque; - - //Init user-state structure - Secp256HashFuncState userState = new(output, state->OutLen, x32, 32, new(opaque)); - - //Recover the function pointer - Secp256k1EcdhHashFunc callback = Marshal.GetDelegateForFunctionPointer(state->HashFunc); - - //Invoke the callback - return callback(in userState); - } - } - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.Crypto.Secp256k1/src/IRandomSource.cs b/back-end/libs/NVault.Crypto.Secp256k1/src/IRandomSource.cs deleted file mode 100644 index 4e1861d..0000000 --- a/back-end/libs/NVault.Crypto.Secp256k1/src/IRandomSource.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System; - -namespace NVault.Crypto.Secp256k1 -{ - /// - /// Represents a generator for random data, that fills abinary buffer with random bytes - /// on demand. - /// - public interface IRandomSource - { - /// - /// Fills the given buffer with random bytes - /// - /// Binary buffer to fill with random data - void GetRandomBytes(Span buffer); - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.Crypto.Secp256k1/src/LibSecp256k1.cs b/back-end/libs/NVault.Crypto.Secp256k1/src/LibSecp256k1.cs deleted file mode 100644 index 8dda269..0000000 --- a/back-end/libs/NVault.Crypto.Secp256k1/src/LibSecp256k1.cs +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System; -using System.Runtime.InteropServices; - -using VNLib.Hashing; -using VNLib.Utils; -using VNLib.Utils.Native; -using VNLib.Utils.Extensions; - -namespace NVault.Crypto.Secp256k1 -{ - - internal unsafe delegate int EcdhHasFunc(byte* output, byte* x32, byte* y32, void* data); - - public unsafe class LibSecp256k1 : VnDisposeable - { - public const int SignatureSize = 64; - public const int RandomBufferSize = 32; - public const int XOnlyPublicKeySize = 32; - - public static readonly int SecretKeySize = sizeof(Secp256k1SecretKey); - - /* - * Unsafe structures that represent the native keypair and x-only public key - * structures. They hold character arrays - */ - [StructLayout(LayoutKind.Sequential, Size = 96)] - internal struct KeyPair - { - public fixed byte data[96]; - } - - /// - /// 1:1 with the secp256k1_pubkey structure - /// - [StructLayout(LayoutKind.Sequential, Size = 64)] - internal struct Secp256k1PublicKey - { - public fixed byte data[64]; - } - - - //Native methods - [SafeMethodName("secp256k1_context_create")] - internal delegate IntPtr ContextCreate(int flags); - - [SafeMethodName("secp256k1_context_destroy")] - internal delegate void ContextDestroy(IntPtr context); - - [SafeMethodName("secp256k1_context_randomize")] - internal delegate int RandomizeContext(IntPtr context, byte* seed32); - - [SafeMethodName("secp256k1_keypair_create")] - internal delegate int KeypairCreate(IntPtr context, KeyPair* keyPair, byte* secretKey); - - [SafeMethodName("secp256k1_keypair_xonly_pub")] - internal delegate int KeypairXOnlyPub(IntPtr ctx, Secp256k1PublicKey* pubkey, int pk_parity, KeyPair* keypair); - - [SafeMethodName("secp256k1_xonly_pubkey_serialize")] - internal delegate int XOnlyPubkeySerialize(IntPtr ctx, byte* output32, Secp256k1PublicKey* pubkey); - - [SafeMethodName("secp256k1_schnorrsig_sign32")] - internal delegate int SignHash(IntPtr ctx, byte* sig64, byte* msg32, KeyPair* keypair, byte* aux_rand32); - - [SafeMethodName("secp256k1_ec_seckey_verify")] - internal delegate int SecKeyVerify(IntPtr ctx, in byte* seckey); - - [SafeMethodName("secp256k1_ec_pubkey_serialize")] - internal delegate int PubKeySerialize(IntPtr ctx, byte* outPubKey, ulong* outLen, Secp256k1PublicKey* pubKey, uint flags); - - [SafeMethodName("secp256k1_xonly_pubkey_parse")] - internal delegate int XOnlyPubkeyParse(IntPtr ctx, Secp256k1PublicKey* pubkey, byte* input32); - - [SafeMethodName("secp256k1_ecdh")] - internal delegate int Ecdh( - IntPtr ctx, - byte* output, - Secp256k1PublicKey* pubkey, - byte* scalar, - EcdhHasFunc hashFunc, - void* dataPtr - ); - - - /// - /// Loads the Secp256k1 library from the specified path and creates a wrapper class (loads methods from the library) - /// - /// The realtive or absolute path to the shared library - /// The DLL probing path pattern - /// The library wrapper class - /// - /// - /// - /// - public static LibSecp256k1 LoadLibrary(string dllPath, DllImportSearchPath search, IRandomSource? random) - { - _ = dllPath?? throw new ArgumentNullException(nameof(dllPath)); - - //try to load the library - SafeLibraryHandle lib = SafeLibraryHandle.LoadLibrary(dllPath, search); - - //try to create the wrapper class, if it fails, dispose the library - try - { - //setup fallback random source if null - random ??= new FallbackRandom(); - - //Create the lib - return new LibSecp256k1(lib, random); - } - catch - { - //Dispose the library if the creation failed - lib.Dispose(); - throw; - } - } - - /// - /// Loads the Secp256k1 library from the specified path and creates a wrapper class (loads methods from the library) - /// - /// The handle to the shared library - /// An optional random source to create random entropy and secrets from - /// The library wrapper class - /// - /// - /// - public static LibSecp256k1 FromHandle(SafeLibraryHandle handle, IRandomSource? random) - { - _ = handle ?? throw new ArgumentNullException(nameof(handle)); - //setup fallback random source if null - random ??= new FallbackRandom(); - //Create the lib - return new LibSecp256k1(handle, random); - } - - /// - /// The underlying library handle - /// - public SafeLibraryHandle SafeLibHandle { get; } - - internal readonly KeypairCreate _createKeyPair; - internal readonly ContextCreate _create; - internal readonly RandomizeContext _randomize; - internal readonly ContextDestroy _destroy; - internal readonly KeypairXOnlyPub _createXonly; - internal readonly XOnlyPubkeySerialize _serializeXonly; - internal readonly SignHash _signHash; - internal readonly SecKeyVerify _secKeyVerify; - internal readonly PubKeySerialize _pubKeySerialize; - internal readonly Ecdh _ecdh; - internal readonly XOnlyPubkeyParse _xOnlyPubkeyParse; - private readonly IRandomSource _randomSource; - - /// - /// Creates a new instance of the class from the specified library handle - /// - /// The library handle that referrences the secp256k1 platform specific library - /// - /// This method attempts to capture all the native methods from the library, which may throw if the library is not valid. - /// - /// - /// - /// - public LibSecp256k1(SafeLibraryHandle handle, IRandomSource randomSource) - { - //Store library handle - SafeLibHandle = handle ?? throw new ArgumentNullException(nameof(handle)); - - //Get all method handles and store them - _create = handle.DangerousGetMethod(); - _createKeyPair = handle.DangerousGetMethod(); - _randomize = handle.DangerousGetMethod(); - _destroy = handle.DangerousGetMethod(); - _createXonly = handle.DangerousGetMethod(); - _serializeXonly = handle.DangerousGetMethod(); - _signHash = handle.DangerousGetMethod(); - _secKeyVerify = handle.DangerousGetMethod(); - _pubKeySerialize = handle.DangerousGetMethod(); - _ecdh = handle.DangerousGetMethod(); - _xOnlyPubkeyParse = handle.DangerousGetMethod(); - - //Store random source - _randomSource = randomSource; - } - - /// - /// Creates a new instance of the class from the specified library handle - /// with a fallback random source - /// - /// The library handle - /// - /// - /// - public LibSecp256k1(SafeLibraryHandle handle):this(handle, new FallbackRandom()) - {} - - /// - /// Generates a new secret key and writes it to the specified buffer. The buffer size must be exactly bytes long - /// - /// NOTE: You should verify this validity of the key against the library with a new - /// - /// - /// The secret key buffer - /// - public void CreateSecretKey(Span buffer) - { - //Protect for released lib - SafeLibHandle.ThrowIfClosed(); - - if(buffer.Length != sizeof(Secp256k1SecretKey)) - { - throw new ArgumentException($"Buffer must be exactly {sizeof(Secp256k1SecretKey)} bytes long", nameof(buffer)); - } - - //Fill the buffer with random bytes - _randomSource.GetRandomBytes(buffer); - } - - /// - /// Fills the given buffer with random bytes from - /// the internal random source - /// - /// The buffer to fill with random data - public void GetRandomBytes(Span buffer) - { - //Protect for released lib - SafeLibHandle.ThrowIfClosed(); - - _randomSource.GetRandomBytes(buffer); - } - - /// - /// Creates a new from the current managed library - /// - /// - /// The new object from the library - /// - public Secp256k1Context CreateContext() - { - //Protect for released lib - SafeLibHandle.ThrowIfClosed(); - - //Create new context - IntPtr context = _create(1); - - if (context == IntPtr.Zero) - { - throw new OutOfMemoryException("Failed to create the new Secp256k1 context"); - } - - return new Secp256k1Context(this, context); - } - - protected override void Free() - { - //Free native library - SafeLibHandle.Dispose(); - } - - private record class FallbackRandom : IRandomSource - { - public void GetRandomBytes(Span buffer) - { - //Use the random generator from the crypto lib - RandomHash.GetRandomBytes(buffer); - } - } - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.Crypto.Secp256k1/src/NVault.Crypto.Secp256k1.csproj b/back-end/libs/NVault.Crypto.Secp256k1/src/NVault.Crypto.Secp256k1.csproj deleted file mode 100644 index 5014d89..0000000 --- a/back-end/libs/NVault.Crypto.Secp256k1/src/NVault.Crypto.Secp256k1.csproj +++ /dev/null @@ -1,27 +0,0 @@ - - - - net8.0 - enable - true - README.md - NVault.Crypto.Secp256k1 - NVault.Crypto.Secp256k1 - - - - Vaughn Nugent - Vaughn Nugent - NVault.Crypto.Secp256k1 - Provides a managed library for the Bitcoin Core secp256k1 library, along with other helper types for NVault - Copyright © 2024 Vaughn Nugent - https://www.vaughnnugent.com/resources/software/modules/NVault - https://github.com/VnUgE/NVault/tree/master/ - - - - - - - - diff --git a/back-end/libs/NVault.Crypto.Secp256k1/src/Secp256HashFuncState.cs b/back-end/libs/NVault.Crypto.Secp256k1/src/Secp256HashFuncState.cs deleted file mode 100644 index c82321c..0000000 --- a/back-end/libs/NVault.Crypto.Secp256k1/src/Secp256HashFuncState.cs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System; -using System.Runtime.InteropServices; - -namespace NVault.Crypto.Secp256k1 -{ - [StructLayout(LayoutKind.Sequential)] - public unsafe readonly ref struct Secp256HashFuncState - { - - /// - /// The opaque pointer passed to the hash function - /// - public readonly IntPtr Opaque { get; } - - private readonly byte* _output; - private readonly byte* _xCoord; - private readonly int _outputLength; - private readonly int _xCoordLength; - - internal Secp256HashFuncState(byte* output, int outputLength, byte* xCoord, int xCoordLength, IntPtr opaque) - { - Opaque = opaque; - _output = output; - _outputLength = outputLength; - _xCoord = xCoord; - _xCoordLength = xCoordLength; - } - - /// - /// Gets the output buffer as a span - /// - /// The output buffer span - public readonly Span GetOutput() => new(_output, _outputLength); - - /// - /// Gets the x coordinate argument as a span - /// - /// The xcoordinate buffer span - public readonly ReadOnlySpan GetXCoordArg() => new(_xCoord, _xCoordLength); - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.Crypto.Secp256k1/src/Secp256k1Context.cs b/back-end/libs/NVault.Crypto.Secp256k1/src/Secp256k1Context.cs deleted file mode 100644 index dfb3ff8..0000000 --- a/back-end/libs/NVault.Crypto.Secp256k1/src/Secp256k1Context.cs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System; - -using VNLib.Utils.Extensions; -using VNLib.Utils.Memory; - -using static NVault.Crypto.Secp256k1.LibSecp256k1; - -namespace NVault.Crypto.Secp256k1 -{ - /// - /// Represents a Secp256k1 context, it is used to randomize the instance, create key pairs, - /// and frees the context when disposed - /// - /// The library instance - /// A pointer to the initialized context instance - public readonly record struct Secp256k1Context(LibSecp256k1 Lib, IntPtr Context) : IDisposable - { - /// - /// Randomizes the context with random data using the library's random source - /// - /// True if the context was successfully randomized, false otherwise - public unsafe readonly bool Randomize() - { - Lib.SafeLibHandle.ThrowIfClosed(); - - //Randomze the context - byte* entropy = stackalloc byte[RandomBufferSize]; - - //Get random bytes - Lib.GetRandomBytes(new Span(entropy, RandomBufferSize)); - - //call native randomize method - bool result = Lib._randomize(Context, entropy) == 1; - - //Zero the randomness buffer before returning to avoid leaking random data - MemoryUtil.InitializeBlock(entropy, RandomBufferSize); - - return result; - } - - internal unsafe readonly bool CreateKeyPair(KeyPair* keyPair, Secp256k1SecretKey* secretKey) - { - Lib.SafeLibHandle.ThrowIfClosed(); - - //Create the keypair from the secret key - return Lib._createKeyPair(Context, keyPair, (byte*)secretKey) == 1; - } - - /// - /// Releases the context instance and frees the memory - /// - public readonly void Dispose() - { - if (Context != IntPtr.Zero) - { - //Free the context - Lib._destroy(Context); - } - } - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.Crypto.Secp256k1/src/Secp256k1SecretKey.cs b/back-end/libs/NVault.Crypto.Secp256k1/src/Secp256k1SecretKey.cs deleted file mode 100644 index 35734ae..0000000 --- a/back-end/libs/NVault.Crypto.Secp256k1/src/Secp256k1SecretKey.cs +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System; -using System.Runtime.InteropServices; - -using VNLib.Utils.Memory; - -namespace NVault.Crypto.Secp256k1 -{ - /// - /// Represents a Secp256k1 secret key, the size is fixed, and should use - /// the sizeof() operator to get the size - /// - [StructLayout(LayoutKind.Sequential, Size = 32)] - public unsafe struct Secp256k1SecretKey - { - private fixed byte data[32]; - - /// - /// Implict cast to a span of raw bytes - /// - /// The secret key to cast - public static implicit operator Span(Secp256k1SecretKey key) => new(key.data, 32); - - /// - /// Casts the secret key span to a via a structure copy - /// - /// The key data to copy - /// - public static explicit operator Secp256k1SecretKey(ReadOnlySpan key) => FromSpan(key); - - /// - /// Creates a new from a span of bytes - /// by copying the bytes into the struct - /// - /// The secret key data to copy - /// An initilaized - public static Secp256k1SecretKey FromSpan(ReadOnlySpan span) - { - Secp256k1SecretKey newKey = new(); - MemoryUtil.CopyStruct(span, ref newKey); - return newKey; - } - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.Crypto.Secp256k1/src/UnmanagedRandomSource.cs b/back-end/libs/NVault.Crypto.Secp256k1/src/UnmanagedRandomSource.cs deleted file mode 100644 index 360de21..0000000 --- a/back-end/libs/NVault.Crypto.Secp256k1/src/UnmanagedRandomSource.cs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System; -using System.Runtime.InteropServices; - -using VNLib.Utils; -using VNLib.Utils.Native; -using VNLib.Utils.Extensions; - -namespace NVault.Crypto.Secp256k1 -{ - - /// - /// A wrapper class for an unmanaged random source that conforms to the interface - /// - public class UnmanagedRandomSource : VnDisposeable, IRandomSource - { - public const string METHOD_NAME = "getRandomBytes"; - - unsafe delegate void UnmanagedRandomSourceDelegate(byte* buffer, int size); - - - private readonly bool OwnsHandle; - private readonly SafeLibraryHandle _library; - private readonly UnmanagedRandomSourceDelegate _getRandomBytes; - - /// - /// Loads the unmanaged random source from the given library - /// and attempts to get the random bytes method - /// - /// - /// - /// The wrapped library that conforms to the - public static UnmanagedRandomSource LoadLibrary(string path, DllImportSearchPath search) - { - //Try to load the library - SafeLibraryHandle lib = SafeLibraryHandle.LoadLibrary(path, search); - try - { - return new UnmanagedRandomSource(lib, true); - } - catch - { - //release lib - lib.Dispose(); - throw; - } - } - - /// - /// Creates the unmanaged random source from the given library - /// - /// The library handle to wrap - /// - /// - public UnmanagedRandomSource(SafeLibraryHandle lib, bool ownsHandle) - { - lib.ThrowIfClosed(); - - _library = lib; - - //get the method delegate - _getRandomBytes = lib.DangerousGetMethod(METHOD_NAME); - - OwnsHandle = ownsHandle; - } - - public unsafe void GetRandomBytes(Span buffer) - { - _library.ThrowIfClosed(); - - //Fix buffer and call unmanaged method - fixed(byte* ptr = &MemoryMarshal.GetReference(buffer)) - { - _getRandomBytes(ptr, buffer.Length); - } - } - - /// - protected override void Free() - { - if (OwnsHandle) - { - _library.Dispose(); - } - } - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.VaultExtensions/src/IClientAccessScope.cs b/back-end/libs/NVault.VaultExtensions/src/IClientAccessScope.cs deleted file mode 100644 index c79f75e..0000000 --- a/back-end/libs/NVault.VaultExtensions/src/IClientAccessScope.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System; -using System.Collections.Generic; - -namespace NVault.VaultExtensions -{ - /// - /// Represents a user auth token access scope - /// configuration. - /// - public interface IClientAccessScope - { - /// - /// The list of policies for new token generation - /// - IList Policies { get; } - - /// - /// Allows the user to renew the access token - /// - bool Renewable { get; } - - /// - /// The token - /// - string TokenTtl { get; } - - /// - /// The explicit number of token uses allowed by the genreated token, - /// 0 for unlimited uses - /// - int NumberOfUses { get; } - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.VaultExtensions/src/IKvVaultStore.cs b/back-end/libs/NVault.VaultExtensions/src/IKvVaultStore.cs deleted file mode 100644 index 037fe6c..0000000 --- a/back-end/libs/NVault.VaultExtensions/src/IKvVaultStore.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System.Threading.Tasks; - -using VNLib.Utils.Memory; - -namespace NVault.VaultExtensions -{ - /// - /// Represents a vault key-value store that can be used to store secrets - /// - public interface IKvVaultStore - { - /// - /// Deletes a secret from the vault - /// - /// The user scope of the secret - /// The path to the secret - /// A task that returns when the operation has completed - Task DeleteSecretAsync(VaultUserScope user, string path); - - /// - /// Sets a secret in the vault at the specified path and user scope - /// - /// The user scope to store the value at - /// The path to the secret - /// The secret value to set - /// A task that resolves when the secret has been updated - Task SetSecretAsync(VaultUserScope user, string path, PrivateString secret); - - /// - /// Gets a secret from the vault at the specified path and user scope - /// - /// The user scope to get the value from - /// The secret path - /// A task that resolves the secret if found, null otherwise - Task GetSecretAsync(VaultUserScope user, string path); - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.VaultExtensions/src/IVaultClientScope.cs b/back-end/libs/NVault.VaultExtensions/src/IVaultClientScope.cs deleted file mode 100644 index d53bc4a..0000000 --- a/back-end/libs/NVault.VaultExtensions/src/IVaultClientScope.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -namespace NVault.VaultExtensions -{ - /// - /// Represents a vault client scope configuration - /// - public interface IVaultClientScope - { - /// - /// The mount point for the vault - /// - string? MountPoint { get; } - - /// - /// The entry path for the vault - /// - string? EntryPath { get; } - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.VaultExtensions/src/IVaultKvClientScope.cs b/back-end/libs/NVault.VaultExtensions/src/IVaultKvClientScope.cs deleted file mode 100644 index f763473..0000000 --- a/back-end/libs/NVault.VaultExtensions/src/IVaultKvClientScope.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -namespace NVault.VaultExtensions -{ - /// - /// A key-value specific scoped client - /// - public interface IVaultKvClientScope : IVaultClientScope - { - /// - /// The property to store the secret value in the - /// storage dictionary - /// - string StorageProperty { get; } - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.VaultExtensions/src/KvVaultStorage.cs b/back-end/libs/NVault.VaultExtensions/src/KvVaultStorage.cs deleted file mode 100644 index 8a2b9b6..0000000 --- a/back-end/libs/NVault.VaultExtensions/src/KvVaultStorage.cs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System.Threading.Tasks; - -using VaultSharp; - -using VNLib.Utils.Memory; - -namespace NVault.VaultExtensions -{ - /// - /// An abstract kv storage implementation that uses the vault client to store secrets - /// - public abstract class KvVaultStorage : IKvVaultStore - { - /// - /// The vault client - /// - protected abstract IVaultClient Client { get; } - - /// - /// The storage scope - /// - protected abstract IVaultKvClientScope Scope { get; } - - public virtual Task DeleteSecretAsync(VaultUserScope user, string path) - { - string tPath = TranslatePath(path); - return Client.DeleteSecretAsync(Scope, user, tPath); - } - - public virtual Task SetSecretAsync(VaultUserScope user, string path, PrivateString secret) - { - string tPath = TranslatePath(path); - return Client.SetSecretAsync(Scope, user, tPath, secret); - } - - public virtual Task GetSecretAsync(VaultUserScope user, string path) - { - string tPath = TranslatePath(path); - return Client.GetSecretAsync(Scope, user, tPath); - } - - /// - /// Translates a realtive item path to a full path - /// within the scope of the storage. This may be used to - /// extend the scope of the operation - /// - /// The item path to scope - /// The further scoped vault path for the item - public virtual string TranslatePath(string path) => path; - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.VaultExtensions/src/NVault.VaultExtensions.csproj b/back-end/libs/NVault.VaultExtensions/src/NVault.VaultExtensions.csproj deleted file mode 100644 index e5dbe8c..0000000 --- a/back-end/libs/NVault.VaultExtensions/src/NVault.VaultExtensions.csproj +++ /dev/null @@ -1,27 +0,0 @@ - - - - net8.0 - enable - true - README.md - NVault.VaultExtensions - NVault.VaultExtensions - - - - Vaughn Nugent - Vaughn Nugent - NVault.VaultExtensions - A Hashicorp Vault unified extension library for NVault - Copyright © 2024 Vaughn Nugent - https://www.vaughnnugent.com/resources/software/modules/NVault - https://github.com/VnUgE/NVault/tree/master/ - - - - - - - - diff --git a/back-end/libs/NVault.VaultExtensions/src/VaultClientExtensions.cs b/back-end/libs/NVault.VaultExtensions/src/VaultClientExtensions.cs deleted file mode 100644 index d90941a..0000000 --- a/back-end/libs/NVault.VaultExtensions/src/VaultClientExtensions.cs +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System.Threading; -using System.Threading.Tasks; -using System.Collections.Generic; - -using VaultSharp; -using VaultSharp.V1.Commons; - -using VNLib.Utils.Memory; -using VNLib.Plugins.Essentials.Extensions; - - -namespace NVault.VaultExtensions -{ - - public static class VaultClientExtensions - { - - private static string GetKeyPath(IVaultClientScope client, in VaultUserScope scope, string itemPath) - { - //Allow for null entry path - return client.EntryPath == null ? $"{scope.UserId}/{itemPath}" : $"{client.EntryPath}/{scope.UserId}/{itemPath}"; - } - - - public static Task GetSecretAsync(this IVaultClient client, IVaultKvClientScope scope, VaultUserScope user, string path) - { - return GetSecretAsync(client, scope, user, path, scope.StorageProperty); - } - - public static async Task GetSecretAsync(this IVaultClient client, IVaultClientScope scope, VaultUserScope user, string path, string property) - { - //Get the path complete path for the scope - string fullPath = GetKeyPath(scope, user, path); - - //Get the secret from the vault - Secret result = await client.V1.Secrets.KeyValue.V2.ReadSecretAsync(fullPath, mountPoint:scope.MountPoint); - - //Try to get the secret value from the store - string? value = result.Data.Data.GetValueOrDefault(property)?.ToString(); - - //Return the secret value as a private string - return value == null ? null : PrivateString.ToPrivateString(value, true); - } - - /// - /// Writes a secret to the vault that is scoped by the vault scope, and the user scope. - /// - /// - /// The client scope configuration - /// The user scope to isolate the - /// The item path within the current scope - /// The secret value to set at the desired property - /// A task that resolves when the secret has been updated - public static async Task SetSecretAsync(this IVaultClient client, IVaultKvClientScope scope, VaultUserScope user, string path, PrivateString secret) - { - Dictionary secretDict = new() - { - //Dangerous cast, but we know the type - { scope.StorageProperty, (string)secret } - }; - - //Await the result so we be sure the secret is not destroyed - return await SetSecretAsync(client, scope, user, path, secretDict); - } - - /// - /// Writes a secret to the vault that is scoped by the vault scope, and the user scope. - /// - /// - /// The client scope configuration - /// The user scope to isolate the - /// The item path within the current scope - /// The secret value to set at the desired property - /// A task that resolves when the secret has been updated - public static async Task SetSecretAsync(this IVaultClient client, IVaultClientScope scope, VaultUserScope user, string path, IDictionary secret) - { - //Get the path complete path for the scope - string fullPath = GetKeyPath(scope, user, path); - - //Get the secret from the vault - Secret result = await client.V1.Secrets.KeyValue.V2.WriteSecretAsync(fullPath, secret, mountPoint:scope.MountPoint); - - return result.Data; - } - - /// - /// Deletes a secret from the vault that is scoped by the vault scope, and the user scope. - /// - /// - /// The client scope - /// The vault user scope - /// The path to the storage - /// A task that resolves when the delete operation has completed - public static Task DeleteSecretAsync(this IVaultClient client, IVaultClientScope scope, VaultUserScope user, string path) - { - string fullApth = GetKeyPath(scope, user, path); - return client.V1.Secrets.KeyValue.V2.DeleteSecretAsync(fullApth, mountPoint:scope.MountPoint); - } - - /// - /// Deletes a secret from the vault - /// - /// The user scope of the secret - /// The path to the secret - /// A token to cancel the operation - /// A task that returns when the operation has completed - public static Task DeleteSecretAsync(this IKvVaultStore store, VaultUserScope user, string path, CancellationToken cancellation) - { - return store.DeleteSecretAsync(user, path).WaitAsync(cancellation); - } - - - /// - /// Gets a secret from the vault at the specified path and user scope - /// - /// The user scope to get the value from - /// The secret path - /// A token to cancel the operation - /// A task that resolves the secret if found, null otherwise - public static Task GetSecretAsync(this IKvVaultStore store, VaultUserScope user, string path, CancellationToken cancellation) - { - return store.GetSecretAsync(user, path).WaitAsync(cancellation); - } - - - /// - /// Sets a secret in the vault at the specified path and user scope - /// - /// The user scope to store the value at - /// The path to the secret - /// The secret value to set - /// The cancellation token - /// A task that resolves when the secret has been updated - public static Task SetSecretAsync(this IKvVaultStore store, VaultUserScope user, string path, PrivateString secret, CancellationToken cancellation) - { - return store.SetSecretAsync(user, path, secret).WaitAsync(cancellation); - } - - - } -} \ No newline at end of file diff --git a/back-end/libs/NVault.VaultExtensions/src/VaultUserScope.cs b/back-end/libs/NVault.VaultExtensions/src/VaultUserScope.cs deleted file mode 100644 index 0e8796c..0000000 --- a/back-end/libs/NVault.VaultExtensions/src/VaultUserScope.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (C) 2024 Vaughn Nugent -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -namespace NVault.VaultExtensions -{ - /// - /// Represents a user scope for the vault. It isolates the user's - /// secrets from other users. - /// - /// The id of the user to scope the vault to - public readonly record struct VaultUserScope(string UserId) - { } -} \ No newline at end of file diff --git a/back-end/plugins/nvault/src/Endpoints/Endpoint.cs b/back-end/plugins/nvault/src/Endpoints/Endpoint.cs index b8aa0c9..5e8bf09 100644 --- a/back-end/plugins/nvault/src/Endpoints/Endpoint.cs +++ b/back-end/plugins/nvault/src/Endpoints/Endpoint.cs @@ -59,6 +59,7 @@ namespace NVault.Plugins.Vault.Endpoints private readonly INostrOperations _vault; private readonly NostrRelayStore _relays; private readonly NostrKeyMetaStore _publicKeyStore; + private readonly NostrEventHistoryStore _eventHistoryStore; private readonly bool AllowDelete; private readonly ILogProvider? _abnoxiousLog; @@ -69,12 +70,13 @@ namespace NVault.Plugins.Vault.Endpoints AllowDelete = config.TryGetValue("allow_delete", out JsonElement adEl) && adEl.GetBoolean(); - - DbContextOptions options = plugin.GetContextOptions(); + IAsyncLazy options = plugin.GetContextOptionsAsync(); _relays = new NostrRelayStore(options); _publicKeyStore = new NostrKeyMetaStore(options); - _vault = new NostrOpProvider(plugin); + _eventHistoryStore = new NostrEventHistoryStore(options); + + _vault = new NostrOpProvider(plugin); //Check for obnoxious logging if (plugin.HostArgs.HasArgument("--nvault-obnoxious")) @@ -118,6 +120,22 @@ namespace NVault.Plugins.Vault.Endpoints return VfReturnType.VirtualSkip; } + if(entity.QueryArgs.IsArgumentSet("type", "getEvents")) + { + //Get the event history + List events = _eventHistoryStore.ListRental.Rent(); + + //Get the first page of events for the user + await _eventHistoryStore.GetUserPageAsync(events, entity.Session.UserID, 0, 100); + + //Return all events for the user + entity.CloseResponseJson(HttpStatusCode.OK, events); + + _eventHistoryStore.ListRental.Return(events); + + return VfReturnType.VirtualSkip; + } + return VfReturnType.NotFound; } @@ -174,6 +192,15 @@ namespace NVault.Plugins.Vault.Endpoints return VirtualOk(entity, webm); } + //Create new event entry and store it + NostrEventEntry newEvent = NostrEventEntry.FromEvent(entity.Session.UserID, nEvent); + result = await _eventHistoryStore.CreateUserRecordAsync(newEvent, entity.Session.UserID, entity.EventCancellation); + + if (!result) + { + Log.Warn("Failed to store event in history, {evid} for user {userid}", nEvent.Id, entity.Session.UserID[..8]); + } + webm.Result = nEvent; webm.Success = true; @@ -443,21 +470,23 @@ namespace NVault.Plugins.Vault.Endpoints { ValErrWebMessage webMessage = new (); - if(entity.QueryArgs.IsArgumentSet("type", "identity")) + //common id argument + string? id = entity.QueryArgs.GetValueOrDefault("id"); + + if (entity.QueryArgs.IsArgumentSet("type", "identity")) { if (webMessage.Assert(AllowDelete, "Deleting identies are now allowed")) { return VirtualClose(entity, webMessage, HttpStatusCode.Forbidden); } - if (!entity.QueryArgs.TryGetNonEmptyValue("key_id", out string? keyId)) + if (webMessage.Assert(id != null, "No key id specified")) { - webMessage.Result = "No key id specified"; return VirtualClose(entity, webMessage, HttpStatusCode.BadRequest); } //Get the key metadata - NostrKeyMeta? meta = await _publicKeyStore.GetSingleUserRecordAsync(keyId, entity.Session.UserID); + NostrKeyMeta? meta = await _publicKeyStore.GetSingleUserRecordAsync(id, entity.Session.UserID); if (webMessage.Assert(meta != null, "Key metadata not found")) { @@ -471,13 +500,56 @@ namespace NVault.Plugins.Vault.Endpoints await _vault.DeleteCredentialAsync(scope, meta, entity.EventCancellation); //Remove the key metadata - await _publicKeyStore.DeleteUserRecordAsync(keyId, entity.Session.UserID); + await _publicKeyStore.DeleteUserRecordAsync(id, entity.Session.UserID); webMessage.Result = "Successfully deleted identity"; webMessage.Success = true; return VirtualOk(entity, webMessage); } + if(entity.QueryArgs.IsArgumentSet("type", "relay")) + { + if(webMessage.Assert(id != null, "No relay id specified")) + { + return VirtualClose(entity, webMessage, HttpStatusCode.BadRequest); + } + + //Delete the relay + if(await _relays.DeleteUserRecordAsync(id, entity.Session.UserID)) + { + webMessage.Result = "Successfully deleted relay"; + webMessage.Success = true; + } + else + { + webMessage.Result = "Failed to delete relay"; + } + + return VirtualOk(entity, webMessage); + } + + if(entity.QueryArgs.IsArgumentSet("type", "event")) + { + //Internal event id is required + if(webMessage.Assert(id != null, "No event id specified")) + { + return VirtualClose(entity, webMessage, HttpStatusCode.BadRequest); + } + + //Delete the event + if(await _eventHistoryStore.DeleteUserRecordAsync(id, entity.Session.UserID)) + { + webMessage.Result = "Successfully deleted event"; + webMessage.Success = true; + } + else + { + webMessage.Result = "Failed to delete event"; + } + + return VirtualOk(entity, webMessage); + } + return VfReturnType.NotFound; } diff --git a/back-end/plugins/nvault/src/Model/NostrContext.cs b/back-end/plugins/nvault/src/Model/NostrContext.cs index 15900e2..bdd1319 100644 --- a/back-end/plugins/nvault/src/Model/NostrContext.cs +++ b/back-end/plugins/nvault/src/Model/NostrContext.cs @@ -25,7 +25,9 @@ namespace NVault.Plugins.Vault.Model { public DbSet Relays { get; set; } - public DbSet PublicKeys { get; set; } + public DbSet NostrPublicKeys { get; set; } + + public DbSet NostrEvents { get; set; } public NostrContext() { } @@ -68,7 +70,7 @@ namespace NVault.Plugins.Vault.Model .WithColumn(r => r.Version); //Setup public key table - builder.DefineTable(nameof(PublicKeys)) + builder.DefineTable(nameof(NostrPublicKeys)) .WithColumn(r => r.Id) .Next() @@ -95,6 +97,29 @@ namespace NVault.Plugins.Vault.Model //Finally, version, it should be set to the timestamp from annotations .WithColumn(r => r.Version); + + //Setup event table + builder.DefineTable(nameof(NostrEvents)) + .WithColumn(r => r.Id) //PK attribute is set from model base + .Next() + + .WithColumn(r => r.UserId) + .Next() + + .WithColumn(r => r.EventData) + .AllowNull(true) + .Next() + + .WithColumn(r => r.Created) + .AllowNull(false) + .Next() + + .WithColumn(r => r.LastModified) + .AllowNull(false) + .Next() + + //Finally, version, it should be set to the timestamp from annotations + .WithColumn(r => r.Version); } } } diff --git a/back-end/plugins/nvault/src/Model/NostrEvent.cs b/back-end/plugins/nvault/src/Model/NostrEvent.cs index 9bbfd63..ca01e1a 100644 --- a/back-end/plugins/nvault/src/Model/NostrEvent.cs +++ b/back-end/plugins/nvault/src/Model/NostrEvent.cs @@ -22,6 +22,7 @@ using VNLib.Plugins.Extensions.Validation; namespace NVault.Plugins.Vault.Model { + internal sealed class NostrEvent { public const int MAX_CONTENT_LENGTH = 16 * 1024; @@ -86,5 +87,6 @@ namespace NVault.Plugins.Vault.Model return val; } + } } \ No newline at end of file diff --git a/back-end/plugins/nvault/src/Model/NostrEventEntry.cs b/back-end/plugins/nvault/src/Model/NostrEventEntry.cs new file mode 100644 index 0000000..9fa5aa2 --- /dev/null +++ b/back-end/plugins/nvault/src/Model/NostrEventEntry.cs @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Vaughn Nugent +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +using VNLib.Plugins.Extensions.Data; +using VNLib.Plugins.Extensions.Data.Abstractions; + + +namespace NVault.Plugins.Vault.Model +{ + internal sealed class NostrEventEntry : DbModelBase, IUserEntity + { + public override string Id { get; set; } + + public override DateTime Created { get; set; } + + public override DateTime LastModified { get; set; } + + //Never share userids with the client + [JsonIgnore] + public string? UserId { get; set; } + + public string? EventData { get; set; } + + public static NostrEventEntry FromEvent(string userId, NostrEvent @event) => new() + { + EventData= JsonSerializer.Serialize(@event), + UserId = userId, + }; + + } +} \ No newline at end of file diff --git a/back-end/plugins/nvault/src/Model/NostrEventHistoryStore.cs b/back-end/plugins/nvault/src/Model/NostrEventHistoryStore.cs new file mode 100644 index 0000000..68b13f7 --- /dev/null +++ b/back-end/plugins/nvault/src/Model/NostrEventHistoryStore.cs @@ -0,0 +1,69 @@ +// Copyright (C) 2024 Vaughn Nugent +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System; +using System.Linq; + +using Microsoft.EntityFrameworkCore; + +using VNLib.Plugins.Extensions.Data; +using VNLib.Plugins.Extensions.Data.Abstractions; +using VNLib.Plugins.Extensions.Loading; + +namespace NVault.Plugins.Vault.Model +{ + internal class NostrEventHistoryStore(IAsyncLazy Options) : DbStore + { + /// + public override IDbQueryLookup QueryTable { get; } = new DbQueries(); + + /// + public override IDbContextHandle GetNewContext() => new NostrContext(Options.Value); + + /// + public override string GetNewRecordId() => Guid.NewGuid().ToString("N"); + + public override void OnRecordUpdate(NostrEventEntry newRecord, NostrEventEntry existing) + { + existing.EventData = newRecord.EventData; + existing.UserId = newRecord.UserId; + newRecord.LastModified = DateTime.UtcNow; + } + + sealed record class DbQueries() : IDbQueryLookup + { + public IQueryable GetCollectionQueryBuilder(IDbContextHandle context, params string[] constraints) + { + string userId = constraints[0]; + + return from r in context.Set() + where r.UserId == userId + orderby r.LastModified descending + select r; + } + + public IQueryable GetSingleQueryBuilder(IDbContextHandle context, params string[] constraints) + { + string id = constraints[0]; + string userId = constraints[1]; + + //Get entity for the given user by its id + return from r in context.Set() + where r.Id == id && r.UserId == userId + select r; + } + } + } +} diff --git a/back-end/plugins/nvault/src/Model/NostrKeyMetaStore.cs b/back-end/plugins/nvault/src/Model/NostrKeyMetaStore.cs index bfb6a26..b57d021 100644 --- a/back-end/plugins/nvault/src/Model/NostrKeyMetaStore.cs +++ b/back-end/plugins/nvault/src/Model/NostrKeyMetaStore.cs @@ -20,20 +20,17 @@ using Microsoft.EntityFrameworkCore; using VNLib.Plugins.Extensions.Data; using VNLib.Plugins.Extensions.Data.Abstractions; +using VNLib.Plugins.Extensions.Loading; namespace NVault.Plugins.Vault.Model { - internal sealed class NostrKeyMetaStore : DbStore + internal sealed class NostrKeyMetaStore(IAsyncLazy Options) : DbStore { - private readonly DbContextOptions _options; - - public NostrKeyMetaStore(DbContextOptions options) => _options = options; - /// public override IDbQueryLookup QueryTable { get; } = new DbQueries(); /// - public override IDbContextHandle GetNewContext() => new NostrContext(_options); + public override IDbContextHandle GetNewContext() => new NostrContext(Options.Value); /// public override string GetNewRecordId() => Guid.NewGuid().ToString("N"); diff --git a/back-end/plugins/nvault/src/Model/NostrRelayStore.cs b/back-end/plugins/nvault/src/Model/NostrRelayStore.cs index 699124b..799492a 100644 --- a/back-end/plugins/nvault/src/Model/NostrRelayStore.cs +++ b/back-end/plugins/nvault/src/Model/NostrRelayStore.cs @@ -20,23 +20,18 @@ using Microsoft.EntityFrameworkCore; using VNLib.Plugins.Extensions.Data; using VNLib.Plugins.Extensions.Data.Abstractions; +using VNLib.Plugins.Extensions.Loading; namespace NVault.Plugins.Vault.Model { - internal class NostrRelayStore : DbStore + internal class NostrRelayStore(IAsyncLazy Options) : DbStore { - private readonly DbContextOptions _options; - - public NostrRelayStore(DbContextOptions options) - { - _options = options; - } /// public override IDbQueryLookup QueryTable { get; } = new DbQueries(); /// - public override IDbContextHandle GetNewContext() => new NostrContext(_options); + public override IDbContextHandle GetNewContext() => new NostrContext(Options.Value); /// public override string GetNewRecordId() => Guid.NewGuid().ToString("N"); diff --git a/back-end/plugins/nvault/src/NVault.csproj b/back-end/plugins/nvault/src/NVault.csproj index d83dd2f..e876eec 100644 --- a/back-end/plugins/nvault/src/NVault.csproj +++ b/back-end/plugins/nvault/src/NVault.csproj @@ -27,9 +27,11 @@ - - + + + + Always diff --git a/extension/package-lock.json b/extension/package-lock.json index bf558a0..aa48e32 100644 --- a/extension/package-lock.json +++ b/extension/package-lock.json @@ -17,7 +17,7 @@ "@fortawesome/vue-fontawesome": "^3.0.3", "@headlessui/vue": "^1.7.x", "@kyvg/vue3-notification": "^3.0.x", - "@vnuge/vnlib.browser": "https://www.vaughnnugent.com/public/resources/software/builds/Plugins.Essentials/0ca26fc63cc5311298575209b124516139f58206/@vnuge-vnlib.browser/release.tgz", + "@vnuge/vnlib.browser": "https://www.vaughnnugent.com/public/resources/software/builds/Plugins.Essentials/df7dc615532d3441f527374d18664c1a5a336de6/@vnuge-vnlib.browser/release.tgz", "@vuelidate/core": "^2.0.0", "@vuelidate/validators": "^2.0.0", "@vueuse/core": "^10.3.2", @@ -239,9 +239,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -317,9 +317,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", "cpu": [ "ppc64" ], @@ -332,9 +332,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", "cpu": [ "arm" ], @@ -347,9 +347,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", "cpu": [ "arm64" ], @@ -362,9 +362,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", "cpu": [ "x64" ], @@ -377,9 +377,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", "cpu": [ "arm64" ], @@ -392,9 +392,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", "cpu": [ "x64" ], @@ -407,9 +407,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", "cpu": [ "arm64" ], @@ -422,9 +422,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", "cpu": [ "x64" ], @@ -437,9 +437,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", "cpu": [ "arm" ], @@ -452,9 +452,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", "cpu": [ "arm64" ], @@ -467,9 +467,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", "cpu": [ "ia32" ], @@ -482,9 +482,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", "cpu": [ "loong64" ], @@ -497,9 +497,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", "cpu": [ "mips64el" ], @@ -512,9 +512,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", "cpu": [ "ppc64" ], @@ -527,9 +527,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", "cpu": [ "riscv64" ], @@ -542,9 +542,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", "cpu": [ "s390x" ], @@ -557,9 +557,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", "cpu": [ "x64" ], @@ -572,9 +572,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", "cpu": [ "x64" ], @@ -587,9 +587,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", "cpu": [ "x64" ], @@ -602,9 +602,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", "cpu": [ "x64" ], @@ -617,9 +617,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", "cpu": [ "arm64" ], @@ -632,9 +632,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", "cpu": [ "ia32" ], @@ -647,9 +647,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "cpu": [ "x64" ], @@ -783,9 +783,12 @@ } }, "node_modules/@headlessui/vue": { - "version": "1.7.16", - "resolved": "https://registry.npmjs.org/@headlessui/vue/-/vue-1.7.16.tgz", - "integrity": "sha512-nKT+nf/q6x198SsyK54mSszaQl/z+QxtASmgMEJtpxSX2Q0OPJX0upS/9daDyiECpeAsvjkoOrm2O/6PyBQ+Qg==", + "version": "1.7.17", + "resolved": "https://registry.npmjs.org/@headlessui/vue/-/vue-1.7.17.tgz", + "integrity": "sha512-hmJChv8HzKorxd9F70RGnECAwZfkvmmwOqreuKLWY/19d5qbWnSdw+DNbuA/Uo6X5rb4U5B3NrT+qBKPmjhRqw==", + "dependencies": { + "@tanstack/vue-virtual": "^3.0.0-beta.60" + }, "engines": { "node": ">=10" }, @@ -794,12 +797,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -819,9 +822,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -905,9 +908,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -923,9 +926,9 @@ } }, "node_modules/@mdn/browser-compat-data": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.4.3.tgz", - "integrity": "sha512-+VnaO5zYUwFQVuRqp2qLPGR5GwhhJ/lrp0yEmamJ/nI15P2GKwGBEWRDiITZR8i6AYxeiQSu2rOi/gqxehnPuA==", + "version": "5.5.7", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.7.tgz", + "integrity": "sha512-DoHTZ/TjtNfUu9eiqJd+x3IcCQrhS+yOYU436TKUnlE36jZwNbK535D1CmTsSYdi/UcdCWNm5KRQZ9g1tlZCPw==", "dev": true }, "node_modules/@nodelib/fs.scandir": { @@ -1008,9 +1011,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.2.tgz", - "integrity": "sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", + "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", "cpu": [ "arm" ], @@ -1020,9 +1023,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.2.tgz", - "integrity": "sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", + "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", "cpu": [ "arm64" ], @@ -1032,9 +1035,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.2.tgz", - "integrity": "sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", + "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", "cpu": [ "arm64" ], @@ -1044,9 +1047,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.2.tgz", - "integrity": "sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", + "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", "cpu": [ "x64" ], @@ -1056,9 +1059,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.2.tgz", - "integrity": "sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", + "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", "cpu": [ "arm" ], @@ -1068,9 +1071,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.2.tgz", - "integrity": "sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", + "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", "cpu": [ "arm64" ], @@ -1080,9 +1083,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.2.tgz", - "integrity": "sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", + "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", "cpu": [ "arm64" ], @@ -1092,9 +1095,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.2.tgz", - "integrity": "sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", + "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", "cpu": [ "riscv64" ], @@ -1104,9 +1107,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.2.tgz", - "integrity": "sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", + "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", "cpu": [ "x64" ], @@ -1116,9 +1119,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.2.tgz", - "integrity": "sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", + "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", "cpu": [ "x64" ], @@ -1128,9 +1131,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.2.tgz", - "integrity": "sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", + "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", "cpu": [ "arm64" ], @@ -1140,9 +1143,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.2.tgz", - "integrity": "sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", + "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", "cpu": [ "ia32" ], @@ -1152,9 +1155,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.2.tgz", - "integrity": "sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", + "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", "cpu": [ "x64" ], @@ -1216,10 +1219,34 @@ "node": ">=14.16" } }, + "node_modules/@tanstack/virtual-core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.0.0.tgz", + "integrity": "sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/vue-virtual": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.0.2.tgz", + "integrity": "sha512-1iFpX+yZswHuf4wrA6GU9yJ/YzQ/8SacABwqghwCkcwrkZbOPLlRSdOAqZ1WQ50SftmfhZpaiZl2KmpV7cgfMQ==", + "dependencies": { + "@tanstack/virtual-core": "3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.0.0" + } + }, "node_modules/@types/chrome": { - "version": "0.0.254", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.254.tgz", - "integrity": "sha512-svkOGKwA+6ZZuk9xtrYun8MYpNY/9hD17rgZ19v3KunhsK1ZOKaMESw12/1AXLh1u3UPA8jQIRi2370DXv9wgw==", + "version": "0.0.259", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.259.tgz", + "integrity": "sha512-WP1HsLqKgoUwR/4dYiTfmOSUG5B05+xrPLbqboO15nuaUC+aBYxwB9ixVyLPYY9D+vocJK9rzH5g1lpqVrJqhg==", "dev": true, "dependencies": { "@types/filesystem": "*", @@ -1231,6 +1258,11 @@ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, "node_modules/@types/etag": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.3.tgz", @@ -1278,9 +1310,9 @@ "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" }, "node_modules/@types/node": { - "version": "20.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", - "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", + "version": "20.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.10.tgz", + "integrity": "sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==", "dependencies": { "undici-types": "~5.26.4" } @@ -1311,9 +1343,9 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@vitejs/plugin-vue": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.2.tgz", - "integrity": "sha512-kEjJHrLb5ePBvjD0SPZwJlw1QTRcjjCA9sB5VyfonoXVBxTS7TMnqL6EkLt1Eu61RDeiuZ/WN9Hf6PxXhPI2uA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz", + "integrity": "sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA==", "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" @@ -1325,8 +1357,8 @@ }, "node_modules/@vnuge/vnlib.browser": { "version": "0.1.13", - "resolved": "https://www.vaughnnugent.com/public/resources/software/builds/Plugins.Essentials/0ca26fc63cc5311298575209b124516139f58206/@vnuge-vnlib.browser/release.tgz", - "integrity": "sha512-iivHn8FYtHiLnnID/iUwJlDOluuJeno6OUiqS1z1i93gHRFEKvnTiLHKVZAWzu97GQmA96DMtg2Ni26O/jJLFg==", + "resolved": "https://www.vaughnnugent.com/public/resources/software/builds/Plugins.Essentials/df7dc615532d3441f527374d18664c1a5a336de6/@vnuge-vnlib.browser/release.tgz", + "integrity": "sha512-Ddm0cVV4GeNaO5Dd8ycMklswnXBY4L+7gOSu2W1vOOabc8YDaP2XsTaA+xImFVLXj86hQbBTRUUKF9Ebacx+WQ==", "license": "MIT", "peerDependencies": { "@vueuse/core": "^10.x", @@ -1387,55 +1419,55 @@ } }, "node_modules/@vscode/l10n": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.16.tgz", - "integrity": "sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==", + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", "dev": true }, "node_modules/@vue/compiler-core": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.3.tgz", - "integrity": "sha512-u8jzgFg0EDtSrb/hG53Wwh1bAOQFtc1ZCegBpA/glyvTlgHl+tq13o1zvRfLbegYUw/E4mSTGOiCnAJ9SJ+lsg==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.15.tgz", + "integrity": "sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==", "dependencies": { "@babel/parser": "^7.23.6", - "@vue/shared": "3.4.3", + "@vue/shared": "3.4.15", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.3.tgz", - "integrity": "sha512-oGF1E9/htI6JWj/lTJgr6UgxNCtNHbM6xKVreBWeZL9QhRGABRVoWGAzxmtBfSOd+w0Zi5BY0Es/tlJrN6WgEg==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.15.tgz", + "integrity": "sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==", "dependencies": { - "@vue/compiler-core": "3.4.3", - "@vue/shared": "3.4.3" + "@vue/compiler-core": "3.4.15", + "@vue/shared": "3.4.15" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.3.tgz", - "integrity": "sha512-NuJqb5is9I4uzv316VRUDYgIlPZCG8D+ARt5P4t5UDShIHKL25J3TGZAUryY/Aiy0DsY7srJnZL5ryB6DD63Zw==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.15.tgz", + "integrity": "sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==", "dependencies": { "@babel/parser": "^7.23.6", - "@vue/compiler-core": "3.4.3", - "@vue/compiler-dom": "3.4.3", - "@vue/compiler-ssr": "3.4.3", - "@vue/shared": "3.4.3", + "@vue/compiler-core": "3.4.15", + "@vue/compiler-dom": "3.4.15", + "@vue/compiler-ssr": "3.4.15", + "@vue/shared": "3.4.15", "estree-walker": "^2.0.2", "magic-string": "^0.30.5", - "postcss": "^8.4.32", + "postcss": "^8.4.33", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.3.tgz", - "integrity": "sha512-wnYQtMBkeFSxgSSQbYGQeXPhQacQiog2c6AlvMldQH6DB+gSXK/0F6DVXAJfEiuBSgBhUc8dwrrG5JQcqwalsA==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.15.tgz", + "integrity": "sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==", "dependencies": { - "@vue/compiler-dom": "3.4.3", - "@vue/shared": "3.4.3" + "@vue/compiler-dom": "3.4.15", + "@vue/shared": "3.4.15" } }, "node_modules/@vue/devtools-api": { @@ -1493,48 +1525,48 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.3.tgz", - "integrity": "sha512-q5f9HLDU+5aBKizXHAx0w4whkIANs1Muiq9R5YXm0HtorSlflqv9u/ohaMxuuhHWCji4xqpQ1eL04WvmAmGnFg==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.15.tgz", + "integrity": "sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==", "dependencies": { - "@vue/shared": "3.4.3" + "@vue/shared": "3.4.15" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.3.tgz", - "integrity": "sha512-C1r6QhB1qY7D591RCSFhMULyzL9CuyrGc+3PpB0h7dU4Qqw6GNyo4BNFjHZVvsWncrUlKX3DIKg0Y7rNNr06NQ==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.15.tgz", + "integrity": "sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==", "dependencies": { - "@vue/reactivity": "3.4.3", - "@vue/shared": "3.4.3" + "@vue/reactivity": "3.4.15", + "@vue/shared": "3.4.15" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.3.tgz", - "integrity": "sha512-wrsprg7An5Ec+EhPngWdPuzkp0BEUxAKaQtN9dPU/iZctPyD9aaXmVtehPJerdQxQale6gEnhpnfywNw3zOv2A==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.15.tgz", + "integrity": "sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==", "dependencies": { - "@vue/runtime-core": "3.4.3", - "@vue/shared": "3.4.3", + "@vue/runtime-core": "3.4.15", + "@vue/shared": "3.4.15", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.3.tgz", - "integrity": "sha512-BUxt8oVGMKKsqSkM1uU3d3Houyfy4WAc2SpSQRebNd+XJGATVkW/rO129jkyL+kpB/2VRKzE63zwf5RtJ3XuZw==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.15.tgz", + "integrity": "sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==", "dependencies": { - "@vue/compiler-ssr": "3.4.3", - "@vue/shared": "3.4.3" + "@vue/compiler-ssr": "3.4.15", + "@vue/shared": "3.4.15" }, "peerDependencies": { - "vue": "3.4.3" + "vue": "3.4.15" } }, "node_modules/@vue/shared": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.3.tgz", - "integrity": "sha512-rIwlkkP1n4uKrRzivAKPZIEkHiuwY5mmhMJ2nZKCBLz8lTUlE73rQh4n1OnnMurXt1vcUNyH4ZPfdh8QweTjpQ==" + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.15.tgz", + "integrity": "sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==" }, "node_modules/@vuelidate/core": { "version": "2.0.3", @@ -1621,13 +1653,13 @@ } }, "node_modules/@vueuse/core": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.1.tgz", - "integrity": "sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==", + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.2.tgz", + "integrity": "sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==", "dependencies": { "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.7.1", - "@vueuse/shared": "10.7.1", + "@vueuse/metadata": "10.7.2", + "@vueuse/shared": "10.7.2", "vue-demi": ">=0.14.6" }, "funding": { @@ -1660,12 +1692,12 @@ } }, "node_modules/@vueuse/integrations": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.7.1.tgz", - "integrity": "sha512-cKo5LEeKVHdBRBtMTOrDPdR0YNtrmN9IBfdcnY2P3m5LHVrsD0xiHUtAH1WKjHQRIErZG6rJUa6GA4tWZt89Og==", + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.7.2.tgz", + "integrity": "sha512-+u3RLPFedjASs5EKPc69Ge49WNgqeMfSxFn+qrQTzblPXZg6+EFzhjarS5edj2qAf6xQ93f95TUxRwKStXj/sQ==", "dependencies": { - "@vueuse/core": "10.7.1", - "@vueuse/shared": "10.7.1", + "@vueuse/core": "10.7.2", + "@vueuse/shared": "10.7.2", "vue-demi": ">=0.14.6" }, "funding": { @@ -1750,17 +1782,17 @@ } }, "node_modules/@vueuse/metadata": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.1.tgz", - "integrity": "sha512-jX8MbX5UX067DYVsbtrmKn6eG6KMcXxLRLlurGkZku5ZYT3vxgBjui2zajvUZ18QLIjrgBkFRsu7CqTAg18QFw==", + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.2.tgz", + "integrity": "sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==", "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.1.tgz", - "integrity": "sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==", + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.2.tgz", + "integrity": "sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==", "dependencies": { "vue-demi": ">=0.14.6" }, @@ -1825,35 +1857,35 @@ } }, "node_modules/addons-linter": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-6.19.0.tgz", - "integrity": "sha512-Yz5YRfIQ12dIqXKmEoHNwoS/L1xIve2hdm9UEesOEsov5W0zeWMOWCnqdvJNVNy7f1FnPu1lnqzylelkTBS7dA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-6.21.0.tgz", + "integrity": "sha512-4GBn14BR16FZE7dog6uz+1HO6V3B+mAVxmbwxRhed2y5eyrwIW832TmEpku+5A5bbovBZ4gilXEtBsl6A1AMmg==", "dev": true, "dependencies": { "@fluent/syntax": "0.19.0", - "@mdn/browser-compat-data": "5.4.3", + "@mdn/browser-compat-data": "5.5.7", "addons-moz-compare": "1.3.0", - "addons-scanner-utils": "9.8.0", + "addons-scanner-utils": "9.9.0", "ajv": "8.12.0", "chalk": "4.1.2", "cheerio": "1.0.0-rc.12", "columnify": "1.6.0", "common-tags": "1.8.2", "deepmerge": "4.3.1", - "eslint": "8.55.0", + "eslint": "8.56.0", "eslint-plugin-no-unsanitized": "4.0.2", "eslint-visitor-keys": "3.4.3", "espree": "9.6.1", "esprima": "4.0.1", "fast-json-patch": "3.1.1", "glob": "10.3.10", - "image-size": "1.0.2", + "image-size": "1.1.1", "is-mergeable-object": "1.1.1", "jed": "1.1.1", "json-merge-patch": "1.0.2", "os-locale": "5.0.0", - "pino": "8.16.2", - "postcss": "8.4.32", + "pino": "8.17.2", + "postcss": "8.4.33", "relaxed-json": "1.0.3", "semver": "7.5.4", "sha.js": "2.4.11", @@ -1870,19 +1902,10 @@ "node": ">=16.0.0" } }, - "node_modules/addons-linter/node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/addons-linter/node_modules/addons-scanner-utils": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/addons-scanner-utils/-/addons-scanner-utils-9.8.0.tgz", - "integrity": "sha512-nJJ4QazrtMImyb2OK9SGZlNtinNu25dzOR0lhWthhJQN2iDOf3yqHdSiVBEeZvCwuT/sS1cU6me4O4kgEATjFQ==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/addons-scanner-utils/-/addons-scanner-utils-9.9.0.tgz", + "integrity": "sha512-YDP10U3sEZMuIgnjXMiAYgUU64jTbxmhpUXMlhi1nKO4Etz+ctGWoTUst7IQRoLWaY9y2r1KZDG3jALxLA1n7Q==", "dev": true, "dependencies": { "@types/yauzl": "2.10.3", @@ -1958,83 +1981,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/addons-linter/node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", - "@humanwhocodes/config-array": "^0.11.13", - "@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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/addons-linter/node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "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" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/addons-linter/node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/addons-linter/node_modules/glob": { "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", @@ -2057,7 +2003,13 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/addons-linter/node_modules/glob/node_modules/minimatch": { + "node_modules/addons-linter/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/addons-linter/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", @@ -2072,12 +2024,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/addons-linter/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/addons-linter/node_modules/node-fetch": { "version": "2.6.11", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", @@ -2346,9 +2292,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "version": "10.4.17", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", + "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", "dev": true, "funding": [ { @@ -2365,9 +2311,9 @@ } ], "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.22.2", + "caniuse-lite": "^1.0.30001578", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -2398,11 +2344,11 @@ "dev": true }, "node_modules/axios": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", - "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -2536,9 +2482,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "dev": true, "funding": [ { @@ -2555,8 +2501,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -2716,9 +2662,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001572", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz", - "integrity": "sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==", + "version": "1.0.30001581", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz", + "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==", "dev": true, "funding": [ { @@ -3486,9 +3432,9 @@ } }, "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz", + "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==", "dev": true, "engines": { "node": ">=12" @@ -3535,9 +3481,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.616", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz", - "integrity": "sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==", + "version": "1.4.648", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.648.tgz", + "integrity": "sha512-EmFMarXeqJp9cUKu/QEciEApn0S/xRcpZWuAm32U7NgoZCimjsilKXHRO9saeEW55eHZagIDg6XTUOv32w9pjg==", "dev": true }, "node_modules/emoji-regex": { @@ -3594,9 +3540,9 @@ } }, "node_modules/esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -3605,29 +3551,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "node_modules/escalade": { @@ -3725,9 +3671,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.19.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz", - "integrity": "sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==", + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.20.1.tgz", + "integrity": "sha512-GyCs8K3lkEvoyC1VV97GJhP1SvqsKCiWGHnbn0gVUYiUhaH2+nB+Dv1uekv1THFMPbBfYxukrzQdltw950k+LQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -3735,7 +3681,7 @@ "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.13", "semver": "^7.5.4", - "vue-eslint-parser": "^9.3.1", + "vue-eslint-parser": "^9.4.0", "xml-name-validator": "^4.0.0" }, "engines": { @@ -3967,9 +3913,9 @@ } }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", + "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", "dependencies": { "reusify": "^1.0.4" } @@ -4112,9 +4058,9 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -4217,7 +4163,6 @@ "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4255,9 +4200,9 @@ } }, "node_modules/fx-runner": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fx-runner/-/fx-runner-1.3.0.tgz", - "integrity": "sha512-5b37H4GCyhF+Nf8xk9mylXoDq4wb7pbGAXxlCXp/631UTeeZomWSYcEGXumY4wk8g2QAqjPMGdWW+RbNt8PUcA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/fx-runner/-/fx-runner-1.4.0.tgz", + "integrity": "sha512-rci1g6U0rdTg6bAaBboP7XdRu01dzTAaKXxFf+PUqGuCv6Xu7o8NZdY1D5MvKGIjb6EdS1g3VlXOgksir1uGkg==", "dependencies": { "commander": "2.9.0", "shell-quote": "1.7.3", @@ -4682,9 +4627,9 @@ } }, "node_modules/image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", "dev": true, "dependencies": { "queue": "6.0.2" @@ -4693,7 +4638,7 @@ "image-size": "bin/image-size.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.x" } }, "node_modules/immediate": { @@ -4702,9 +4647,9 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", "devOptional": true }, "node_modules/import-fresh": { @@ -5943,9 +5888,9 @@ } }, "node_modules/otpauth": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/otpauth/-/otpauth-9.2.1.tgz", - "integrity": "sha512-/MRvcm63pzK20NCsIOe8Btun42/yWNylPbUo/h5dMpSRJpoAJstWodEUjm4zUDeT1+Vbqif2E8IcP4trl1U4gQ==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/otpauth/-/otpauth-9.2.2.tgz", + "integrity": "sha512-2VcnYRUmq1dNckIfySNYP32ITWp1bvTeAEW0BSCR6G3GBf3a5zb9E+ubY62t3Dma9RjoHlvd7QpmzHfJZRkiNg==", "dependencies": { "jssha": "~3.3.1" }, @@ -6154,9 +6099,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -6251,9 +6196,9 @@ } }, "node_modules/pino": { - "version": "8.16.2", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.16.2.tgz", - "integrity": "sha512-2advCDGVEvkKu9TTVSa/kWW7Z3htI/sBKEZpqiHk6ive0i/7f5b1rsU8jn0aimxqfnSz5bj/nOYkwhBUn5xxvg==", + "version": "8.17.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.2.tgz", + "integrity": "sha512-LA6qKgeDMLr2ux2y/YiUt47EfgQ+S9LznBWOJdN3q1dx2sv0ziDLUBeVpyVv17TEcGCBuWf0zNtg3M5m1NhhWQ==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0", @@ -6261,7 +6206,7 @@ "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "v1.1.0", "pino-std-serializers": "^6.0.0", - "process-warning": "^2.0.0", + "process-warning": "^3.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", @@ -6307,9 +6252,9 @@ } }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", "funding": [ { "type": "opencollective", @@ -6506,9 +6451,9 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/process-warning": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.2.tgz", - "integrity": "sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", "dev": true }, "node_modules/promise-toolbox": { @@ -7002,9 +6947,12 @@ } }, "node_modules/rollup": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.2.tgz", - "integrity": "sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", + "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, @@ -7013,19 +6961,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.2", - "@rollup/rollup-android-arm64": "4.9.2", - "@rollup/rollup-darwin-arm64": "4.9.2", - "@rollup/rollup-darwin-x64": "4.9.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.2", - "@rollup/rollup-linux-arm64-gnu": "4.9.2", - "@rollup/rollup-linux-arm64-musl": "4.9.2", - "@rollup/rollup-linux-riscv64-gnu": "4.9.2", - "@rollup/rollup-linux-x64-gnu": "4.9.2", - "@rollup/rollup-linux-x64-musl": "4.9.2", - "@rollup/rollup-win32-arm64-msvc": "4.9.2", - "@rollup/rollup-win32-ia32-msvc": "4.9.2", - "@rollup/rollup-win32-x64-msvc": "4.9.2", + "@rollup/rollup-android-arm-eabi": "4.9.6", + "@rollup/rollup-android-arm64": "4.9.6", + "@rollup/rollup-darwin-arm64": "4.9.6", + "@rollup/rollup-darwin-x64": "4.9.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", + "@rollup/rollup-linux-arm64-gnu": "4.9.6", + "@rollup/rollup-linux-arm64-musl": "4.9.6", + "@rollup/rollup-linux-riscv64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-musl": "4.9.6", + "@rollup/rollup-win32-arm64-msvc": "4.9.6", + "@rollup/rollup-win32-ia32-msvc": "4.9.6", + "@rollup/rollup-win32-x64-msvc": "4.9.6", "fsevents": "~2.3.2" } }, @@ -7093,9 +7041,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.69.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.6.tgz", - "integrity": "sha512-qbRr3k9JGHWXCvZU77SD2OTwUlC+gNT+61JOLcmLm+XqH4h/5D+p4IIsxvpkB89S9AwJOyb5+rWNpIucaFxSFQ==", + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", + "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", "devOptional": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -7174,15 +7122,16 @@ "peer": true }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", "dev": true, "dependencies": { "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7239,6 +7188,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-5.3.0.tgz", "integrity": "sha512-7nHlCzhQgVMLBNiXVEgbG/raq48awOW0lYMN5uo1BaB3mp0+k8M8pvDwbfTlr3apcxZJsk9HQsAW1POwoJugpQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "dependencies": { "common-tags": "1.8.2", @@ -7259,9 +7209,9 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sonic-boom": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", - "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.0.tgz", + "integrity": "sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0" @@ -7619,9 +7569,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", - "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", + "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -8017,9 +7967,9 @@ } }, "node_modules/universal-cookie": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.0.0.tgz", - "integrity": "sha512-T3XwZ2cUbHRU+UNfPSaPd0zti50tVIvk6onLA90pa+qKwsP8ksn5pwYM7rWMODoX1OCA9qPAN8uK88Avq5YbtQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.0.2.tgz", + "integrity": "sha512-EC9PA+1nojhJtVnKW2Z7WYah01jgYJApqhX+Y8XU97TnFd7KaoxWTHiTZFtfpfV50jEF1L8V5p64ZxIx3Q67dg==", "dependencies": { "@types/cookie": "^0.6.0", "cookie": "^0.6.0" @@ -8147,9 +8097,9 @@ } }, "node_modules/vite": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.10.tgz", - "integrity": "sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", + "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", "dependencies": { "esbuild": "^0.19.3", "postcss": "^8.4.32", @@ -8289,12 +8239,12 @@ } }, "node_modules/vscode-html-languageservice": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.1.1.tgz", - "integrity": "sha512-JenrspIIG/Q+93R6G3L6HdK96itSisMynE0glURqHpQbL3dKAKzdm8L40lAHNkwJeBg+BBPpAshZKv/38onrTQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.1.2.tgz", + "integrity": "sha512-wkWfEx/IIR3s2P5yD4aTGHiOb8IAzFxgkSt1uSC3itJ4oDAm23yG7o0L29JljUdnXDDgLafPAvhv8A2I/8riHw==", "dev": true, "dependencies": { - "@vscode/l10n": "^0.0.16", + "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.11", "vscode-languageserver-types": "^3.17.5", "vscode-uri": "^3.0.8" @@ -8319,15 +8269,15 @@ "dev": true }, "node_modules/vue": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.3.tgz", - "integrity": "sha512-GjN+culMAGv/mUbkIv8zMKItno8npcj5gWlXkSxf1SPTQf8eJ4A+YfHIvQFyL1IfuJcMl3soA7SmN1fRxbf/wA==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.15.tgz", + "integrity": "sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==", "dependencies": { - "@vue/compiler-dom": "3.4.3", - "@vue/compiler-sfc": "3.4.3", - "@vue/runtime-dom": "3.4.3", - "@vue/server-renderer": "3.4.3", - "@vue/shared": "3.4.3" + "@vue/compiler-dom": "3.4.15", + "@vue/compiler-sfc": "3.4.15", + "@vue/runtime-dom": "3.4.15", + "@vue/server-renderer": "3.4.15", + "@vue/shared": "3.4.15" }, "peerDependencies": { "typescript": "*" @@ -8339,9 +8289,9 @@ } }, "node_modules/vue-eslint-parser": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", - "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz", + "integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -8437,14 +8387,14 @@ } }, "node_modules/web-ext": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-7.9.0.tgz", - "integrity": "sha512-oWMiM3e+u5E8X7aUMgQ0BCGjlbZt4XwF6ExAXsXx9Btdz3nLmUY/4eKEZA1J+2T7WhCdRwN7Pdh2VKMej/pthQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-7.11.0.tgz", + "integrity": "sha512-EG6YXHITNDJB/h6Rc5FF08eMoN45sZPBBIIlEraBzxJ0RdJZ8Z3xvUUawbDwt+mowfv9X0XRWlLSwdWbRKgojg==", "dev": true, "dependencies": { "@babel/runtime": "7.21.0", "@devicefarmer/adbkit": "3.2.3", - "addons-linter": "6.19.0", + "addons-linter": "6.21.0", "bunyan": "1.8.15", "camelcase": "7.0.1", "chrome-launcher": "0.15.1", @@ -8453,7 +8403,7 @@ "es6-error": "4.1.1", "firefox-profile": "4.3.2", "fs-extra": "11.1.0", - "fx-runner": "1.3.0", + "fx-runner": "1.4.0", "import-fresh": "3.3.0", "jose": "4.13.1", "mkdirp": "1.0.4", @@ -8484,19 +8434,19 @@ } }, "node_modules/web-ext-run": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/web-ext-run/-/web-ext-run-0.1.1.tgz", - "integrity": "sha512-9QGtlnXExhXYK+pRFaN/ZRbS4jb53YwQn7A1zOlAE4x5Lj6V7l1PD7O/wbHaGe7xkykrw7+Cv4i0ukSi7VBnsg==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/web-ext-run/-/web-ext-run-0.1.2.tgz", + "integrity": "sha512-VygO7lg10keonbku5Lbi21zEz1k91odkW+c6YB5DGb+mITcRMVM2zr/tJ+Suh6wxNUOOFNbinoqDlSUWdxt6YQ==", "dependencies": { - "@babel/runtime": "7.23.4", - "@devicefarmer/adbkit": "3.2.5", + "@babel/runtime": "7.23.9", + "@devicefarmer/adbkit": "3.2.6", "bunyan": "1.8.15", "chrome-launcher": "0.15.1", "debounce": "1.2.1", "es6-error": "4.1.1", - "firefox-profile": "4.4.0", - "fs-extra": "11.1.1", - "fx-runner": "1.3.0", + "firefox-profile": "4.5.0", + "fs-extra": "11.2.0", + "fx-runner": "1.4.0", "mkdirp": "1.0.4", "multimatch": "6.0.0", "mz": "2.7.0", @@ -8509,18 +8459,18 @@ "tmp": "0.2.1", "update-notifier": "6.0.2", "watchpack": "2.4.0", - "ws": "8.14.2", + "ws": "8.16.0", "zip-dir": "2.0.0" }, "engines": { - "node": ">=16.0.0", + "node": ">=18.0.0", "npm": ">=8.0.0" } }, "node_modules/web-ext-run/node_modules/@babel/runtime": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", - "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -8529,9 +8479,9 @@ } }, "node_modules/web-ext-run/node_modules/@devicefarmer/adbkit": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit/-/adbkit-3.2.5.tgz", - "integrity": "sha512-+J479WWZW3GU3t40flicDfiDrFz6vpiy2RcBQPEhFcs/3La9pOtr4Bgz2Q02E4luUG2RAL068rqIkKNUTy3tZw==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit/-/adbkit-3.2.6.tgz", + "integrity": "sha512-8lO1hSeTgtxcOHhp4tTWq/JaOysp5KNbbyFoxNEBnwkCDZu/Bji3ZfOaG++Riv9jN6c9bgdLBOZqJTC5VJPRKQ==", "dependencies": { "@devicefarmer/adbkit-logcat": "^2.1.2", "@devicefarmer/adbkit-monkey": "~1.2.1", @@ -8557,9 +8507,9 @@ } }, "node_modules/web-ext-run/node_modules/firefox-profile": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.4.0.tgz", - "integrity": "sha512-n+Wwa7yNtgJcOOWJXVOpF84rlDdPGsZ5d2dAuCZJivf3SSmx2omWFRDU85l4T5HZ3jj+FJQbyto04pX7/HWPnA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.5.0.tgz", + "integrity": "sha512-goE2XxbmYVSafvCjcy64/AK3xOr14HCUCD4+TpYWEIMy4nrJfNAacLGzwqKwZhCW0hHI2TYMGH+G/YBvOE8L6g==", "dependencies": { "adm-zip": "~0.5.x", "fs-extra": "~9.0.1", @@ -8585,27 +8535,6 @@ "node": ">=10" } }, - "node_modules/web-ext-run/node_modules/firefox-profile/node_modules/universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/web-ext-run/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/web-ext-run/node_modules/json-parse-even-better-errors": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", @@ -8678,10 +8607,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/web-ext-run/node_modules/universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/web-ext-run/node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { "node": ">=10.0.0" }, @@ -8833,9 +8770,9 @@ } }, "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", "dev": true, "engines": { "node": ">= 8" diff --git a/extension/package.json b/extension/package.json index 806d54f..ba5d172 100644 --- a/extension/package.json +++ b/extension/package.json @@ -44,7 +44,7 @@ "@fortawesome/vue-fontawesome": "^3.0.3", "@headlessui/vue": "^1.7.x", "@kyvg/vue3-notification": "^3.0.x", - "@vnuge/vnlib.browser": "https://www.vaughnnugent.com/public/resources/software/builds/Plugins.Essentials/0ca26fc63cc5311298575209b124516139f58206/@vnuge-vnlib.browser/release.tgz", + "@vnuge/vnlib.browser": "https://www.vaughnnugent.com/public/resources/software/builds/Plugins.Essentials/df7dc615532d3441f527374d18664c1a5a336de6/@vnuge-vnlib.browser/release.tgz", "@vuelidate/core": "^2.0.0", "@vuelidate/validators": "^2.0.0", "@vueuse/core": "^10.3.2", diff --git a/extension/src/components/ListBox.vue b/extension/src/components/ListBox.vue new file mode 100644 index 0000000..704cc58 --- /dev/null +++ b/extension/src/components/ListBox.vue @@ -0,0 +1,86 @@ + + + \ No newline at end of file diff --git a/extension/src/components/Pagination.vue b/extension/src/components/Pagination.vue new file mode 100644 index 0000000..9a017ed --- /dev/null +++ b/extension/src/components/Pagination.vue @@ -0,0 +1,36 @@ + + + \ No newline at end of file diff --git a/extension/src/entries/contentScript/primary/components/PromptPopup.vue b/extension/src/entries/contentScript/primary/components/PromptPopup.vue index 1f62877..b2415b9 100644 --- a/extension/src/entries/contentScript/primary/components/PromptPopup.vue +++ b/extension/src/entries/contentScript/primary/components/PromptPopup.vue @@ -1,11 +1,12 @@ +const getRuleName = (rule: CreateRuleType) => { + switch (rule) { + default: + return 'None' + case CreateRuleType.AllowOnce: + return "Allow Once" + case CreateRuleType.AllowForever: + return "Allow Forever" + case CreateRuleType.FiveMinutes: + return "5 Minutes" + case CreateRuleType.OneHour: + return "1 Hour" + case CreateRuleType.OneDay: + return "1 Day" + case CreateRuleType.OneWeek: + return "1 Week" + case CreateRuleType.OneMonth: + return "1 Month" + } +} + +const createOption = (rule: CreateRuleType): Option => { + return { name: getRuleName(rule), value: rule } +} + +const creatGroup = (name: string, options: Option[]): OptionGroup => { + return { name, options } +} + +const lbOptions = ((): OptionGroup[] => { + return[ + creatGroup('Allow', [ + createOption(CreateRuleType.AllowOnce), + createOption(CreateRuleType.AllowForever) + ]), + creatGroup('Allow for', [ + createOption(CreateRuleType.FiveMinutes), + createOption(CreateRuleType.OneHour), + createOption(CreateRuleType.OneDay), + createOption(CreateRuleType.OneWeek), + createOption(CreateRuleType.OneMonth) + ]) + ] +})() + +const modelToString = (rule: CreateRuleType) => getRuleName(rule) + + \ No newline at end of file diff --git a/extension/src/entries/contentScript/primary/main.js b/extension/src/entries/contentScript/primary/main.js index 15fc2ec..2e05ca3 100644 --- a/extension/src/entries/contentScript/primary/main.js +++ b/extension/src/entries/contentScript/primary/main.js @@ -19,6 +19,7 @@ import { defer } from "lodash"; import { createPinia } from 'pinia'; import { useBackgroundPiniaPlugin, identityPlugin, originPlugin, permissionsPlugin } from '../../store' import { onLoad } from "../util"; +import ListBox from '../../../components/ListBox.vue' import renderContent from "../renderContent"; import App from "./App.vue"; import Notification from '@kyvg/vue3-notification' @@ -64,6 +65,7 @@ renderContent([], (appRoot, shadowRoot) => { .use(store) .use(Notification) .component('fa-icon', FontAwesomeIcon) + .component('list-box', ListBox) .mount(appRoot); //Load the nostr shim diff --git a/extension/src/entries/contentScript/util.ts b/extension/src/entries/contentScript/util.ts index aecb7b2..192f1c1 100644 --- a/extension/src/entries/contentScript/util.ts +++ b/extension/src/entries/contentScript/util.ts @@ -25,7 +25,7 @@ const registerWindowHandler = (store: Store, extName: string) => { const { selectedKey } = storeToRefs(store) const { nostr, permission } = store.plugins; - const onAsyncCall = async ({ source, data, origin } : MessageEvent) => { + const onAsyncCall = async ({ data, origin } : MessageEvent) => { //clean any junk/methods with json parse/stringify data = JSON.parse(JSON.stringify(data)) @@ -38,7 +38,7 @@ const registerWindowHandler = (store: Store, extName: string) => { } //Confirm the message format is correct - if (!isEqual(source, window) || isEmpty(data) || isNil(data.type)) { + if (isEmpty(data) || isNil(data.type)) { return } //Confirm extension is for us diff --git a/extension/src/entries/options/App.vue b/extension/src/entries/options/App.vue index 3dbe94d..f62795f 100644 --- a/extension/src/entries/options/App.vue +++ b/extension/src/entries/options/App.vue @@ -12,7 +12,7 @@

NVault

- + - -
  • - - Page - {{ currentPage }} - of - {{ pageCount }} - -
  • -
  • - -
  • - - + -
    +
    @@ -40,7 +19,7 @@ Origin @@ -52,10 +31,12 @@ {{ rule.type }}
    - Time + Expires
    - {{ rule.origin }} + + {{ rule.origin }} + - {{ createShortDateAndTime(rule) }} + {{ getExpiration(rule) }}
    @@ -73,7 +54,7 @@