diff --git a/.389-ds-base.metadata b/.389-ds-base.metadata index e6addf0..184efc0 100644 --- a/.389-ds-base.metadata +++ b/.389-ds-base.metadata @@ -1,3 +1,3 @@ -274dec37976c1efde9cbeb458d50bbcd6b244974 SOURCES/389-ds-base-2.5.2.tar.bz2 +25969f6e65d79aa29671eff7185e4307ff3c08a0 SOURCES/389-ds-base-2.6.1.tar.bz2 1c8f2d0dfbf39fa8cd86363bf3314351ab21f8d4 SOURCES/jemalloc-5.3.0.tar.bz2 -c9dfe857929ddade41096e6d387f593f79d05ea0 SOURCES/vendor-2.5.2-1.tar.gz +110a41a9286255a008309620c3be3b3965e579dc SOURCES/vendor-2.6.1-1.tar.gz diff --git a/.gitignore b/.gitignore index 1e6a333..12d14d9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -SOURCES/389-ds-base-2.5.2.tar.bz2 +SOURCES/389-ds-base-2.6.1.tar.bz2 SOURCES/jemalloc-5.3.0.tar.bz2 -SOURCES/vendor-2.5.2-1.tar.gz +SOURCES/vendor-2.6.1-1.tar.gz diff --git a/SOURCES/0001-Issue-6312-In-branch-2.5-healthcheck-report-an-inval.patch b/SOURCES/0001-Issue-6312-In-branch-2.5-healthcheck-report-an-inval.patch deleted file mode 100644 index ff6da91..0000000 --- a/SOURCES/0001-Issue-6312-In-branch-2.5-healthcheck-report-an-inval.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 0ff5aa641d619bdcc154c2c94f8f8180bcaec776 Mon Sep 17 00:00:00 2001 -From: tbordaz -Date: Thu, 29 Aug 2024 10:49:57 +0200 -Subject: [PATCH] Issue 6312 - In branch 2.5, healthcheck report an invalid - warning regarding BDB deprecation (#6313) - -Bug description: - during healthcheck, _lint_backend_implementation checks that - the instance is not running a BDB backend. - This check only applies for instance after 3.0.0 - -Fix description: - If the instance is newer than 3.0.0 the health check - just returns - -relates: #6312 - -Reviewed by: ---- - dirsrvtests/tests/suites/healthcheck/healthcheck_test.py | 1 + - src/lib389/lib389/backend.py | 4 ++-- - 2 files changed, 3 insertions(+), 2 deletions(-) - -diff --git a/dirsrvtests/tests/suites/healthcheck/healthcheck_test.py b/dirsrvtests/tests/suites/healthcheck/healthcheck_test.py -index 29cca187e..66cf3c7d3 100644 ---- a/dirsrvtests/tests/suites/healthcheck/healthcheck_test.py -+++ b/dirsrvtests/tests/suites/healthcheck/healthcheck_test.py -@@ -556,6 +556,7 @@ def test_lint_backend_implementation_wrong_files(topology_st): - - - @pytest.mark.skipif(get_default_db_lib() == "mdb", reason="Not needed for mdb") -+@pytest.mark.skipif(ds_is_older("3.0.0"), reason="mdb and bdb are both supported") - def test_lint_backend_implementation(topology_st): - """Test the lint for backend implementation mismatch - -diff --git a/src/lib389/lib389/backend.py b/src/lib389/lib389/backend.py -index caee88e6a..0ed00a4a7 100644 ---- a/src/lib389/lib389/backend.py -+++ b/src/lib389/lib389/backend.py -@@ -14,7 +14,7 @@ from lib389._constants import DN_LDBM, DN_CHAIN, DN_PLUGIN, DEFAULT_BENAME - from lib389.properties import BACKEND_OBJECTCLASS_VALUE, BACKEND_PROPNAME_TO_ATTRNAME, BACKEND_CHAIN_BIND_DN, \ - BACKEND_CHAIN_BIND_PW, BACKEND_CHAIN_URLS, BACKEND_PROPNAME_TO_ATTRNAME, BACKEND_NAME, \ - BACKEND_SUFFIX, BACKEND_SAMPLE_ENTRIES, TASK_WAIT --from lib389.utils import normalizeDN, ensure_str, assert_c -+from lib389.utils import normalizeDN, ensure_str, assert_c, ds_is_newer - from lib389 import Entry - - # Need to fix this .... -@@ -513,7 +513,7 @@ class Backend(DSLdapObject): - - def _lint_backend_implementation(self): - backend_impl = self._instance.get_db_lib() -- if backend_impl == 'bdb': -+ if backend_impl == 'bdb' and ds_is_newer('3.0.0', instance=self._instance): - result = DSBLE0006 - result['items'] = [self.lint_uid()] - yield result --- -2.46.0 - diff --git a/SOURCES/0001-Issue-6468-Fix-building-for-older-versions-of-Python.patch b/SOURCES/0001-Issue-6468-Fix-building-for-older-versions-of-Python.patch new file mode 100644 index 0000000..b3e87c5 --- /dev/null +++ b/SOURCES/0001-Issue-6468-Fix-building-for-older-versions-of-Python.patch @@ -0,0 +1,60 @@ +From 0921400a39b61687db2bc55ebd5021eef507e960 Mon Sep 17 00:00:00 2001 +From: Viktor Ashirov +Date: Tue, 28 Jan 2025 21:05:49 +0100 +Subject: [PATCH] Issue 6468 - Fix building for older versions of Python + +Bug Description: +Structural Pattern Matching has been added in Python 3.10, older version +do not support it. + +Fix Description: +Replace `match` and `case` statements with `if-elif`. + +Relates: https://github.com/389ds/389-ds-base/issues/6468 + +Reviewed by: @droideck (Thanks!) +--- + src/lib389/lib389/cli_conf/logging.py | 27 ++++++++++++++------------- + 1 file changed, 14 insertions(+), 13 deletions(-) + +diff --git a/src/lib389/lib389/cli_conf/logging.py b/src/lib389/lib389/cli_conf/logging.py +index 2e86f2de8..d1e32822c 100644 +--- a/src/lib389/lib389/cli_conf/logging.py ++++ b/src/lib389/lib389/cli_conf/logging.py +@@ -234,19 +234,20 @@ def get_log_config(inst, basedn, log, args): + attr_map = {} + levels = {} + +- match args.logtype: +- case "access": +- attr_map = ACCESS_ATTR_MAP +- levels = ACCESS_LEVELS +- case "error": +- attr_map = ERROR_ATTR_MAP +- levels = ERROR_LEVELS +- case "security": +- attr_map = SECURITY_ATTR_MAP +- case "audit": +- attr_map = AUDIT_ATTR_MAP +- case "auditfail": +- attr_map = AUDITFAIL_ATTR_MAP ++ if args.logtype == "access": ++ attr_map = ACCESS_ATTR_MAP ++ levels = ACCESS_LEVELS ++ elif args.logtype == "error": ++ attr_map = ERROR_ATTR_MAP ++ levels = ERROR_LEVELS ++ elif args.logtype == "security": ++ attr_map = SECURITY_ATTR_MAP ++ elif args.logtype == "audit": ++ attr_map = AUDIT_ATTR_MAP ++ elif args.logtype == "auditfail": ++ attr_map = AUDITFAIL_ATTR_MAP ++ else: ++ raise ValueError(f"Unknown logtype: {args.logtype}") + + sorted_results = [] + for attr, value in attrs.items(): +-- +2.48.0 + diff --git a/SOURCES/0002-Issue-6316-lmdb-reindex-is-broken-if-index-type-is-s.patch b/SOURCES/0002-Issue-6316-lmdb-reindex-is-broken-if-index-type-is-s.patch deleted file mode 100644 index da27be5..0000000 --- a/SOURCES/0002-Issue-6316-lmdb-reindex-is-broken-if-index-type-is-s.patch +++ /dev/null @@ -1,237 +0,0 @@ -From af27f433ec14bcaf070108ab0b6af64ad1153a11 Mon Sep 17 00:00:00 2001 -From: progier389 -Date: Fri, 6 Sep 2024 18:07:17 +0200 -Subject: [PATCH] Issue 6316 - lmdb reindex is broken if index type is - specified (#6318) - -While reindexing using task or offline reindex, if the attribute name contains the index type (for example :eq,pres) -Then the attribute is not reindexed. Problem occurs when lmdb is used, things are working fine with bdb. -Solution: strip the index type in reindex as it is done in bdb case. -Anyway the reindex design requires that for a given attribute all the configured index types must be rebuild. - -Issue: #6316 - -Reviewed by: @tbordaz, @droideck (Thanks!) ---- - .../tests/suites/indexes/regression_test.py | 141 +++++++++++++++++- - .../slapd/back-ldbm/db-mdb/mdb_import.c | 10 +- - 2 files changed, 147 insertions(+), 4 deletions(-) - -diff --git a/dirsrvtests/tests/suites/indexes/regression_test.py b/dirsrvtests/tests/suites/indexes/regression_test.py -index c385f5ca4..b077b529a 100644 ---- a/dirsrvtests/tests/suites/indexes/regression_test.py -+++ b/dirsrvtests/tests/suites/indexes/regression_test.py -@@ -10,6 +10,9 @@ import time - import os - import pytest - import ldap -+import logging -+import glob -+import re - from lib389._constants import DEFAULT_BENAME, DEFAULT_SUFFIX - from lib389.backend import Backend, Backends, DatabaseConfig - from lib389.cos import CosClassicDefinition, CosClassicDefinitions, CosTemplate -@@ -31,6 +34,8 @@ SUFFIX2 = 'dc=example2,dc=com' - BENAME2 = 'be2' - - DEBUGGING = os.getenv("DEBUGGING", default=False) -+logging.getLogger(__name__).setLevel(logging.INFO) -+log = logging.getLogger(__name__) - - - @pytest.fixture(scope="function") -@@ -83,6 +88,7 @@ def add_a_group_with_users(request, topo): - 'cn': USER_NAME, - 'uidNumber': f'{num}', - 'gidNumber': f'{num}', -+ 'description': f'Description for {USER_NAME}', - 'homeDirectory': f'/home/{USER_NAME}' - }) - users_list.append(user) -@@ -95,9 +101,10 @@ def add_a_group_with_users(request, topo): - # If the server crashed, start it again to do the cleanup - if not topo.standalone.status(): - topo.standalone.start() -- for user in users_list: -- user.delete() -- group.delete() -+ if not DEBUGGING: -+ for user in users_list: -+ user.delete() -+ group.delete() - - request.addfinalizer(fin) - -@@ -124,6 +131,38 @@ def set_small_idlistscanlimit(request, topo): - - request.addfinalizer(fin) - -+ -+@pytest.fixture(scope="function") -+def set_description_index(request, topo, add_a_group_with_users): -+ """ -+ Set some description values and description index without reindexing. -+ """ -+ inst = topo.standalone -+ backends = Backends(inst) -+ backend = backends.get(DEFAULT_BENAME) -+ indexes = backend.get_indexes() -+ attr = 'description' -+ -+ def fin(always=False): -+ if always or not DEBUGGING: -+ try: -+ idx = indexes.get(attr) -+ idx.delete() -+ except ldap.NO_SUCH_OBJECT: -+ pass -+ -+ request.addfinalizer(fin) -+ fin(always=True) -+ index = indexes.create(properties={ -+ 'cn': attr, -+ 'nsSystemIndex': 'false', -+ 'nsIndexType': ['eq', 'pres', 'sub'] -+ }) -+ # Restart needed with lmdb (to open the dbi handle) -+ inst.restart() -+ return (indexes, attr) -+ -+ - #unstable or unstatus tests, skipped for now - @pytest.mark.flaky(max_runs=2, min_passes=1) - @pytest.mark.skipif(ds_is_older("1.4.4.4"), reason="Not implemented") -@@ -347,6 +386,102 @@ def test_task_status(topo): - assert reindex_task.get_exit_code() == 0 - - -+def count_keys(inst, bename, attr, prefix=''): -+ indexfile = os.path.join(inst.dbdir, bename, attr + '.db') -+ # (bdb - we should also accept a version number for .db suffix) -+ for f in glob.glob(f'{indexfile}*'): -+ indexfile = f -+ -+ inst.stop() -+ output = inst.dbscan(None, None, args=['-f', indexfile, '-A'], stopping=False).decode() -+ inst.start() -+ count = 0 -+ regexp = f'^KEY: {re.escape(prefix)}' -+ for match in re.finditer(regexp, output, flags=re.MULTILINE): -+ count += 1 -+ log.info(f"count_keys found {count} keys starting with '{prefix}' in {indexfile}") -+ return count -+ -+ -+def test_reindex_task_with_type(topo, set_description_index): -+ """Check that reindex task works as expected when index type is specified. -+ -+ :id: 0c7f2fda-69f6-11ef-9eb8-083a88554478 -+ :setup: Standalone instance -+ - with 100 users having description attribute -+ - with description:eq,pres,sub index entry but not yet reindexed -+ :steps: -+ 1. Set description in suffix entry -+ 2. Count number of equality keys in description index -+ 3. Start a Reindex task on description:eq,pres and wait for completion -+ 4. Check the task status and exit code -+ 5. Count the equality, presence and substring keys in description index -+ 6. Start a Reindex task on description and wait for completion -+ 7. Check the task status and exit code -+ 8. Count the equality, presence and substring keys in description index -+ -+ :expectedresults: -+ 1. Success -+ 2. Should be either no key (bdb) or a single one (lmdb) -+ 3. Success -+ 4. Success -+ 5. Should have: more equality keys than in step 2 -+ one presence key -+ some substrings keys -+ 6. Success -+ 7. Success -+ 8. Should have same counts than in step 5 -+ """ -+ (indexes, attr) = set_description_index -+ inst = topo.standalone -+ if not inst.is_dbi_supported(): -+ pytest.skip('This test requires that dbscan supports -A option') -+ # modify indexed value -+ Domain(inst, DEFAULT_SUFFIX).replace(attr, f'test_before_reindex') -+ -+ keys1 = count_keys(inst, DEFAULT_BENAME, attr, prefix='=') -+ assert keys1 <= 1 -+ -+ tasks = Tasks(topo.standalone) -+ # completed reindex tasks MUST have a status because freeipa check it. -+ -+ # Reindex attr with eq,pres types -+ log.info(f'Reindex {attr} with eq,pres types') -+ tasks.reindex( -+ suffix=DEFAULT_SUFFIX, -+ attrname=f'{attr}:eq,pres', -+ args={TASK_WAIT: True} -+ ) -+ reindex_task = Task(topo.standalone, tasks.dn) -+ assert reindex_task.status() -+ assert reindex_task.get_exit_code() == 0 -+ -+ keys2e = count_keys(inst, DEFAULT_BENAME, attr, prefix='=') -+ keys2p = count_keys(inst, DEFAULT_BENAME, attr, prefix='+') -+ keys2s = count_keys(inst, DEFAULT_BENAME, attr, prefix='*') -+ assert keys2e > keys1 -+ assert keys2p > 0 -+ assert keys2s > 0 -+ -+ # Reindex attr without types -+ log.info(f'Reindex {attr} without types') -+ tasks.reindex( -+ suffix=DEFAULT_SUFFIX, -+ attrname=attr, -+ args={TASK_WAIT: True} -+ ) -+ reindex_task = Task(topo.standalone, tasks.dn) -+ assert reindex_task.status() -+ assert reindex_task.get_exit_code() == 0 -+ -+ keys3e = count_keys(inst, DEFAULT_BENAME, attr, prefix='=') -+ keys3p = count_keys(inst, DEFAULT_BENAME, attr, prefix='+') -+ keys3s = count_keys(inst, DEFAULT_BENAME, attr, prefix='*') -+ assert keys3e == keys2e -+ assert keys3p == keys2p -+ assert keys3s == keys2s -+ -+ - def test_task_and_be(topo, add_backend_and_ldif_50K_users): - """Check that backend is writable after finishing a tasks - -diff --git a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import.c b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import.c -index d57146953..ce2151174 100644 ---- a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import.c -+++ b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import.c -@@ -1150,6 +1150,8 @@ process_db2index_attrs(Slapi_PBlock *pb, ImportCtx_t *ctx) - * TBD - */ - char **attrs = NULL; -+ char *attrname = NULL; -+ char *pt = NULL; - int i; - - slapi_pblock_get(pb, SLAPI_DB2INDEX_ATTRS, &attrs); -@@ -1157,7 +1159,13 @@ process_db2index_attrs(Slapi_PBlock *pb, ImportCtx_t *ctx) - for (i = 0; attrs && attrs[i]; i++) { - switch (attrs[i][0]) { - case 't': /* attribute type to index */ -- slapi_ch_array_add(&ctx->indexAttrs, slapi_ch_strdup(attrs[i] + 1)); -+ attrname = slapi_ch_strdup(attrs[i] + 1); -+ /* Strip index type */ -+ pt = strchr(attrname, ':'); -+ if (pt != NULL) { -+ *pt = '\0'; -+ } -+ slapi_ch_array_add(&ctx->indexAttrs, attrname); - break; - case 'T': /* VLV Search to index */ - slapi_ch_array_add(&ctx->indexVlvs, get_vlv_dbname(attrs[i] + 1)); --- -2.46.0 - diff --git a/SOURCES/0002-Issue-6489-After-log-rotation-refresh-the-FD-pointer.patch b/SOURCES/0002-Issue-6489-After-log-rotation-refresh-the-FD-pointer.patch new file mode 100644 index 0000000..42ca433 --- /dev/null +++ b/SOURCES/0002-Issue-6489-After-log-rotation-refresh-the-FD-pointer.patch @@ -0,0 +1,146 @@ +From 12f9bf81e834549db02b1243ecf769b511c9f69f Mon Sep 17 00:00:00 2001 +From: Mark Reynolds +Date: Fri, 31 Jan 2025 08:54:27 -0500 +Subject: [PATCH] Issue 6489 - After log rotation refresh the FD pointer + +Description: + +When flushing a log buffer we get a FD for log prior to checking if the +log should be rotated. If the log is rotated that FD reference is now +invalid, and it needs to be refrehed before proceeding + +Relates: https://github.com/389ds/389-ds-base/issues/6489 + +Reviewed by: tbordaz(Thanks!) +--- + .../suites/logging/log_flush_rotation_test.py | 81 +++++++++++++++++++ + ldap/servers/slapd/log.c | 18 +++++ + 2 files changed, 99 insertions(+) + create mode 100644 dirsrvtests/tests/suites/logging/log_flush_rotation_test.py + +diff --git a/dirsrvtests/tests/suites/logging/log_flush_rotation_test.py b/dirsrvtests/tests/suites/logging/log_flush_rotation_test.py +new file mode 100644 +index 000000000..b33a622e1 +--- /dev/null ++++ b/dirsrvtests/tests/suites/logging/log_flush_rotation_test.py +@@ -0,0 +1,81 @@ ++# --- BEGIN COPYRIGHT BLOCK --- ++# Copyright (C) 2025 Red Hat, Inc. ++# All rights reserved. ++# ++# License: GPL (version 3 or any later version). ++# See LICENSE for details. ++# --- END COPYRIGHT BLOCK --- ++# ++import os ++import logging ++import time ++import pytest ++from lib389._constants import DEFAULT_SUFFIX, PW_DM ++from lib389.tasks import ImportTask ++from lib389.idm.user import UserAccounts ++from lib389.topologies import topology_st as topo ++ ++ ++log = logging.getLogger(__name__) ++ ++ ++def test_log_flush_and_rotation_crash(topo): ++ """Make sure server does not crash whening flushing a buffer and rotating ++ the log at the same time ++ ++ :id: d4b0af2f-48b2-45f5-ae8b-f06f692c3133 ++ :setup: Standalone Instance ++ :steps: ++ 1. Enable all logs ++ 2. Enable log buffering for all logs ++ 3. Set rotation time unit to 1 minute ++ 4. Make sure server is still running after 1 minute ++ :expectedresults: ++ 1. Success ++ 2. Success ++ 3. Success ++ 4. Success ++ """ ++ ++ inst = topo.standalone ++ ++ # Enable logging and buffering ++ inst.config.set("nsslapd-auditlog-logging-enabled", "on") ++ inst.config.set("nsslapd-accesslog-logbuffering", "on") ++ inst.config.set("nsslapd-auditlog-logbuffering", "on") ++ inst.config.set("nsslapd-errorlog-logbuffering", "on") ++ inst.config.set("nsslapd-securitylog-logbuffering", "on") ++ ++ # Set rotation policy to trigger rotation asap ++ inst.config.set("nsslapd-accesslog-logrotationtimeunit", "minute") ++ inst.config.set("nsslapd-auditlog-logrotationtimeunit", "minute") ++ inst.config.set("nsslapd-errorlog-logrotationtimeunit", "minute") ++ inst.config.set("nsslapd-securitylog-logrotationtimeunit", "minute") ++ ++ # ++ # Performs ops to populate all the logs ++ # ++ # Access & audit log ++ users = UserAccounts(topo.standalone, DEFAULT_SUFFIX) ++ user = users.create_test_user() ++ user.set("userPassword", PW_DM) ++ # Security log ++ user.bind(PW_DM) ++ # Error log ++ import_task = ImportTask(inst) ++ import_task.import_suffix_from_ldif(ldiffile="/not/here", ++ suffix=DEFAULT_SUFFIX) ++ ++ # Wait a minute and make sure the server did not crash ++ log.info("Sleep until logs are flushed and rotated") ++ time.sleep(61) ++ ++ assert inst.status() ++ ++ ++if __name__ == '__main__': ++ # Run isolated ++ # -s for DEBUG mode ++ CURRENT_FILE = os.path.realpath(__file__) ++ pytest.main(["-s", CURRENT_FILE]) ++ +diff --git a/ldap/servers/slapd/log.c b/ldap/servers/slapd/log.c +index 8352f4abd..c1260a203 100644 +--- a/ldap/servers/slapd/log.c ++++ b/ldap/servers/slapd/log.c +@@ -6746,6 +6746,23 @@ log_refresh_state(int32_t log_type) + return 0; + } + } ++static LOGFD ++log_refresh_fd(int32_t log_type) ++{ ++ switch (log_type) { ++ case SLAPD_ACCESS_LOG: ++ return loginfo.log_access_fdes; ++ case SLAPD_SECURITY_LOG: ++ return loginfo.log_security_fdes; ++ case SLAPD_AUDIT_LOG: ++ return loginfo.log_audit_fdes; ++ case SLAPD_AUDITFAIL_LOG: ++ return loginfo.log_auditfail_fdes; ++ case SLAPD_ERROR_LOG: ++ return loginfo.log_error_fdes; ++ } ++ return NULL; ++} + + /* this function assumes the lock is already acquired */ + /* if sync_now is non-zero, data is flushed to physical storage */ +@@ -6857,6 +6874,7 @@ log_flush_buffer(LogBufferInfo *lbi, int log_type, int sync_now, int locked) + rotationtime_secs); + } + log_state = log_refresh_state(log_type); ++ fd = log_refresh_fd(log_type); + } + + if (log_state & LOGGING_NEED_TITLE) { +-- +2.48.0 + diff --git a/SOURCES/0003-Issue-6192-Test-failure-test_match_large_valueset.patch b/SOURCES/0003-Issue-6192-Test-failure-test_match_large_valueset.patch deleted file mode 100644 index 1d5b3d0..0000000 --- a/SOURCES/0003-Issue-6192-Test-failure-test_match_large_valueset.patch +++ /dev/null @@ -1,53 +0,0 @@ -From c9a1628de9f666a43911392220c0e83d051a51c6 Mon Sep 17 00:00:00 2001 -From: Viktor Ashirov -Date: Thu, 6 Jun 2024 21:05:09 +0200 -Subject: [PATCH] Issue 6192 - Test failure: test_match_large_valueset - -Description: -When BDB backend is used, nsslapd-cache-autosize needs to be set to 0 -first in order to change nsslapd-cachememsize. -Also increase the expected etime slightly, as it fails on slower VMs -both with BDB and MDB backends. - -Fixes: https://github.com/389ds/389-ds-base/issues/6192 - -Reviewed by: @droideck, @tbordaz (Thanks!) ---- - dirsrvtests/tests/suites/filter/filter_test.py | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/dirsrvtests/tests/suites/filter/filter_test.py b/dirsrvtests/tests/suites/filter/filter_test.py -index 4baaf04a7..b17846c01 100644 ---- a/dirsrvtests/tests/suites/filter/filter_test.py -+++ b/dirsrvtests/tests/suites/filter/filter_test.py -@@ -15,7 +15,7 @@ from lib389.tasks import * - from lib389.backend import Backends, Backend - from lib389.dbgen import dbgen_users, dbgen_groups - from lib389.topologies import topology_st --from lib389._constants import PASSWORD, DEFAULT_SUFFIX, DN_DM, SUFFIX -+from lib389._constants import PASSWORD, DEFAULT_SUFFIX, DN_DM, SUFFIX, DN_CONFIG_LDBM - from lib389.utils import * - - pytestmark = pytest.mark.tier1 -@@ -372,6 +372,9 @@ def test_match_large_valueset(topology_st): - be_groups = backends.create(properties={'parent': DEFAULT_SUFFIX, 'nsslapd-suffix': groups_suffix, 'name': groups_backend}) - - # set the entry cache to 200Mb as the 1K groups of 2K users require at least 170Mb -+ if get_default_db_lib() == "bdb": -+ config_ldbm = DSLdapObject(inst, DN_CONFIG_LDBM) -+ config_ldbm.set('nsslapd-cache-autosize', '0') - be_groups.replace('nsslapd-cachememsize', groups_entrycache) - except: - raise -@@ -427,7 +430,7 @@ def test_match_large_valueset(topology_st): - etime = float(search_result[1].split('etime=')[1]) - log.info("Duration of the search from access log was %f", etime) - assert len(entries) == groups_number -- assert (etime < 1) -+ assert (etime < 5) - - if __name__ == '__main__': - # Run isolated --- -2.47.1 - diff --git a/SOURCES/0003-Issue-6374-nsslapd-mdb-max-dbs-autotuning-doesn-t-wo.patch b/SOURCES/0003-Issue-6374-nsslapd-mdb-max-dbs-autotuning-doesn-t-wo.patch new file mode 100644 index 0000000..44a0cb1 --- /dev/null +++ b/SOURCES/0003-Issue-6374-nsslapd-mdb-max-dbs-autotuning-doesn-t-wo.patch @@ -0,0 +1,311 @@ +From f077f9692d1625a1bc2dc6ee02a4fca71ee30b03 Mon Sep 17 00:00:00 2001 +From: progier389 +Date: Wed, 13 Nov 2024 15:31:35 +0100 +Subject: [PATCH] Issue 6374 - nsslapd-mdb-max-dbs autotuning doesn't work + properly (#6400) + +* Issue 6374 - nsslapd-mdb-max-dbs autotuning doesn't work properly + +Several issues: + +After restarting the server nsslapd-mdb-max-dbs may not be high enough to add a new backend +because the value computation is wrong. +dbscan fails to open the database if nsslapd-mdb-max-dbs has been increased. +dbscan crashes when closing the database (typically when using -S) +When starting the instance the nsslapd-mdb-max-dbs parameter is increased to ensure that a new backend may be added. +When dse.ldif path is not specified, the db environment is now open using the INFO.mdb data instead of using the default values. +synchronization between thread closure and database context destruction is hardened +Issue: #6374 + +Reviewed by: @tbordaz , @vashirov (Thanks!) + +(cherry picked from commit 56cd3389da608a3f6eeee58d20dffbcd286a8033) +--- + .../tests/suites/config/config_test.py | 86 +++++++++++++++++++ + ldap/servers/slapd/back-ldbm/back-ldbm.h | 2 + + .../slapd/back-ldbm/db-mdb/mdb_config.c | 17 ++-- + .../back-ldbm/db-mdb/mdb_import_threads.c | 9 +- + .../slapd/back-ldbm/db-mdb/mdb_instance.c | 8 ++ + ldap/servers/slapd/back-ldbm/dbimpl.c | 2 +- + ldap/servers/slapd/back-ldbm/import.c | 14 ++- + 7 files changed, 128 insertions(+), 10 deletions(-) + +diff --git a/dirsrvtests/tests/suites/config/config_test.py b/dirsrvtests/tests/suites/config/config_test.py +index 57b155af7..34dac36b6 100644 +--- a/dirsrvtests/tests/suites/config/config_test.py ++++ b/dirsrvtests/tests/suites/config/config_test.py +@@ -17,6 +17,7 @@ from lib389.topologies import topology_m2, topology_st as topo + from lib389.utils import * + from lib389._constants import DN_CONFIG, DEFAULT_SUFFIX, DEFAULT_BENAME + from lib389._mapped_object import DSLdapObjects ++from lib389.agreement import Agreements + from lib389.cli_base import FakeArgs + from lib389.cli_conf.backend import db_config_set + from lib389.idm.user import UserAccounts, TEST_USER_PROPERTIES +@@ -27,6 +28,8 @@ from lib389.cos import CosPointerDefinitions, CosTemplates + from lib389.backend import Backends, DatabaseConfig + from lib389.monitor import MonitorLDBM, Monitor + from lib389.plugins import ReferentialIntegrityPlugin ++from lib389.replica import BootstrapReplicationManager, Replicas ++from lib389.passwd import password_generate + + pytestmark = pytest.mark.tier0 + +@@ -36,6 +39,8 @@ PSTACK_CMD = '/usr/bin/pstack' + logging.getLogger(__name__).setLevel(logging.INFO) + log = logging.getLogger(__name__) + ++DEBUGGING = os.getenv("DEBUGGING", default=False) ++ + @pytest.fixture(scope="module") + def big_file(): + TEMP_BIG_FILE = '' +@@ -811,6 +816,87 @@ def test_numlisteners_limit(topo): + assert numlisteners[0] == '4' + + ++def bootstrap_replication(inst_from, inst_to, creds): ++ manager = BootstrapReplicationManager(inst_to) ++ rdn_val = 'replication manager' ++ if manager.exists(): ++ manager.delete() ++ manager.create(properties={ ++ 'cn': rdn_val, ++ 'uid': rdn_val, ++ 'userPassword': creds ++ }) ++ for replica in Replicas(inst_to).list(): ++ replica.remove_all('nsDS5ReplicaBindDNGroup') ++ replica.replace('nsDS5ReplicaBindDN', manager.dn) ++ for agmt in Agreements(inst_from).list(): ++ agmt.replace('nsDS5ReplicaBindDN', manager.dn) ++ agmt.replace('nsDS5ReplicaCredentials', creds) ++ ++ ++@pytest.mark.skipif(get_default_db_lib() != "mdb", reason="This test requires lmdb") ++def test_lmdb_autotuned_maxdbs(topology_m2, request): ++ """Verify that after restart, nsslapd-mdb-max-dbs is large enough to add a new backend. ++ ++ :id: 0272d432-9080-11ef-8f40-482ae39447e5 ++ :setup: Two suppliers configuration ++ :steps: ++ 1. loop 20 times ++ 3. In 1 loop: restart instance ++ 3. In 1 loop: add a new backend ++ 4. In 1 loop: check that instance is still alive ++ :expectedresults: ++ 1. Success ++ 2. Success ++ 3. Success ++ 4. Success ++ """ ++ ++ s1 = topology_m2.ms["supplier1"] ++ s2 = topology_m2.ms["supplier2"] ++ ++ backends = Backends(s1) ++ db_config = DatabaseConfig(s1) ++ # Generate the teardown finalizer ++ belist = [] ++ creds=password_generate() ++ bootstrap_replication(s2, s1, creds) ++ bootstrap_replication(s1, s2, creds) ++ ++ def fin(): ++ s1.start() ++ for be in belist: ++ be.delete() ++ ++ if not DEBUGGING: ++ request.addfinalizer(fin) ++ ++ # 1. Set autotuning (off-line to be able to decrease the value) ++ s1.stop() ++ dse_ldif = DSEldif(s1) ++ dse_ldif.replace(db_config.dn, 'nsslapd-mdb-max-dbs', '0') ++ os.remove(f'{s1.dbdir}/data.mdb') ++ s1.start() ++ ++ # 2. Reinitialize the db: ++ log.info("Bulk import...") ++ agmt = Agreements(s2).list()[0] ++ agmt.begin_reinit() ++ (done, error) = agmt.wait_reinit() ++ log.info(f'Bulk importresult is ({done}, {error})') ++ assert done is True ++ assert error is False ++ ++ # 3. loop 20 times ++ for idx in range(20): ++ s1.restart() ++ log.info(f'Adding backend test{idx}') ++ belist.append(backends.create(properties={'cn': f'test{idx}', ++ 'nsslapd-suffix': f'dc=test{idx}'})) ++ assert s1.status() ++ ++ ++ + if __name__ == '__main__': + # Run isolated + # -s for DEBUG mode +diff --git a/ldap/servers/slapd/back-ldbm/back-ldbm.h b/ldap/servers/slapd/back-ldbm/back-ldbm.h +index 8fea63e35..35d0ece04 100644 +--- a/ldap/servers/slapd/back-ldbm/back-ldbm.h ++++ b/ldap/servers/slapd/back-ldbm/back-ldbm.h +@@ -896,4 +896,6 @@ typedef struct _back_search_result_set + ((L)->size == (R)->size && !memcmp((L)->data, (R)->data, (L)->size)) + + typedef int backend_implement_init_fn(struct ldbminfo *li, config_info *config_array); ++ ++pthread_mutex_t *get_import_ctx_mutex(); + #endif /* _back_ldbm_h_ */ +diff --git a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_config.c b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_config.c +index 351f54037..1f7b71442 100644 +--- a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_config.c ++++ b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_config.c +@@ -83,7 +83,7 @@ dbmdb_compute_limits(struct ldbminfo *li) + uint64_t total_space = 0; + uint64_t avail_space = 0; + uint64_t cur_dbsize = 0; +- int nbchangelogs = 0; ++ int nbvlvs = 0; + int nbsuffixes = 0; + int nbindexes = 0; + int nbagmt = 0; +@@ -99,8 +99,8 @@ dbmdb_compute_limits(struct ldbminfo *li) + * But some tunable may be autotuned. + */ + if (dbmdb_count_config_entries("(objectClass=nsMappingTree)", &nbsuffixes) || +- dbmdb_count_config_entries("(objectClass=nsIndex)", &nbsuffixes) || +- dbmdb_count_config_entries("(&(objectClass=nsds5Replica)(nsDS5Flags=1))", &nbchangelogs) || ++ dbmdb_count_config_entries("(objectClass=nsIndex)", &nbindexes) || ++ dbmdb_count_config_entries("(objectClass=vlvIndex)", &nbvlvs) || + dbmdb_count_config_entries("(objectClass=nsds5replicationagreement)", &nbagmt)) { + /* error message is already logged */ + return 1; +@@ -120,8 +120,15 @@ dbmdb_compute_limits(struct ldbminfo *li) + + info->pagesize = sysconf(_SC_PAGE_SIZE); + limits->min_readers = config_get_threadnumber() + nbagmt + DBMDB_READERS_MARGIN; +- /* Default indexes are counted in "nbindexes" so we should always have enough resource to add 1 new suffix */ +- limits->min_dbs = nbsuffixes + nbindexes + nbchangelogs + DBMDB_DBS_MARGIN; ++ /* ++ * For each suffix there are 4 databases instances: ++ * long-entryrdn, replication_changelog, id2entry and ancestorid ++ * then the indexes and the vlv and vlv cache ++ * ++ * Default indexes are counted in "nbindexes" so we should always have enough ++ * resource to add 1 new suffix ++ */ ++ limits->min_dbs = 4*nbsuffixes + nbindexes + 2*nbvlvs + DBMDB_DBS_MARGIN; + + total_space = ((uint64_t)(buf.f_blocks)) * ((uint64_t)(buf.f_bsize)); + avail_space = ((uint64_t)(buf.f_bavail)) * ((uint64_t)(buf.f_bsize)); +diff --git a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c +index 8c879da31..707a110c5 100644 +--- a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c ++++ b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c +@@ -4312,9 +4312,12 @@ dbmdb_import_init_writer(ImportJob *job, ImportRole_t role) + void + dbmdb_free_import_ctx(ImportJob *job) + { +- if (job->writer_ctx) { +- ImportCtx_t *ctx = job->writer_ctx; +- job->writer_ctx = NULL; ++ ImportCtx_t *ctx = NULL; ++ pthread_mutex_lock(get_import_ctx_mutex()); ++ ctx = job->writer_ctx; ++ job->writer_ctx = NULL; ++ pthread_mutex_unlock(get_import_ctx_mutex()); ++ if (ctx) { + pthread_mutex_destroy(&ctx->workerq.mutex); + pthread_cond_destroy(&ctx->workerq.cv); + slapi_ch_free((void**)&ctx->workerq.slots); +diff --git a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_instance.c b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_instance.c +index 6386ecf06..05f1e348d 100644 +--- a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_instance.c ++++ b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_instance.c +@@ -287,6 +287,13 @@ int add_dbi(dbi_open_ctx_t *octx, backend *be, const char *fname, int flags) + slapi_ch_free((void**)&treekey.dbname); + return octx->rc; + } ++ if (treekey.dbi >= ctx->dsecfg.max_dbs) { ++ octx->rc = MDB_DBS_FULL; ++ slapi_log_err(SLAPI_LOG_ERR, "add_dbi", "Failed to open database instance %s slots: %d/%d. Error is %d: %s.\n", ++ treekey.dbname, treekey.dbi, ctx->dsecfg.max_dbs, octx->rc, mdb_strerror(octx->rc)); ++ slapi_ch_free((void**)&treekey.dbname); ++ return octx->rc; ++ } + if (octx->ai && octx->ai->ai_key_cmp_fn) { + octx->rc = dbmdb_update_dbi_cmp_fn(ctx, &treekey, octx->ai->ai_key_cmp_fn, octx->txn); + if (octx->rc) { +@@ -689,6 +696,7 @@ int dbmdb_make_env(dbmdb_ctx_t *ctx, int readOnly, mdb_mode_t mode) + rc = dbmdb_write_infofile(ctx); + } else { + /* No Config ==> read it from info file */ ++ ctx->dsecfg = ctx->startcfg; + } + if (rc) { + return rc; +diff --git a/ldap/servers/slapd/back-ldbm/dbimpl.c b/ldap/servers/slapd/back-ldbm/dbimpl.c +index da4a4548e..42f4a0718 100644 +--- a/ldap/servers/slapd/back-ldbm/dbimpl.c ++++ b/ldap/servers/slapd/back-ldbm/dbimpl.c +@@ -463,7 +463,7 @@ int dblayer_show_statistics(const char *dbimpl_name, const char *dbhome, FILE *f + li->li_plugin = be->be_database; + li->li_plugin->plg_name = (char*) "back-ldbm-dbimpl"; + li->li_plugin->plg_libpath = (char*) "libback-ldbm"; +- li->li_directory = (char*)dbhome; ++ li->li_directory = get_li_directory(dbhome); + + /* Initialize database plugin */ + rc = dbimpl_setup(li, dbimpl_name); +diff --git a/ldap/servers/slapd/back-ldbm/import.c b/ldap/servers/slapd/back-ldbm/import.c +index 2bb8cb581..30ec462fa 100644 +--- a/ldap/servers/slapd/back-ldbm/import.c ++++ b/ldap/servers/slapd/back-ldbm/import.c +@@ -27,6 +27,9 @@ + #define NEED_DN_NORM_SP -25 + #define NEED_DN_NORM_BT -26 + ++/* Protect against import context destruction */ ++static pthread_mutex_t import_ctx_mutex = PTHREAD_MUTEX_INITIALIZER; ++ + + /********** routines to manipulate the entry fifo **********/ + +@@ -143,6 +146,14 @@ ldbm_back_wire_import(Slapi_PBlock *pb) + + /* Threads management */ + ++/* Return the mutex that protects against import context destruction */ ++pthread_mutex_t * ++get_import_ctx_mutex() ++{ ++ return &import_ctx_mutex; ++} ++ ++ + /* tell all the threads to abort */ + void + import_abort_all(ImportJob *job, int wait_for_them) +@@ -151,7 +162,7 @@ import_abort_all(ImportJob *job, int wait_for_them) + + /* tell all the worker threads to abort */ + job->flags |= FLAG_ABORT; +- ++ pthread_mutex_lock(&import_ctx_mutex); + for (worker = job->worker_list; worker; worker = worker->next) + worker->command = ABORT; + +@@ -167,6 +178,7 @@ import_abort_all(ImportJob *job, int wait_for_them) + } + } + } ++ pthread_mutex_unlock(&import_ctx_mutex); + } + + +-- +2.48.0 + diff --git a/SOURCES/0004-Issue-6090-Fix-dbscan-options-and-man-pages-6315.patch b/SOURCES/0004-Issue-6090-Fix-dbscan-options-and-man-pages-6315.patch new file mode 100644 index 0000000..648eea5 --- /dev/null +++ b/SOURCES/0004-Issue-6090-Fix-dbscan-options-and-man-pages-6315.patch @@ -0,0 +1,894 @@ +From b53faa9e7289383bbc02fc260b1b34958a317fdd Mon Sep 17 00:00:00 2001 +From: progier389 +Date: Fri, 6 Sep 2024 14:45:06 +0200 +Subject: [PATCH] Issue 6090 - Fix dbscan options and man pages (#6315) + +* Issue 6090 - Fix dbscan options and man pages + +dbscan -d option is dangerously confusing as it removes a database instance while in db_stat it identify the database +(cf issue #5609 ). +This fix implements long options in dbscan, rename -d in --remove, and requires a new --do-it option for action that change the database content. +The fix should also align both the usage and the dbscan man page with the new set of options + +Issue: #6090 + +Reviewed by: @tbordaz, @droideck (Thanks!) + +(cherry picked from commit 25e1d16887ebd299dfe0088080b9ee0deec1e41f) +--- + dirsrvtests/tests/suites/clu/dbscan_test.py | 253 ++++++++++++++++++ + .../tests/suites/clu/repl_monitor_test.py | 4 +- + .../slapd/back-ldbm/db-bdb/bdb_layer.c | 12 +- + ldap/servers/slapd/back-ldbm/dbimpl.c | 50 +++- + ldap/servers/slapd/tools/dbscan.c | 182 ++++++++++--- + man/man1/dbscan.1 | 74 +++-- + src/lib389/lib389/__init__.py | 9 +- + src/lib389/lib389/cli_ctl/dblib.py | 13 +- + 8 files changed, 531 insertions(+), 66 deletions(-) + create mode 100644 dirsrvtests/tests/suites/clu/dbscan_test.py + +diff --git a/dirsrvtests/tests/suites/clu/dbscan_test.py b/dirsrvtests/tests/suites/clu/dbscan_test.py +new file mode 100644 +index 000000000..2c9a9651a +--- /dev/null ++++ b/dirsrvtests/tests/suites/clu/dbscan_test.py +@@ -0,0 +1,253 @@ ++# --- BEGIN COPYRIGHT BLOCK --- ++# Copyright (C) 2024 Red Hat, Inc. ++# All rights reserved. ++# ++# License: GPL (version 3 or any later version). ++# See LICENSE for details. ++# --- END COPYRIGHT BLOCK --- ++# ++import logging ++import os ++import pytest ++import re ++import subprocess ++import sys ++ ++from lib389 import DirSrv ++from lib389._constants import DBSCAN ++from lib389.topologies import topology_m2 as topo_m2 ++from difflib import context_diff ++ ++pytestmark = pytest.mark.tier0 ++ ++logging.getLogger(__name__).setLevel(logging.DEBUG) ++log = logging.getLogger(__name__) ++ ++DEBUGGING = os.getenv("DEBUGGING", default=False) ++ ++ ++class CalledProcessUnexpectedReturnCode(subprocess.CalledProcessError): ++ def __init__(self, result, expected_rc): ++ super().__init__(cmd=result.args, returncode=result.returncode, output=result.stdout, stderr=result.stderr) ++ self.expected_rc = expected_rc ++ self.result = result ++ ++ def __str__(self): ++ return f'Command {self.result.args} returned {self.result.returncode} instead of {self.expected_rc}' ++ ++ ++class DbscanPaths: ++ @staticmethod ++ def list_instances(inst, dblib, dbhome): ++ # compute db instance pathnames ++ instances = dbscan(['-D', dblib, '-L', dbhome], inst=inst).stdout ++ dbis = [] ++ if dblib == 'bdb': ++ pattern = r'^ (.*) $' ++ prefix = f'{dbhome}/' ++ else: ++ pattern = r'^ (.*) flags:' ++ prefix = f'' ++ for match in re.finditer(pattern, instances, flags=re.MULTILINE): ++ dbis.append(prefix+match.group(1)) ++ return dbis ++ ++ @staticmethod ++ def list_options(inst): ++ # compute supported options ++ options = [] ++ usage = dbscan(['-h'], inst=inst, expected_rc=None).stdout ++ pattern = r'^\s+(?:(-[^-,]+), +)?(--[^ ]+).*$' ++ for match in re.finditer(pattern, usage, flags=re.MULTILINE): ++ for idx in range(1,3): ++ if match.group(idx) is not None: ++ options.append(match.group(idx)) ++ return options ++ ++ def __init__(self, inst): ++ dblib = inst.get_db_lib() ++ dbhome = inst.ds_paths.db_home_dir ++ self.inst = inst ++ self.dblib = dblib ++ self.dbhome = dbhome ++ self.options = DbscanPaths.list_options(inst) ++ self.dbis = DbscanPaths.list_instances(inst, dblib, dbhome) ++ self.ldif_dir = inst.ds_paths.ldif_dir ++ ++ def get_dbi(self, attr, backend='userroot'): ++ for dbi in self.dbis: ++ if f'{backend}/{attr}.'.lower() in dbi.lower(): ++ return dbi ++ raise KeyError(f'Unknown dbi {backend}/{attr}') ++ ++ def __repr__(self): ++ attrs = ['inst', 'dblib', 'dbhome', 'ldif_dir', 'options', 'dbis' ] ++ res = ", ".join(map(lambda x: f'{x}={self.__dict__[x]}', attrs)) ++ return f'DbscanPaths({res})' ++ ++ ++def dbscan(args, inst=None, expected_rc=0): ++ if inst is None: ++ prefix = os.environ.get('PREFIX', "") ++ prog = f'{prefix}/bin/dbscan' ++ else: ++ prog = os.path.join(inst.ds_paths.bin_dir, DBSCAN) ++ args.insert(0, prog) ++ output = subprocess.run(args, encoding='utf-8', stdout=subprocess.PIPE, stderr=subprocess.STDOUT) ++ log.debug(f'{args} result is {output.returncode} output is {output.stdout}') ++ if expected_rc is not None and expected_rc != output.returncode: ++ raise CalledProcessUnexpectedReturnCode(output, expected_rc) ++ return output ++ ++ ++def log_export_file(filename): ++ with open(filename, 'r') as file: ++ log.debug(f'=========== Dump of {filename} ================') ++ for line in file: ++ log.debug(line.rstrip('\n')) ++ log.debug(f'=========== Enf of {filename} =================') ++ ++ ++@pytest.fixture(scope='module') ++def paths(topo_m2, request): ++ inst = topo_m2.ms["supplier1"] ++ if sys.version_info < (3,5): ++ pytest.skip('requires python version >= 3.5') ++ paths = DbscanPaths(inst) ++ if '--do-it' not in paths.options: ++ pytest.skip('Not supported with this dbscan version') ++ inst.stop() ++ return paths ++ ++ ++def test_dbscan_destructive_actions(paths, request): ++ """Test that dbscan remove/import actions ++ ++ :id: f40b0c42-660a-11ef-9544-083a88554478 ++ :setup: Stopped standalone instance ++ :steps: ++ 1. Export cn instance with dbscan ++ 2. Run dbscan --remove ... ++ 3. Check the error message about missing --do-it ++ 4. Check that cn instance is still present ++ 5. Run dbscan -I import_file ... ++ 6. Check it was properly imported ++ 7. Check that cn instance is still present ++ 8. Run dbscan --remove ... --doit ++ 9. Check the error message about missing --do-it ++ 10. Check that cn instance is still present ++ 11. Run dbscan -I import_file ... --do-it ++ 12. Check it was properly imported ++ 13. Check that cn instance is still present ++ 14. Export again the database ++ 15. Check that content of export files are the same ++ :expectedresults: ++ 1. Success ++ 2. dbscan return code should be 1 (error) ++ 3. Error message should be present ++ 4. cn instance should be present ++ 5. dbscan return code should be 1 (error) ++ 6. Error message should be present ++ 7. cn instance should be present ++ 8. dbscan return code should be 0 (success) ++ 9. Error message should not be present ++ 10. cn instance should not be present ++ 11. dbscan return code should be 0 (success) ++ 12. Error message should not be present ++ 13. cn instance should be present ++ 14. Success ++ 15. Export files content should be the same ++ """ ++ ++ # Export cn instance with dbscan ++ export_cn = f'{paths.ldif_dir}/dbscan_cn.data' ++ export_cn2 = f'{paths.ldif_dir}/dbscan_cn2.data' ++ cndbi = paths.get_dbi('replication_changelog') ++ inst = paths.inst ++ dblib = paths.dblib ++ exportok = False ++ def fin(): ++ if os.path.exists(export_cn): ++ # Restore cn if it was exported successfully but does not exists any more ++ if exportok and cndbi not in DbscanPaths.list_instances(inst, dblib, paths.dbhome): ++ dbscan(['-D', dblib, '-f', cndbi, '-I', export_cn, '--do-it'], inst=inst) ++ if not DEBUGGING: ++ os.remove(export_cn) ++ if os.path.exists(export_cn) and not DEBUGGING: ++ os.remove(export_cn2) ++ ++ fin() ++ request.addfinalizer(fin) ++ dbscan(['-D', dblib, '-f', cndbi, '-X', export_cn], inst=inst) ++ exportok = True ++ ++ expected_msg = "without specifying '--do-it' parameter." ++ ++ # Run dbscan --remove ... ++ result = dbscan(['-D', paths.dblib, '--remove', '-f', cndbi], ++ inst=paths.inst, expected_rc=1) ++ ++ # Check the error message about missing --do-it ++ assert expected_msg in result.stdout ++ ++ # Check that cn instance is still present ++ curdbis = DbscanPaths.list_instances(paths.inst, paths.dblib, paths.dbhome) ++ assert cndbi in curdbis ++ ++ # Run dbscan -I import_file ... ++ result = dbscan(['-D', paths.dblib, '-f', cndbi, '-I', export_cn], ++ inst=paths.inst, expected_rc=1) ++ ++ # Check the error message about missing --do-it ++ assert expected_msg in result.stdout ++ ++ # Check that cn instance is still present ++ curdbis = DbscanPaths.list_instances(paths.inst, paths.dblib, paths.dbhome) ++ assert cndbi in curdbis ++ ++ # Run dbscan --remove ... --doit ++ result = dbscan(['-D', paths.dblib, '--remove', '-f', cndbi, '--do-it'], ++ inst=paths.inst, expected_rc=0) ++ ++ # Check the error message about missing --do-it ++ assert expected_msg not in result.stdout ++ ++ # Check that cn instance is still present ++ curdbis = DbscanPaths.list_instances(paths.inst, paths.dblib, paths.dbhome) ++ assert cndbi not in curdbis ++ ++ # Run dbscan -I import_file ... --do-it ++ result = dbscan(['-D', paths.dblib, '-f', cndbi, ++ '-I', export_cn, '--do-it'], ++ inst=paths.inst, expected_rc=0) ++ ++ # Check the error message about missing --do-it ++ assert expected_msg not in result.stdout ++ ++ # Check that cn instance is still present ++ curdbis = DbscanPaths.list_instances(paths.inst, paths.dblib, paths.dbhome) ++ assert cndbi in curdbis ++ ++ # Export again the database ++ dbscan(['-D', dblib, '-f', cndbi, '-X', export_cn2], inst=inst) ++ ++ # Check that content of export files are the same ++ with open(export_cn) as f1: ++ f1lines = f1.readlines() ++ with open(export_cn2) as f2: ++ f2lines = f2.readlines() ++ diffs = list(context_diff(f1lines, f2lines)) ++ if len(diffs) > 0: ++ log.debug("Export file differences are:") ++ for d in diffs: ++ log.debug(d) ++ log_export_file(export_cn) ++ log_export_file(export_cn2) ++ assert diffs is None ++ ++ ++if __name__ == '__main__': ++ # Run isolated ++ # -s for DEBUG mode ++ CURRENT_FILE = os.path.realpath(__file__) ++ pytest.main("-s %s" % CURRENT_FILE) +diff --git a/dirsrvtests/tests/suites/clu/repl_monitor_test.py b/dirsrvtests/tests/suites/clu/repl_monitor_test.py +index d83416847..842dd96fd 100644 +--- a/dirsrvtests/tests/suites/clu/repl_monitor_test.py ++++ b/dirsrvtests/tests/suites/clu/repl_monitor_test.py +@@ -77,13 +77,13 @@ def get_hostnames_from_log(port1, port2): + # search for Supplier :hostname:port + # and use \D to insure there is no more number is after + # the matched port (i.e that 10 is not matching 101) +- regexp = '(Supplier: )([^:]*)(:' + str(port1) + '\D)' ++ regexp = '(Supplier: )([^:]*)(:' + str(port1) + r'\D)' + match=re.search(regexp, logtext) + host_m1 = 'localhost.localdomain' + if (match is not None): + host_m1 = match.group(2) + # Same for supplier 2 +- regexp = '(Supplier: )([^:]*)(:' + str(port2) + '\D)' ++ regexp = '(Supplier: )([^:]*)(:' + str(port2) + r'\D)' + match=re.search(regexp, logtext) + host_m2 = 'localhost.localdomain' + if (match is not None): +diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c +index de6be0f42..4b30e8e87 100644 +--- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c ++++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c +@@ -5820,8 +5820,16 @@ bdb_import_file_name(ldbm_instance *inst) + static char * + bdb_restore_file_name(struct ldbminfo *li) + { +- char *fname = slapi_ch_smprintf("%s/../.restore", li->li_directory); +- ++ char *pt = strrchr(li->li_directory, '/'); ++ char *fname = NULL; ++ if (pt == NULL) { ++ fname = slapi_ch_strdup(".restore"); ++ } else { ++ size_t len = pt-li->li_directory; ++ fname = slapi_ch_malloc(len+10); ++ strncpy(fname, li->li_directory, len); ++ strcpy(fname+len, "/.restore"); ++ } + return fname; + } + +diff --git a/ldap/servers/slapd/back-ldbm/dbimpl.c b/ldap/servers/slapd/back-ldbm/dbimpl.c +index 42f4a0718..134d06480 100644 +--- a/ldap/servers/slapd/back-ldbm/dbimpl.c ++++ b/ldap/servers/slapd/back-ldbm/dbimpl.c +@@ -397,7 +397,48 @@ const char *dblayer_op2str(dbi_op_t op) + return str[idx]; + } + +-/* Open db env, db and db file privately */ ++/* Get the li_directory directory from the database instance name - ++ * Caller should free the returned value ++ */ ++static char * ++get_li_directory(const char *fname) ++{ ++ /* ++ * li_directory is an existing directory. ++ * it can be fname or its parent or its greatparent ++ * in case of problem returns the provided name ++ */ ++ char *lid = slapi_ch_strdup(fname); ++ struct stat sbuf = {0}; ++ char *pt = NULL; ++ for (int count=0; count<3; count++) { ++ if (stat(lid, &sbuf) == 0) { ++ if (S_ISDIR(sbuf.st_mode)) { ++ return lid; ++ } ++ /* Non directory existing file could be regular ++ * at the first iteration otherwise it is an error. ++ */ ++ if (count>0 || !S_ISREG(sbuf.st_mode)) { ++ break; ++ } ++ } ++ pt = strrchr(lid, '/'); ++ if (pt == NULL) { ++ slapi_ch_free_string(&lid); ++ return slapi_ch_strdup("."); ++ } ++ *pt = '\0'; ++ } ++ /* ++ * Error case. Returns a copy of the original string: ++ * and let dblayer_private_open_fn fail to open the database ++ */ ++ slapi_ch_free_string(&lid); ++ return slapi_ch_strdup(fname); ++} ++ ++/* Open db env, db and db file privately (for dbscan) */ + int dblayer_private_open(const char *plgname, const char *dbfilename, int rw, Slapi_Backend **be, dbi_env_t **env, dbi_db_t **db) + { + struct ldbminfo *li; +@@ -412,7 +453,7 @@ int dblayer_private_open(const char *plgname, const char *dbfilename, int rw, Sl + li->li_plugin = (*be)->be_database; + li->li_plugin->plg_name = (char*) "back-ldbm-dbimpl"; + li->li_plugin->plg_libpath = (char*) "libback-ldbm"; +- li->li_directory = slapi_ch_strdup(dbfilename); ++ li->li_directory = get_li_directory(dbfilename); + + /* Initialize database plugin */ + rc = dbimpl_setup(li, plgname); +@@ -439,7 +480,10 @@ int dblayer_private_close(Slapi_Backend **be, dbi_env_t **env, dbi_db_t **db) + } + slapi_ch_free((void**)&li->li_dblayer_private); + slapi_ch_free((void**)&li->li_dblayer_config); +- ldbm_config_destroy(li); ++ if (dblayer_is_lmdb(*be)) { ++ /* Generate use after free and double free in bdb case */ ++ ldbm_config_destroy(li); ++ } + slapi_ch_free((void**)&(*be)->be_database); + slapi_ch_free((void**)&(*be)->be_instance_info); + slapi_ch_free((void**)be); +diff --git a/ldap/servers/slapd/tools/dbscan.c b/ldap/servers/slapd/tools/dbscan.c +index 2d28dd951..12edf7c5b 100644 +--- a/ldap/servers/slapd/tools/dbscan.c ++++ b/ldap/servers/slapd/tools/dbscan.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + #include "../back-ldbm/dbimpl.h" + #include "../slapi-plugin.h" + #include "nspr.h" +@@ -85,6 +86,8 @@ + #define DB_BUFFER_SMALL ENOMEM + #endif + ++#define COUNTOF(array) ((sizeof(array))/sizeof(*(array))) ++ + #if defined(linux) + #include + #endif +@@ -130,9 +133,43 @@ long ind_cnt = 0; + long allids_cnt = 0; + long other_cnt = 0; + char *dump_filename = NULL; ++int do_it = 0; + + static Slapi_Backend *be = NULL; /* Pseudo backend used to interact with db */ + ++/* For Long options without shortcuts */ ++enum { ++ OPT_FIRST = 0x1000, ++ OPT_DO_IT, ++ OPT_REMOVE, ++}; ++ ++static const struct option options[] = { ++ /* Options without shortcut */ ++ { "do-it", no_argument, 0, OPT_DO_IT }, ++ { "remove", no_argument, 0, OPT_REMOVE }, ++ /* Options with shortcut */ ++ { "import", required_argument, 0, 'I' }, ++ { "export", required_argument, 0, 'X' }, ++ { "db-type", required_argument, 0, 'D' }, ++ { "dbi", required_argument, 0, 'f' }, ++ { "ascii", no_argument, 0, 'A' }, ++ { "raw", no_argument, 0, 'R' }, ++ { "truncate-entry", required_argument, 0, 't' }, ++ { "entry-id", required_argument, 0, 'K' }, ++ { "key", required_argument, 0, 'k' }, ++ { "list", required_argument, 0, 'L' }, ++ { "stats", required_argument, 0, 'S' }, ++ { "id-list-max-size", required_argument, 0, 'l' }, ++ { "id-list-min-size", required_argument, 0, 'G' }, ++ { "show-id-list-lenghts", no_argument, 0, 'n' }, ++ { "show-id-list", no_argument, 0, 'r' }, ++ { "summary", no_argument, 0, 's' }, ++ { "help", no_argument, 0, 'h' }, ++ { 0, 0, 0, 0 } ++}; ++ ++ + /** db_printf - functioning same as printf but a place for manipluating output. + */ + void +@@ -899,7 +936,7 @@ is_changelog(char *filename) + } + + static void +-usage(char *argv0) ++usage(char *argv0, int error) + { + char *copy = strdup(argv0); + char *p0 = NULL, *p1 = NULL; +@@ -922,42 +959,52 @@ usage(char *argv0) + } + printf("\n%s - scan a db file and dump the contents\n", p0); + printf(" common options:\n"); +- printf(" -D specify db implementaion (may be: bdb or mdb)\n"); +- printf(" -f specify db file\n"); +- printf(" -A dump as ascii data\n"); +- printf(" -R dump as raw data\n"); +- printf(" -t entry truncate size (bytes)\n"); ++ printf(" -A, --ascii dump as ascii data\n"); ++ printf(" -D, --db-type specify db implementaion (may be: bdb or mdb)\n"); ++ printf(" -f, --dbi specify db instance\n"); ++ printf(" -R, --raw dump as raw data\n"); ++ printf(" -t, --truncate-entry entry truncate size (bytes)\n"); ++ + printf(" entry file options:\n"); +- printf(" -K lookup only a specific entry id\n"); ++ printf(" -K, --entry-id lookup only a specific entry id\n"); ++ + printf(" index file options:\n"); +- printf(" -k lookup only a specific key\n"); +- printf(" -L list all db files\n"); +- printf(" -S show statistics\n"); +- printf(" -l max length of dumped id list\n"); +- printf(" (default %" PRIu32 "; 40 bytes <= size <= 1048576 bytes)\n", MAX_BUFFER); +- printf(" -G only display index entries with more than ids\n"); +- printf(" -n display ID list lengths\n"); +- printf(" -r display the conents of ID list\n"); +- printf(" -s Summary of index counts\n"); +- printf(" -I file Import database content from file\n"); +- printf(" -X file Export database content in file\n"); ++ printf(" -G, --id-list-min-size only display index entries with more than ids\n"); ++ printf(" -I, --import file Import database instance from file.\n"); ++ printf(" -k, --key lookup only a specific key\n"); ++ printf(" -l, --id-list-max-size max length of dumped id list\n"); ++ printf(" (default %" PRIu32 "; 40 bytes <= size <= 1048576 bytes)\n", MAX_BUFFER); ++ printf(" -n, --show-id-list-lenghts display ID list lengths\n"); ++ printf(" --remove remove database instance\n"); ++ printf(" -r, --show-id-list display the conents of ID list\n"); ++ printf(" -S, --stats show statistics\n"); ++ printf(" -X, --export file export database instance in file\n"); ++ ++ printf(" other options:\n"); ++ printf(" -s, --summary summary of index counts\n"); ++ printf(" -L, --list list all db files\n"); ++ printf(" --do-it confirmation flags for destructive actions like --remove or --import\n"); ++ printf(" -h, --help display this usage\n"); ++ + printf(" sample usages:\n"); +- printf(" # list the db files\n"); +- printf(" %s -D mdb -L /var/lib/dirsrv/slapd-i/db/\n", p0); +- printf(" %s -f id2entry.db\n", p0); ++ printf(" # list the database instances\n"); ++ printf(" %s -L /var/lib/dirsrv/slapd-supplier1/db/\n", p0); + printf(" # dump the entry file\n"); + printf(" %s -f id2entry.db\n", p0); + printf(" # display index keys in cn.db4\n"); + printf(" %s -f cn.db4\n", p0); ++ printf(" # display index keys in cn on lmdb\n"); ++ printf(" %s -f /var/lib/dirsrv/slapd-supplier1/db/userroot/cn.db\n", p0); ++ printf(" (Note: Use 'dbscan -L db_home_dir' to get the db instance path)\n"); + printf(" # display index keys and the count of entries having the key in mail.db4\n"); + printf(" %s -r -f mail.db4\n", p0); + printf(" # display index keys and the IDs having more than 20 IDs in sn.db4\n"); + printf(" %s -r -G 20 -f sn.db4\n", p0); + printf(" # display summary of objectclass.db4\n"); +- printf(" %s -f objectclass.db4\n", p0); ++ printf(" %s -s -f objectclass.db4\n", p0); + printf("\n"); + free(copy); +- exit(1); ++ exit(error?1:0); + } + + void dump_ascii_val(const char *str, dbi_val_t *val) +@@ -1126,13 +1173,12 @@ importdb(const char *dbimpl_name, const char *filename, const char *dump_name) + dblayer_init_pvt_txn(); + + if (!dump) { +- printf("Failed to open dump file %s. Error %d: %s\n", dump_name, errno, strerror(errno)); +- fclose(dump); ++ printf("Error: Failed to open dump file %s. Error %d: %s\n", dump_name, errno, strerror(errno)); + return 1; + } + + if (dblayer_private_open(dbimpl_name, filename, 1, &be, &env, &db)) { +- printf("Can't initialize db plugin: %s\n", dbimpl_name); ++ printf("Error: Can't initialize db plugin: %s\n", dbimpl_name); + fclose(dump); + return 1; + } +@@ -1142,11 +1188,16 @@ importdb(const char *dbimpl_name, const char *filename, const char *dump_name) + !_read_line(dump, &keyword, &data) && keyword == 'v') { + ret = dblayer_db_op(be, db, txn.txn, DBI_OP_PUT, &key, &data); + } ++ if (ret !=0) { ++ printf("Error: failed to write record in database. Error %d: %s\n", ret, dblayer_strerror(ret)); ++ dump_ascii_val("Failing record key", &key); ++ dump_ascii_val("Failing record value", &data); ++ } + fclose(dump); + dblayer_value_free(be, &key); + dblayer_value_free(be, &data); + if (dblayer_private_close(&be, &env, &db)) { +- printf("Unable to shutdown the db plugin: %s\n", dblayer_strerror(1)); ++ printf("Error: Unable to shutdown the db plugin: %s\n", dblayer_strerror(1)); + return 1; + } + return ret; +@@ -1243,6 +1294,7 @@ removedb(const char *dbimpl_name, const char *filename) + return 1; + } + ++ db = NULL; /* Database is already closed by dblayer_db_remove */ + if (dblayer_private_close(&be, &env, &db)) { + printf("Unable to shutdown the db plugin: %s\n", dblayer_strerror(1)); + return 1; +@@ -1250,7 +1302,6 @@ removedb(const char *dbimpl_name, const char *filename) + return 0; + } + +- + int + main(int argc, char **argv) + { +@@ -1262,11 +1313,46 @@ main(int argc, char **argv) + int ret = 0; + char *find_key = NULL; + uint32_t entry_id = 0xffffffff; +- char *dbimpl_name = (char*) "bdb"; +- int c; ++ char *defdbimpl = getenv("NSSLAPD_DB_LIB"); ++ char *dbimpl_name = (char*) "mdb"; ++ int longopt_idx = 0; ++ int c = 0; ++ char optstring[2*COUNTOF(options)+1] = {0}; ++ ++ if (defdbimpl) { ++ if (strcasecmp(defdbimpl, "bdb") == 0) { ++ dbimpl_name = (char*) "bdb"; ++ } ++ if (strcasecmp(defdbimpl, "mdb") == 0) { ++ dbimpl_name = (char*) "mdb"; ++ } ++ } ++ ++ /* Compute getopt short option string */ ++ { ++ char *pt = optstring; ++ for (const struct option *opt = options; opt->name; opt++) { ++ if (opt->val>0 && opt->valval); ++ if (opt->has_arg == required_argument) { ++ *pt++ = ':'; ++ } ++ } ++ } ++ *pt = '\0'; ++ } + +- while ((c = getopt(argc, argv, "Af:RL:S:l:nG:srk:K:hvt:D:X:I:d")) != EOF) { ++ while ((c = getopt_long(argc, argv, optstring, options, &longopt_idx)) != EOF) { ++ if (c == 0) { ++ c = longopt_idx; ++ } + switch (c) { ++ case OPT_DO_IT: ++ do_it = 1; ++ break; ++ case OPT_REMOVE: ++ display_mode |= REMOVE; ++ break; + case 'A': + display_mode |= ASCIIDATA; + break; +@@ -1332,32 +1418,48 @@ main(int argc, char **argv) + display_mode |= IMPORT; + dump_filename = optarg; + break; +- case 'd': +- display_mode |= REMOVE; +- break; + case 'h': + default: +- usage(argv[0]); ++ usage(argv[0], 1); + } + } + ++ if (filename == NULL) { ++ fprintf(stderr, "PARAMETER ERROR! 'filename' parameter is missing.\n"); ++ usage(argv[0], 1); ++ } ++ + if (display_mode & EXPORT) { + return exportdb(dbimpl_name, filename, dump_filename); + } + + if (display_mode & IMPORT) { ++ if (!strstr(filename, "/id2entry") && !strstr(filename, "/replication_changelog")) { ++ /* schema is unknown in dbscan ==> duplicate keys sort order is unknown ++ * ==> cannot create dbi with duplicate keys ++ * ==> only id2entry and repl changelog is importable. ++ */ ++ fprintf(stderr, "ERROR: The only database instances that may be imported with dbscan are id2entry and replication_changelog.\n"); ++ exit(1); ++ } ++ ++ if (do_it == 0) { ++ fprintf(stderr, "PARAMETER ERROR! Trying to perform a destructive action (import)\n" ++ " without specifying '--do-it' parameter.\n"); ++ exit(1); ++ } + return importdb(dbimpl_name, filename, dump_filename); + } + + if (display_mode & REMOVE) { ++ if (do_it == 0) { ++ fprintf(stderr, "PARAMETER ERROR! Trying to perform a destructive action (remove)\n" ++ " without specifying '--do-it' parameter.\n"); ++ exit(1); ++ } + return removedb(dbimpl_name, filename); + } + +- if (filename == NULL) { +- fprintf(stderr, "PARAMETER ERROR! 'filename' parameter is missing.\n"); +- usage(argv[0]); +- } +- + if (display_mode & LISTDBS) { + dbi_dbslist_t *dbs = dblayer_list_dbs(dbimpl_name, filename); + if (dbs) { +diff --git a/man/man1/dbscan.1 b/man/man1/dbscan.1 +index 810608371..dfb6e8351 100644 +--- a/man/man1/dbscan.1 ++++ b/man/man1/dbscan.1 +@@ -31,50 +31,94 @@ Scans a Directory Server database index file and dumps the contents. + .\" respectively. + .SH OPTIONS + A summary of options is included below: ++.IP ++common options: ++.TP ++.B \fB\-A, \-\-ascii\fR ++dump as ascii data ++.TP ++.B \fB\-D, \-\-db\-type\fR ++specify db type: bdb or mdb + .TP +-.B \fB\-f\fR +-specify db file ++.B \fB\-f, \-\-dbi\fR ++specify db instance + .TP +-.B \fB\-R\fR ++.B \fB\-R, \-\-raw\fR + dump as raw data + .TP +-.B \fB\-t\fR ++.B \fB\-t, \-\-truncate\-entry\fR + entry truncate size (bytes) + .IP + entry file options: + .TP +-.B \fB\-K\fR ++.B \fB\-K, \-\-entry\-id\fR + lookup only a specific entry id ++.IP + index file options: + .TP +-.B \fB\-k\fR ++.B \fB\-G, \-\-id\-list\-min\-size\fR ++only display index entries with more than ids ++.TP ++.B \fB\-I, \-\-import\fR ++Import database instance from file. Requires \-\-do\-it parameter ++WARNING! Only the id2entry and replication_changelog database instances ++may be imported by dbscan. ++.TP ++.B \fB\-k, \-\-key\fR + lookup only a specific key + .TP +-.B \fB\-l\fR ++.B \fB\-l, \-\-id\-list\-max\-size\fR + max length of dumped id list + (default 4096; 40 bytes <= size <= 1048576 bytes) + .TP +-.B \fB\-G\fR +-only display index entries with more than ids +-.TP +-.B \fB\-n\fR ++.B \fB\-n, \-\-show\-id\-list\-lenghts\fR + display ID list lengths + .TP +-.B \fB\-r\fR ++.B \fB\-\-remove\fR ++remove a db instance. Requires \-\-do\-it parameter ++.TP ++.B \fB\-r, \-\-show\-id\-list\fR + display the contents of ID list + .TP +-.B \fB\-s\fR ++.B \fB\-S, \-\-stats\fR ++display statistics ++.TP ++.B \fB\-X, \-\-export\fR ++Export database instance to file ++.IP ++other options: ++.TP ++.B \fB\-s, \-\-summary\fR + Summary of index counts ++.TP ++.B \fB\-L, \-\-list\fR ++List od database instances ++.TP ++.B \fB\-\-do\-it\fR ++confirmation required for actions that change the database contents ++.TP ++.B \fB\-h, \-\-help\-it\fR ++display the usage + .IP + .SH USAGE + Sample usages: + .TP ++List the database instances ++.B ++dbscan -L /var/lib/dirsrv/slapd-supplier1/db ++.TP + Dump the entry file: + .B + dbscan \fB\-f\fR id2entry.db4 + .TP + Display index keys in cn.db4: +-.B dbscan \fB\-f\fR cn.db4 ++.B ++dbscan \fB\-f\fR cn.db4 ++.TP ++Display index keys in cn on lmdb: ++.B ++dbscan \fB\-f\fR /var/lib/dirsrv/slapd\-supplier1/db/userroot/cn.db ++ (Note: Use \fBdbscan \-L db_home_dir\R to get the db instance path) + .TP + Display index keys and the count of entries having the key in mail.db4: + .B +@@ -86,7 +130,7 @@ dbscan \fB\-r\fR \fB\-G\fR 20 \fB\-f\fR sn.db4 + .TP + Display summary of objectclass.db4: + .B +-dbscan \fB\-f\fR objectclass.db4 ++dbscan \fB\-s \-f\fR objectclass.db4 + .br + .SH AUTHOR + dbscan was written by the 389 Project. +diff --git a/src/lib389/lib389/__init__.py b/src/lib389/lib389/__init__.py +index e87582d9e..368741a66 100644 +--- a/src/lib389/lib389/__init__.py ++++ b/src/lib389/lib389/__init__.py +@@ -3039,14 +3039,17 @@ class DirSrv(SimpleLDAPObject, object): + return self._dbisupport + # check if -D and -L options are supported + try: +- cmd = ["%s/dbscan" % self.get_bin_dir(), "--help"] ++ cmd = ["%s/dbscan" % self.get_bin_dir(), "-h"] + self.log.debug("DEBUG: checking dbscan supported options %s" % cmd) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE) + except subprocess.CalledProcessError: + pass + output, stderr = p.communicate() +- self.log.debug("is_dbi_supported output " + output.decode()) +- if "-D " in output.decode() and "-L " in output.decode(): ++ output = output.decode() ++ self.log.debug("is_dbi_supported output " + output) ++ if "-D " in output and "-L " in output: ++ self._dbisupport = True ++ elif "--db-type" in output and "--list" in output: + self._dbisupport = True + else: + self._dbisupport = False +diff --git a/src/lib389/lib389/cli_ctl/dblib.py b/src/lib389/lib389/cli_ctl/dblib.py +index e9269e340..82f09c70c 100644 +--- a/src/lib389/lib389/cli_ctl/dblib.py ++++ b/src/lib389/lib389/cli_ctl/dblib.py +@@ -158,6 +158,14 @@ def run_dbscan(args): + return output + + ++def does_dbscan_need_do_it(): ++ prefix = os.environ.get('PREFIX', "") ++ prog = f'{prefix}/bin/dbscan' ++ args = [ prog, '-h' ] ++ output = subprocess.run(args, encoding='utf-8', stdout=subprocess.PIPE, stderr=subprocess.STDOUT) ++ return '--do-it' in output.stdout ++ ++ + def export_changelog(be, dblib): + # Export backend changelog + try: +@@ -172,7 +180,10 @@ def import_changelog(be, dblib): + # import backend changelog + try: + cl5dbname = be['eccl5dbname'] if dblib == "bdb" else be['cl5dbname'] +- run_dbscan(['-D', dblib, '-f', cl5dbname, '-I', be['cl5name']]) ++ if does_dbscan_need_do_it(): ++ run_dbscan(['-D', dblib, '-f', cl5dbname, '-I', be['cl5name'], '--do-it']) ++ else: ++ run_dbscan(['-D', dblib, '-f', cl5dbname, '-I', be['cl5name']]) + return True + except subprocess.CalledProcessError as e: + return False +-- +2.48.0 + diff --git a/SOURCES/0004-Issue-6307-Wrong-set-of-entries-returned-for-some-se.patch b/SOURCES/0004-Issue-6307-Wrong-set-of-entries-returned-for-some-se.patch deleted file mode 100644 index 3a4a55f..0000000 --- a/SOURCES/0004-Issue-6307-Wrong-set-of-entries-returned-for-some-se.patch +++ /dev/null @@ -1,217 +0,0 @@ -From 58efd22cdefed368c97ef235f2abb66ac4aec234 Mon Sep 17 00:00:00 2001 -From: tbordaz -Date: Thu, 5 Sep 2024 10:19:59 +0200 -Subject: [PATCH] Issue 6307 - Wrong set of entries returned for some search - filters (#6308) - -Bug description: - When the server returns an entry to a search it - checks both access and matching of the filter. - When evaluating a '!' (NOT) logical expression the server, - in a first phase evaluates ONLY the right to access the - related component (and its subcomponents). - Then in a second phase verifies the matching. - If the related component is a OR, in the first phase it - evaluates access AND matching, this even if the call was - to evaluate only access. - This result in incoherent results. - -Fix description: - Make sure that when the function vattr_test_filter_list_or - is called to only check access, it does not evaluate the matching. - -fixes: #6307 - -Reviewed by: Pierre Rogier (Thanks !!) ---- - .../tests/suites/filter/filter_test.py | 116 ++++++++++++++++++ - ldap/servers/slapd/filterentry.c | 11 ++ - 2 files changed, 127 insertions(+) - -diff --git a/dirsrvtests/tests/suites/filter/filter_test.py b/dirsrvtests/tests/suites/filter/filter_test.py -index b17846c01..e1d02f133 100644 ---- a/dirsrvtests/tests/suites/filter/filter_test.py -+++ b/dirsrvtests/tests/suites/filter/filter_test.py -@@ -10,12 +10,14 @@ import logging - - import pytest - import time -+from ldap import SCOPE_SUBTREE - from lib389.dirsrv_log import DirsrvAccessLog - from lib389.tasks import * - from lib389.backend import Backends, Backend - from lib389.dbgen import dbgen_users, dbgen_groups - from lib389.topologies import topology_st - from lib389._constants import PASSWORD, DEFAULT_SUFFIX, DN_DM, SUFFIX, DN_CONFIG_LDBM -+from lib389.idm.user import UserAccount, UserAccounts - from lib389.utils import * - - pytestmark = pytest.mark.tier1 -@@ -432,6 +434,120 @@ def test_match_large_valueset(topology_st): - assert len(entries) == groups_number - assert (etime < 5) - -+def test_filter_not_operator(topology_st, request): -+ """Test ldapsearch with scope one gives only single entry -+ -+ :id: b3711e02-7e76-444d-82f3-495c6dadd97f -+ :setup: Standalone instance -+ :steps: -+ 1. Creating user1..user9 -+ 2. Adding specific 'telephonenumber' to the users -+ 3. Check returned set (5 users) with the first filter -+ 4. Check returned set (4 users) with the second filter -+ :expectedresults: -+ 1. This should pass -+ 2. This should pass -+ 3. This should pass -+ 4. This should pass -+ """ -+ -+ topology_st.standalone.start() -+ # Creating Users -+ log.info('Create users from user1 to user9') -+ users = UserAccounts(topology_st.standalone, "ou=people,%s" % DEFAULT_SUFFIX, rdn=None) -+ -+ for user in ['user1', -+ 'user2', -+ 'user3', -+ 'user4', -+ 'user5', -+ 'user6', -+ 'user7', -+ 'user8', -+ 'user9']: -+ users.create(properties={ -+ 'mail': f'{user}@redhat.com', -+ 'uid': user, -+ 'givenName': user.title(), -+ 'cn': f'bit {user}', -+ 'sn': user.title(), -+ 'manager': f'uid={user},{SUFFIX}', -+ 'userpassword': PW_DM, -+ 'homeDirectory': '/home/' + user, -+ 'uidNumber': '1000', -+ 'gidNumber': '2000', -+ }) -+ # Adding specific values to the users -+ log.info('Adding telephonenumber values') -+ user = UserAccount(topology_st.standalone, 'uid=user1, ou=people, %s' % DEFAULT_SUFFIX) -+ user.add('telephonenumber', ['1234', '2345']) -+ -+ user = UserAccount(topology_st.standalone, 'uid=user2, ou=people, %s' % DEFAULT_SUFFIX) -+ user.add('telephonenumber', ['1234', '4567']) -+ -+ user = UserAccount(topology_st.standalone, 'uid=user3, ou=people, %s' % DEFAULT_SUFFIX) -+ user.add('telephonenumber', ['1234', '4567']) -+ -+ user = UserAccount(topology_st.standalone, 'uid=user4, ou=people, %s' % DEFAULT_SUFFIX) -+ user.add('telephonenumber', ['1234']) -+ -+ user = UserAccount(topology_st.standalone, 'uid=user5, ou=people, %s' % DEFAULT_SUFFIX) -+ user.add('telephonenumber', ['2345']) -+ -+ user = UserAccount(topology_st.standalone, 'uid=user6, ou=people, %s' % DEFAULT_SUFFIX) -+ user.add('telephonenumber', ['3456']) -+ -+ user = UserAccount(topology_st.standalone, 'uid=user7, ou=people, %s' % DEFAULT_SUFFIX) -+ user.add('telephonenumber', ['4567']) -+ -+ user = UserAccount(topology_st.standalone, 'uid=user8, ou=people, %s' % DEFAULT_SUFFIX) -+ user.add('telephonenumber', ['1234']) -+ -+ user = UserAccount(topology_st.standalone, 'uid=user9, ou=people, %s' % DEFAULT_SUFFIX) -+ user.add('telephonenumber', ['1234', '4567']) -+ -+ # Do a first test of filter containing a NOT -+ # and check the expected values are retrieved -+ log.info('Search with filter containing NOT') -+ log.info('expect user2, user3, user6, user8 and user9') -+ filter1 = "(|(telephoneNumber=3456)(&(telephoneNumber=1234)(!(|(uid=user1)(uid=user4)))))" -+ entries = topology_st.standalone.search_s(DEFAULT_SUFFIX, SCOPE_SUBTREE, filter1) -+ uids = [] -+ for entry in entries: -+ assert entry.hasAttr('uid') -+ uids.append(entry.getValue('uid')) -+ -+ assert len(uids) == 5 -+ for uid in [b'user2', b'user3', b'user6', b'user8', b'user9']: -+ assert uid in uids -+ -+ # Do a second test of filter containing a NOT -+ # and check the expected values are retrieved -+ log.info('Search with a second filter containing NOT') -+ log.info('expect user2, user3, user8 and user9') -+ filter1 = "(|(&(telephoneNumber=1234)(!(|(uid=user1)(uid=user4)))))" -+ entries = topology_st.standalone.search_s(DEFAULT_SUFFIX, SCOPE_SUBTREE, filter1) -+ uids = [] -+ for entry in entries: -+ assert entry.hasAttr('uid') -+ uids.append(entry.getValue('uid')) -+ -+ assert len(uids) == 4 -+ for uid in [b'user2', b'user3', b'user8', b'user9']: -+ assert uid in uids -+ -+ def fin(): -+ """ -+ Deletes entries after the test. -+ """ -+ for user in users.list(): -+ pass -+ user.delete() -+ -+ -+ request.addfinalizer(fin) -+ -+ - if __name__ == '__main__': - # Run isolated - # -s for DEBUG mode -diff --git a/ldap/servers/slapd/filterentry.c b/ldap/servers/slapd/filterentry.c -index d2c7e3082..f5604161d 100644 ---- a/ldap/servers/slapd/filterentry.c -+++ b/ldap/servers/slapd/filterentry.c -@@ -948,14 +948,17 @@ slapi_vattr_filter_test_ext_internal( - break; - - case LDAP_FILTER_NOT: -+ slapi_log_err(SLAPI_LOG_FILTER, "vattr_test_filter_list_NOT", "=>\n"); - rc = slapi_vattr_filter_test_ext_internal(pb, e, f->f_not, verify_access, only_check_access, access_check_done); - if (verify_access && only_check_access) { - /* dont play with access control return codes - * do not negate return code */ -+ slapi_log_err(SLAPI_LOG_FILTER, "vattr_test_filter_list_NOT only check access", "<= %d\n", rc); - break; - } - if (rc > 0) { - /* an error occurred or access denied, don't negate */ -+ slapi_log_err(SLAPI_LOG_FILTER, "vattr_test_filter_list_NOT slapi_vattr_filter_test_ext_internal fails", "<= %d\n", rc); - break; - } - if (verify_access) { -@@ -980,6 +983,7 @@ slapi_vattr_filter_test_ext_internal( - /* filter verification only, no error */ - rc = (rc == 0) ? -1 : 0; - } -+ slapi_log_err(SLAPI_LOG_FILTER, "vattr_test_filter_list_NOT", "<= %d\n", rc); - break; - - default: -@@ -1084,6 +1088,13 @@ vattr_test_filter_list_or( - continue; - } - } -+ /* we are not evaluating if the entry matches -+ * but only that we have access to ALL components -+ * so check the next one -+ */ -+ if (only_check_access) { -+ continue; -+ } - /* now check if filter matches */ - /* - * We can NOT skip this because we need to know if the item we matched on --- -2.47.1 - diff --git a/SOURCES/0005-Issue-6381-CleanAllRUV-move-changelog-purging-to-the.patch b/SOURCES/0005-Issue-6381-CleanAllRUV-move-changelog-purging-to-the.patch deleted file mode 100644 index d98ac81..0000000 --- a/SOURCES/0005-Issue-6381-CleanAllRUV-move-changelog-purging-to-the.patch +++ /dev/null @@ -1,254 +0,0 @@ -From cd13c0e33d2f5c63e50af90c6841f6104c4dcdb9 Mon Sep 17 00:00:00 2001 -From: Mark Reynolds -Date: Thu, 24 Oct 2024 19:18:03 -0400 -Subject: [PATCH] Issue 6381 - CleanAllRUV - move changelog purging to the very - end of the task - -Description: - -There are deadlock situations that can occur when cleanAllRUV is removing the -clean task attribute (nsds5ReplicaCleanRUV) from the replica config, while -the change log purging is occurring. Instead do the the changelog purge after -everything else is done and have the changelog purging code remove the rid -from the cleaned list once it finishes. - -Also improved the task logging. - -Fixes: https://github.com/389ds/389-ds-base/issues/6381 - -Reviewed by: progier389(Thanks!) ---- - ldap/servers/plugins/replication/cl5_api.c | 55 +++++++++++-------- - ldap/servers/plugins/replication/repl5.h | 2 +- - .../plugins/replication/repl_cleanallruv.c | 43 ++++++++------- - 3 files changed, 57 insertions(+), 43 deletions(-) - -diff --git a/ldap/servers/plugins/replication/cl5_api.c b/ldap/servers/plugins/replication/cl5_api.c -index 413e78a30..a944d3b29 100644 ---- a/ldap/servers/plugins/replication/cl5_api.c -+++ b/ldap/servers/plugins/replication/cl5_api.c -@@ -246,7 +246,7 @@ static int _cl5CheckMissingCSN(const CSN *minCsn, const RUV *supplierRUV, cldb_H - static int cldb_IsTrimmingEnabled(cldb_Handle *cldb); - static int _cl5TrimMain(void *param); - void _cl5TrimReplica(Replica *r); --void _cl5PurgeRID(cldb_Handle *cldb, ReplicaId cleaned_rid); -+void _cl5PurgeRID(cleanruv_purge_data *data, cldb_Handle *cldb); - static PRBool _cl5CanTrim(time_t time, long *numToTrim, Replica *replica, CL5Config *dbTrim); - int _cl5ConstructRUVs (cldb_Handle *cldb); - int _cl5ReadRUVs(cldb_Handle *cldb); -@@ -984,7 +984,7 @@ cl5CreateReplayIteratorEx(Private_Repl_Protocol *prp, const RUV *consumerRuv, CL - pthread_mutex_unlock(&(cldb->stLock)); - - /* iterate through the ruv in csn order to find first supplier for which -- we can replay changes */ -+ we can replay changes */ - rc = _cl5PositionCursorForReplay (consumerRID, consumerRuv, replica, iterator, NULL); - - if (rc != CL5_SUCCESS) { -@@ -1874,8 +1874,8 @@ _cl5Iterate(cldb_Handle *cldb, dbi_iterate_cb_t *action_cb, DBLCI_CTX *dblcictx, - continue; - } - } else { -- /* read-only opertion on bdb are transactionless, so no reason to abort txn -- * after having seen some number of records -+ /* read-only opertion on bdb are transactionless, so no reason to abort txn -+ * after having seen some number of records - */ - dblcictx->seen.nbmax = 0; - } -@@ -2552,21 +2552,19 @@ _cl5TrimMain(void *param) - static void - _cl5DoPurging(cleanruv_purge_data *purge_data) - { -- ReplicaId rid = purge_data->cleaned_rid; -- const Slapi_DN *suffix_sdn = purge_data->suffix_sdn; - cldb_Handle *cldb = replica_get_cl_info(purge_data->replica); -- - if (cldb == NULL) { - slapi_log_err(SLAPI_LOG_ERR, repl_plugin_name_cl, - "_cl5DoPurging - Changelog info was NULL - is your replication configuration valid?\n"); - return; - } -+ - pthread_mutex_lock(&(cldb->clLock)); -- _cl5PurgeRID (cldb, rid); -- slapi_log_err(SLAPI_LOG_REPL, repl_plugin_name_cl, -- "_cl5DoPurging - Purged rid (%d) from suffix (%s)\n", -- rid, slapi_sdn_get_dn(suffix_sdn)); -+ -+ _cl5PurgeRID(purge_data, cldb); -+ - pthread_mutex_unlock(&(cldb->clLock)); -+ - return; - } - -@@ -2653,7 +2651,7 @@ _cl5PurgeRidOnEntry(dbi_val_t *key, dbi_val_t *data, void *ctx) - } - - /* -- * _cl5PurgeRID(Object *obj, ReplicaId cleaned_rid) -+ * _cl5PurgeRID(cleanruv_purge_data, cleaned_rid) - * - * Clean the entire changelog of updates from the "cleaned rid" via CLEANALLRUV - * Delete entries in batches so we don't consume too many db locks, and we don't -@@ -2662,18 +2660,30 @@ _cl5PurgeRidOnEntry(dbi_val_t *key, dbi_val_t *data, void *ctx) - * beginning for each new iteration. - */ - void --_cl5PurgeRID(cldb_Handle *cldb, ReplicaId cleaned_rid) -+_cl5PurgeRID(cleanruv_purge_data *data, cldb_Handle *cldb) - { - DBLCI_CTX dblcictx = {0}; -+ int32_t rc = 0; - - dblcictx.seen.nbmax = CL5_PURGE_MAX_LOOKUP_PER_TRANSACTION; - dblcictx.changed.nbmax = CL5_PURGE_MAX_PER_TRANSACTION; -- dblcictx.rid2purge = cleaned_rid; -- _cl5Iterate(cldb, _cl5PurgeRidOnEntry, &dblcictx, PR_FALSE); -- -- slapi_log_err(SLAPI_LOG_REPL, repl_plugin_name_cl, -- "_cl5PurgeRID - Removed (%ld entries) that originated from rid (%d)\n", -- dblcictx.changed.tot, cleaned_rid); -+ dblcictx.rid2purge = data->cleaned_rid; -+ -+ rc = _cl5Iterate(cldb, _cl5PurgeRidOnEntry, &dblcictx, PR_FALSE); -+ if (rc != CL5_SUCCESS && rc != CL5_NOTFOUND) { -+ cleanruv_log(data->task, data->cleaned_rid, CLEANALLRUV_ID, -+ SLAPI_LOG_ERR, -+ "Purging failed to iterate through the entire changelog " -+ "(error %d). There is a chance the rid was not fully " -+ "removed, and you may have to run the cleanAllRUV task " -+ "again.", -+ rc); -+ } else { -+ cleanruv_log(data->task, data->cleaned_rid, CLEANALLRUV_ID, -+ SLAPI_LOG_INFO, -+ "Purged %ld records from the changelog", -+ dblcictx.changed.tot); -+ } - } - - /* -@@ -4459,11 +4469,10 @@ trigger_cl_purging_thread(void *arg) - /* Purge the changelog */ - _cl5DoPurging(purge_data); - -- slapi_counter_decrement(cldb->clThreads); -+ /* Remove the rid from the internal list */ -+ remove_cleaned_rid(purge_data->cleaned_rid); - -- slapi_log_err(SLAPI_LOG_REPL, repl_plugin_name_cl, -- "trigger_cl_purging_thread - purged changelog for (%s) rid (%d)\n", -- slapi_sdn_get_dn(purge_data->suffix_sdn), purge_data->cleaned_rid); -+ slapi_counter_decrement(cldb->clThreads); - - free_and_return: - pthread_mutex_unlock(&(cldb->stLock)); -diff --git a/ldap/servers/plugins/replication/repl5.h b/ldap/servers/plugins/replication/repl5.h -index f7fc74e82..45b42be0f 100644 ---- a/ldap/servers/plugins/replication/repl5.h -+++ b/ldap/servers/plugins/replication/repl5.h -@@ -830,8 +830,8 @@ typedef struct _cleanruv_data - typedef struct _cleanruv_purge_data - { - int cleaned_rid; -- const Slapi_DN *suffix_sdn; - Replica *replica; -+ Slapi_Task *task; - } cleanruv_purge_data; - - typedef struct _csngen_test_data -diff --git a/ldap/servers/plugins/replication/repl_cleanallruv.c b/ldap/servers/plugins/replication/repl_cleanallruv.c -index 42877add5..a985e691f 100644 ---- a/ldap/servers/plugins/replication/repl_cleanallruv.c -+++ b/ldap/servers/plugins/replication/repl_cleanallruv.c -@@ -1777,7 +1777,6 @@ replica_execute_cleanruv_task(Replica *replica, ReplicaId rid, char *returntext - { - Object *RUVObj; - RUV *local_ruv = NULL; -- cleanruv_purge_data *purge_data; - int rc = 0; - PR_ASSERT(replica); - -@@ -1794,10 +1793,14 @@ replica_execute_cleanruv_task(Replica *replica, ReplicaId rid, char *returntext - (ruv_replica_count(local_ruv) <= 1)) { - return LDAP_UNWILLING_TO_PERFORM; - } -- rc = ruv_delete_replica(local_ruv, rid); -- if (replica_write_ruv(replica)) { -+ if ((rc = ruv_delete_replica(local_ruv, rid))) { -+ slapi_log_err(SLAPI_LOG_ERR, repl_plugin_name, "cleanAllRUV_task - " -+ "Failed to remove rid from RUV (%d)\n", rc); -+ return LDAP_OPERATIONS_ERROR; -+ } -+ if ((rc = replica_write_ruv(replica))) { - slapi_log_err(SLAPI_LOG_REPL, repl_plugin_name, -- "cleanAllRUV_task - Could not write RUV\n"); -+ "cleanAllRUV_task - Could not write RUV (%d)\n", rc); - } - object_release(RUVObj); - -@@ -1809,19 +1812,6 @@ replica_execute_cleanruv_task(Replica *replica, ReplicaId rid, char *returntext - */ - cl5CleanRUV(rid, replica); - -- /* -- * Now purge the changelog. The purging thread will free the purge_data -- */ -- purge_data = (cleanruv_purge_data *)slapi_ch_calloc(1, sizeof(cleanruv_purge_data)); -- purge_data->cleaned_rid = rid; -- purge_data->suffix_sdn = replica_get_root(replica); -- purge_data->replica = replica; -- trigger_cl_purging(purge_data); -- -- if (rc != RUV_SUCCESS) { -- slapi_log_err(SLAPI_LOG_ERR, repl_plugin_name, "cleanAllRUV_task - Task failed(%d)\n", rc); -- return LDAP_OPERATIONS_ERROR; -- } - slapi_log_err(SLAPI_LOG_REPL, repl_plugin_name, "cleanAllRUV_task - Finished successfully\n"); - return LDAP_SUCCESS; - } -@@ -2097,6 +2087,7 @@ static void - replica_cleanallruv_thread(void *arg) - { - cleanruv_data *data = arg; -+ cleanruv_purge_data *purge_data = NULL; - Object *agmt_obj = NULL; - Object *ruv_obj = NULL; - Repl_Agmt *agmt = NULL; -@@ -2377,7 +2368,20 @@ done: - "Propagated task does not delete Keep alive entry (%d).", data->rid); - } - clean_agmts(data); -- remove_cleaned_rid(data->rid); -+ -+ /* -+ * Now purge the changelog. The purging thread will free the -+ * purge_data and update the cleaned rid list -+ */ -+ purge_data = (cleanruv_purge_data *)slapi_ch_calloc(1, sizeof(cleanruv_purge_data)); -+ purge_data->cleaned_rid = data->rid; -+ purge_data->replica = data->replica; -+ purge_data->task = data->task; -+ cleanruv_log(data->task, data->rid, CLEANALLRUV_ID, SLAPI_LOG_INFO, -+ "Triggering changelog purge thread. This might complete " -+ "after the cleaning task finishes."); -+ trigger_cl_purging(purge_data); -+ - cleanruv_log(data->task, data->rid, CLEANALLRUV_ID, SLAPI_LOG_INFO, - "Successfully cleaned rid(%d)", data->rid); - } else { -@@ -2436,7 +2440,8 @@ clean_agmts(cleanruv_data *data) - agmt_obj = agmtlist_get_next_agreement_for_replica(data->replica, agmt_obj); - continue; - } -- cleanruv_log(data->task, data->rid, CLEANALLRUV_ID, SLAPI_LOG_INFO, "Cleaning agmt..."); -+ cleanruv_log(data->task, data->rid, CLEANALLRUV_ID, SLAPI_LOG_INFO, -+ "Cleaning agmt (%s) ...", agmt_get_long_name(agmt)); - agmt_stop(agmt); - agmt_update_consumer_ruv(agmt); - agmt_start(agmt); --- -2.47.1 - diff --git a/SOURCES/0005-Issue-6566-RI-plugin-failure-to-handle-a-modrdn-for-.patch b/SOURCES/0005-Issue-6566-RI-plugin-failure-to-handle-a-modrdn-for-.patch new file mode 100644 index 0000000..8fea644 --- /dev/null +++ b/SOURCES/0005-Issue-6566-RI-plugin-failure-to-handle-a-modrdn-for-.patch @@ -0,0 +1,70 @@ +From de52853a3551f1d1876ea21b33a5242ad669fec1 Mon Sep 17 00:00:00 2001 +From: James Chapman +Date: Tue, 4 Feb 2025 15:40:16 +0000 +Subject: [PATCH] Issue 6566 - RI plugin failure to handle a modrdn for rename + of member of multiple groups (#6567) + +Bug description: +With AM and RI plugins enabled, the rename of a user that is part of multiple groups +fails with a "value exists" error. + +Fix description: +For a modrdn the RI plugin creates a new DN, before a modify is attempted check +if the new DN already exists in the attr being updated. + +Fixes: https://github.com/389ds/389-ds-base/issues/6566 + +Reviewed by: @progier389 , @tbordaz (Thank you) +--- + ldap/servers/plugins/referint/referint.c | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +diff --git a/ldap/servers/plugins/referint/referint.c b/ldap/servers/plugins/referint/referint.c +index 468fdc239..218863ea5 100644 +--- a/ldap/servers/plugins/referint/referint.c ++++ b/ldap/servers/plugins/referint/referint.c +@@ -924,6 +924,7 @@ _update_all_per_mod(Slapi_DN *entrySDN, /* DN of the searched entry */ + { + Slapi_Mods *smods = NULL; + char *newDN = NULL; ++ struct berval bv = {0}; + char **dnParts = NULL; + char *sval = NULL; + char *newvalue = NULL; +@@ -1026,22 +1027,30 @@ _update_all_per_mod(Slapi_DN *entrySDN, /* DN of the searched entry */ + } + /* else: normalize_rc < 0) Ignore the DN normalization error for now. */ + ++ bv.bv_val = newDN; ++ bv.bv_len = strlen(newDN); + p = PL_strstr(sval, slapi_sdn_get_ndn(origDN)); + if (p == sval) { + /* (case 1) */ + slapi_mods_add_string(smods, LDAP_MOD_DELETE, attrName, sval); +- slapi_mods_add_string(smods, LDAP_MOD_ADD, attrName, newDN); +- ++ /* Add only if the attr value does not exist */ ++ if (VALUE_PRESENT != attr_value_find_wsi(attr, &bv, &v)) { ++ slapi_mods_add_string(smods, LDAP_MOD_ADD, attrName, newDN); ++ } + } else if (p) { + /* (case 2) */ + slapi_mods_add_string(smods, LDAP_MOD_DELETE, attrName, sval); + *p = '\0'; + newvalue = slapi_ch_smprintf("%s%s", sval, newDN); +- slapi_mods_add_string(smods, LDAP_MOD_ADD, attrName, newvalue); ++ /* Add only if the attr value does not exist */ ++ if (VALUE_PRESENT != attr_value_find_wsi(attr, &bv, &v)) { ++ slapi_mods_add_string(smods, LDAP_MOD_ADD, attrName, newvalue); ++ } + slapi_ch_free_string(&newvalue); + } + /* else: value does not include the modified DN. Ignore it. */ + slapi_ch_free_string(&sval); ++ bv = (struct berval){0}; + } + rc = _do_modify(mod_pb, entrySDN, slapi_mods_get_ldapmods_byref(smods)); + if (rc) { +-- +2.48.0 + diff --git a/SOURCES/0006-Issue-6258-Mitigate-race-condition-in-paged_results_.patch b/SOURCES/0006-Issue-6258-Mitigate-race-condition-in-paged_results_.patch new file mode 100644 index 0000000..2f66c4f --- /dev/null +++ b/SOURCES/0006-Issue-6258-Mitigate-race-condition-in-paged_results_.patch @@ -0,0 +1,43 @@ +From a634756784056270773d67747061e26152d85469 Mon Sep 17 00:00:00 2001 +From: Masahiro Matsuya +Date: Wed, 5 Feb 2025 11:38:04 +0900 +Subject: [PATCH] Issue 6258 - Mitigate race condition in paged_results_test.py + (#6433) + +The regression test dirsrvtests/tests/suites/paged_results/paged_results_test.py::test_multi_suffix_search has a race condition causing it to fail due to multiple queries potentially writing their logs out of chronological order. + +This failure is mitigated by sorting the retrieved access_log_lines by their "op" value. This ensures the log lines are in chronological order, as expected by the assertions at the end of test_multi_suffix_search(). + +Helps fix: #6258 + +Reviewed by: @droideck , @progier389 (Thanks!) + +Co-authored-by: Anuar Beisembayev <111912342+abeisemb@users.noreply.github.com> +--- + dirsrvtests/tests/suites/paged_results/paged_results_test.py | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/dirsrvtests/tests/suites/paged_results/paged_results_test.py b/dirsrvtests/tests/suites/paged_results/paged_results_test.py +index eaf0e0da9..fca48db0f 100644 +--- a/dirsrvtests/tests/suites/paged_results/paged_results_test.py ++++ b/dirsrvtests/tests/suites/paged_results/paged_results_test.py +@@ -7,6 +7,7 @@ + # --- END COPYRIGHT BLOCK --- + # + import socket ++import re + from random import sample, randrange + + import pytest +@@ -1126,6 +1127,8 @@ def test_multi_suffix_search(topology_st, create_user, new_suffixes): + topology_st.standalone.restart(timeout=10) + + access_log_lines = topology_st.standalone.ds_access_log.match('.*pr_cookie=.*') ++ # Sort access_log_lines by op number to mitigate race condition effects. ++ access_log_lines.sort(key=lambda x: int(re.search(r"op=(\d+) RESULT", x).group(1))) + pr_cookie_list = ([line.rsplit('=', 1)[-1] for line in access_log_lines]) + pr_cookie_list = [int(pr_cookie) for pr_cookie in pr_cookie_list] + log.info('Assert that last pr_cookie == -1 and others pr_cookie == 0') +-- +2.48.0 + diff --git a/SOURCES/0006-Issue-6390-Adjust-cleanAllRUV-max-per-txn-and-interv.patch b/SOURCES/0006-Issue-6390-Adjust-cleanAllRUV-max-per-txn-and-interv.patch deleted file mode 100644 index 48bb397..0000000 --- a/SOURCES/0006-Issue-6390-Adjust-cleanAllRUV-max-per-txn-and-interv.patch +++ /dev/null @@ -1,460 +0,0 @@ -From 1ffc8c7c97b158e8cefd22bd0402aa0285b2baba Mon Sep 17 00:00:00 2001 -From: Mark Reynolds -Date: Thu, 31 Oct 2024 08:09:09 -0400 -Subject: [PATCH] Issue 6390 - Adjust cleanAllRUV max per txn and interval - limits - -The cleanAllRUV changelog purging and the "normal" changelog trimming are -using different limits. The cleanAllRUV "purging" holds the transaction 10 -times longer than the "trimming" does. When we use the same/smaller limits -the CPU still gets high but it's spread out and it should not block other -threads from running. - -Improved overall work flow of cleanAllRUV - changed changelog purging to -be a function and not a thread which simplifies other parts of the code. - -Also fixed typo in repl logs (issue 6369), and deadlock with lmdb during -purging (issue 6396) - -relates: https://github.com/389ds/389-ds-base/issues/6390 -fixes: https://github.com/389ds/389-ds-base/issues/6396 -fixes: https://github.com/389ds/389-ds-base/issues/6369 - -Reviewed by: jchapman & progier (Thanks!!) ---- - ldap/servers/plugins/replication/cl5_api.c | 127 ++++++++---------- - ldap/servers/plugins/replication/cl5_api.h | 41 +++--- - ldap/servers/plugins/replication/repl5.h | 8 +- - .../plugins/replication/repl5_protocol_util.c | 2 +- - .../plugins/replication/repl_cleanallruv.c | 30 ++--- - 5 files changed, 91 insertions(+), 117 deletions(-) - -diff --git a/ldap/servers/plugins/replication/cl5_api.c b/ldap/servers/plugins/replication/cl5_api.c -index a944d3b29..92fb776dc 100644 ---- a/ldap/servers/plugins/replication/cl5_api.c -+++ b/ldap/servers/plugins/replication/cl5_api.c -@@ -90,8 +90,6 @@ - #define MAX_RETRIES 10 /* Maximum number of retry in case of db retryable error */ - #define CL5_TRIM_MAX_PER_TRANSACTION 100 - #define CL5_TRIM_MAX_LOOKUP_PER_TRANSACTION 10000 --#define CL5_PURGE_MAX_PER_TRANSACTION 1000 --#define CL5_PURGE_MAX_LOOKUP_PER_TRANSACTION 10000 - - /***** Data Definitions *****/ - -@@ -246,14 +244,13 @@ static int _cl5CheckMissingCSN(const CSN *minCsn, const RUV *supplierRUV, cldb_H - static int cldb_IsTrimmingEnabled(cldb_Handle *cldb); - static int _cl5TrimMain(void *param); - void _cl5TrimReplica(Replica *r); --void _cl5PurgeRID(cleanruv_purge_data *data, cldb_Handle *cldb); -+int32_t _cl5PurgeRID(cleanruv_data *data, cldb_Handle *cldb); - static PRBool _cl5CanTrim(time_t time, long *numToTrim, Replica *replica, CL5Config *dbTrim); - int _cl5ConstructRUVs (cldb_Handle *cldb); - int _cl5ReadRUVs(cldb_Handle *cldb); - static int _cl5WriteRUV(cldb_Handle *cldb, PRBool purge); - static int _cl5UpdateRUV (cldb_Handle *cldb, CSN *csn, PRBool newReplica, PRBool purge); - static int _cl5GetRUV2Purge2(Replica *r, RUV **ruv); --void trigger_cl_purging_thread(void *rid); - - /* bakup/recovery, import/export */ - static int _cl5LDIF2Operation(char *ldifEntry, slapi_operation_parameters *op, char **replGen); -@@ -1844,9 +1841,13 @@ _cl5Iterate(cldb_Handle *cldb, dbi_iterate_cb_t *action_cb, DBLCI_CTX *dblcictx, - - dblcictx->finished = PR_FALSE; - dblcictx->cldb = cldb; -- while ( !slapi_is_shutting_down() && -- ((rc == CL5_SUCCESS && dblcictx->finished == PR_FALSE) || -- (rc == CL5_DB_RETRY && nbtries < MAX_RETRIES))) { -+ while ((rc == CL5_SUCCESS && dblcictx->finished == PR_FALSE) || -+ (rc == CL5_DB_RETRY && nbtries < MAX_RETRIES)) -+ { -+ if (slapi_is_shutting_down()) { -+ return CL5_SHUTDOWN; -+ } -+ - nbtries++; - dblcictx->changed.nb = 0; - dblcictx->seen.nb = 0; -@@ -2502,7 +2503,7 @@ _cl5TrimMain(void *param) - cldb->trimmingOnGoing = 1; - slapi_counter_increment(cldb->clThreads); - -- while (cldb->dbState == CL5_STATE_OPEN) -+ while (cldb->dbState == CL5_STATE_OPEN && !slapi_is_shutting_down()) - { - pthread_mutex_unlock(&(cldb->stLock)); - -@@ -2548,24 +2549,28 @@ _cl5TrimMain(void *param) - * We are purging a changelog after a cleanAllRUV task. Find the specific - * changelog for the backend that is being cleaned, and purge all the records - * with the cleaned rid. -+ * -+ * If we encounter a shutdown _cl5PurgeRID will return 1 - */ --static void --_cl5DoPurging(cleanruv_purge_data *purge_data) -+static int32_t -+_cl5DoPurging(cleanruv_data *purge_data) - { - cldb_Handle *cldb = replica_get_cl_info(purge_data->replica); -+ int32_t rc = 0; -+ - if (cldb == NULL) { - slapi_log_err(SLAPI_LOG_ERR, repl_plugin_name_cl, - "_cl5DoPurging - Changelog info was NULL - is your replication configuration valid?\n"); -- return; -+ return rc; - } - - pthread_mutex_lock(&(cldb->clLock)); - -- _cl5PurgeRID(purge_data, cldb); -+ rc = _cl5PurgeRID(purge_data, cldb); - - pthread_mutex_unlock(&(cldb->clLock)); - -- return; -+ return rc; - } - - static inline int -@@ -2651,7 +2656,7 @@ _cl5PurgeRidOnEntry(dbi_val_t *key, dbi_val_t *data, void *ctx) - } - - /* -- * _cl5PurgeRID(cleanruv_purge_data, cleaned_rid) -+ * _cl5PurgeRID(cleanruv_data, cleaned_rid) - * - * Clean the entire changelog of updates from the "cleaned rid" via CLEANALLRUV - * Delete entries in batches so we don't consume too many db locks, and we don't -@@ -2659,19 +2664,28 @@ _cl5PurgeRidOnEntry(dbi_val_t *key, dbi_val_t *data, void *ctx) - * We save the key from the last iteration so we don't have to start from the - * beginning for each new iteration. - */ --void --_cl5PurgeRID(cleanruv_purge_data *data, cldb_Handle *cldb) -+int32_t -+_cl5PurgeRID(cleanruv_data *data, cldb_Handle *cldb) - { - DBLCI_CTX dblcictx = {0}; - int32_t rc = 0; - -- dblcictx.seen.nbmax = CL5_PURGE_MAX_LOOKUP_PER_TRANSACTION; -- dblcictx.changed.nbmax = CL5_PURGE_MAX_PER_TRANSACTION; -- dblcictx.rid2purge = data->cleaned_rid; -+ if (dblayer_is_lmdb(cldb->be)) { -+ dblcictx.seen.nbmax = 5000; -+ dblcictx.changed.nbmax = 50; -+ } else { -+ dblcictx.seen.nbmax = 10000; -+ dblcictx.changed.nbmax = 50; -+ } -+ dblcictx.rid2purge = data->rid; - - rc = _cl5Iterate(cldb, _cl5PurgeRidOnEntry, &dblcictx, PR_FALSE); -- if (rc != CL5_SUCCESS && rc != CL5_NOTFOUND) { -- cleanruv_log(data->task, data->cleaned_rid, CLEANALLRUV_ID, -+ if (rc == CL5_SHUTDOWN) { -+ cleanruv_log(data->task, data->rid, CLEANALLRUV_ID, SLAPI_LOG_NOTICE, -+ "Server shutting down. Process will resume at server " -+ "startup"); -+ } else if (rc != CL5_SUCCESS && rc != CL5_NOTFOUND) { -+ cleanruv_log(data->task, data->rid, CLEANALLRUV_ID, - SLAPI_LOG_ERR, - "Purging failed to iterate through the entire changelog " - "(error %d). There is a chance the rid was not fully " -@@ -2679,11 +2693,14 @@ _cl5PurgeRID(cleanruv_purge_data *data, cldb_Handle *cldb) - "again.", - rc); - } else { -- cleanruv_log(data->task, data->cleaned_rid, CLEANALLRUV_ID, -+ cleanruv_log(data->task, data->rid, CLEANALLRUV_ID, - SLAPI_LOG_INFO, -- "Purged %ld records from the changelog", -- dblcictx.changed.tot); -+ "Scanned %ld records, and purged %ld records from the " -+ "changelog", -+ dblcictx.seen.tot, dblcictx.changed.tot); - } -+ -+ return rc; - } - - /* -@@ -4292,7 +4309,7 @@ _cl5ExportFile(PRFileDesc *prFile, cldb_Handle *cldb) - } - slapi_write_buffer(prFile, "\n", strlen("\n")); - -- dblcictx.seen.nbmax = CL5_PURGE_MAX_LOOKUP_PER_TRANSACTION; -+ dblcictx.seen.nbmax = CL5_TRIM_MAX_LOOKUP_PER_TRANSACTION; - dblcictx.exportFile = prFile; - rc = _cl5Iterate(cldb, _cl5ExportEntry2File, &dblcictx, PR_TRUE); - -@@ -4415,68 +4432,40 @@ cl5CleanRUV(ReplicaId rid, Replica *replica) - ruv_delete_replica(cldb->maxRUV, rid); - } - --static void --free_purge_data(cleanruv_purge_data *purge_data) --{ -- slapi_ch_free((void **)&purge_data); --} -- --/* -- * Create a thread to purge a changelog of cleaned RIDs -- */ --void --trigger_cl_purging(cleanruv_purge_data *purge_data) --{ -- PRThread *trim_tid = NULL; -- -- trim_tid = PR_CreateThread(PR_USER_THREAD, (VFP)(void *)trigger_cl_purging_thread, -- (void *)purge_data, PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, -- PR_UNJOINABLE_THREAD, DEFAULT_THREAD_STACKSIZE); -- if (NULL == trim_tid) { -- slapi_log_err(SLAPI_LOG_ERR, repl_plugin_name_cl, -- "trigger_cl_purging - Failed to create cl purging " -- "thread; NSPR error - %d\n", -- PR_GetError()); -- free_purge_data(purge_data); -- } else { -- /* need a little time for the thread to get started */ -- DS_Sleep(PR_SecondsToInterval(1)); -- } --} -- - /* - * Purge a changelog of entries that originated from a particular replica(rid) - */ --void --trigger_cl_purging_thread(void *arg) -+int32_t -+cldb_purge_rid(cleanruv_data *purge_data) - { -- cleanruv_purge_data *purge_data = (cleanruv_purge_data *)arg; -- Replica *replica = purge_data->replica; -- cldb_Handle *cldb = replica_get_cl_info(replica); -+ cldb_Handle *cldb = replica_get_cl_info(purge_data->replica); -+ int32_t rc = -1; - - if (cldb == NULL) { -- return; -+ return rc; - } - - pthread_mutex_lock(&(cldb->stLock)); -+ - /* Make sure we have a change log, and we aren't closing it */ - if (cldb->dbState != CL5_STATE_OPEN) { -- goto free_and_return; -+ pthread_mutex_unlock(&(cldb->stLock)); -+ return rc; - } -- - slapi_counter_increment(cldb->clThreads); -+ pthread_mutex_unlock(&(cldb->stLock)); - - /* Purge the changelog */ -- _cl5DoPurging(purge_data); -- -- /* Remove the rid from the internal list */ -- remove_cleaned_rid(purge_data->cleaned_rid); -+ rc = _cl5DoPurging(purge_data); - - slapi_counter_decrement(cldb->clThreads); - --free_and_return: -- pthread_mutex_unlock(&(cldb->stLock)); -- free_purge_data(purge_data); -+ /* Handle result code */ -+ if (rc == CL5_SUCCESS || rc == CL5_NOTFOUND) { -+ return LDAP_SUCCESS; -+ } else { -+ return -1; -+ } - } - - char * -diff --git a/ldap/servers/plugins/replication/cl5_api.h b/ldap/servers/plugins/replication/cl5_api.h -index a690eee37..e4b4f11ee 100644 ---- a/ldap/servers/plugins/replication/cl5_api.h -+++ b/ldap/servers/plugins/replication/cl5_api.h -@@ -81,26 +81,27 @@ typedef enum { - /* error codes */ - enum - { -- CL5_SUCCESS, /* successful operation */ -- CL5_BAD_DATA, /* invalid parameter passed to the function */ -- CL5_BAD_FORMAT, /* db data has unexpected format */ -- CL5_BAD_STATE, /* changelog is in an incorrect state for attempted operation */ -- CL5_BAD_DBVERSION, /* changelog has invalid dbversion */ -- CL5_DB_ERROR, /* database error */ -- CL5_NOTFOUND, /* requested entry or value was not found */ -- CL5_MEMORY_ERROR, /* memory allocation failed */ -- CL5_SYSTEM_ERROR, /* NSPR error occured, use PR_Error for furhter info */ -- CL5_CSN_ERROR, /* CSN API failed */ -- CL5_RUV_ERROR, /* RUV API failed */ -- CL5_OBJSET_ERROR, /* namedobjset api failed */ -- CL5_DB_LOCK_ERROR, /* bdb returns error 12 when the db runs out of locks, -+ CL5_SUCCESS, /* successful operation */ -+ CL5_BAD_DATA, /* invalid parameter passed to the function */ -+ CL5_BAD_FORMAT, /* db data has unexpected format */ -+ CL5_BAD_STATE, /* changelog is in an incorrect state for attempted operation */ -+ CL5_BAD_DBVERSION, /* changelog has invalid dbversion */ -+ CL5_DB_ERROR, /* database error */ -+ CL5_NOTFOUND, /* requested entry or value was not found */ -+ CL5_MEMORY_ERROR, /* memory allocation failed */ -+ CL5_SYSTEM_ERROR, /* NSPR error occured, use PR_Error for furhter info */ -+ CL5_CSN_ERROR, /* CSN API failed */ -+ CL5_RUV_ERROR, /* RUV API failed */ -+ CL5_OBJSET_ERROR, /* namedobjset api failed */ -+ CL5_DB_LOCK_ERROR, /* bdb returns error 12 when the db runs out of locks, - this var needs to be in slot 12 of the list. - Do not re-order enum above! */ -- CL5_PURGED_DATA, /* requested data has been purged */ -- CL5_MISSING_DATA, /* data should be in the changelog, but is missing */ -- CL5_UNKNOWN_ERROR, /* unclassified error */ -- CL5_IGNORE_OP, /* ignore this updated - used by CLEANALLRUV task */ -- CL5_DB_RETRY, /* Retryable database error */ -+ CL5_PURGED_DATA, /* requested data has been purged */ -+ CL5_MISSING_DATA, /* data should be in the changelog, but is missing */ -+ CL5_UNKNOWN_ERROR, /* unclassified error */ -+ CL5_IGNORE_OP, /* ignore this updated - used by CLEANALLRUV task */ -+ CL5_DB_RETRY, /* Retryable database error */ -+ CL5_SHUTDOWN, /* server shutdown during changelog iteration */ - CL5_LAST_ERROR_CODE /* Should always be last in this enum */ - }; - -@@ -140,7 +141,7 @@ int cl5Open(void); - int cl5Close(void); - - /* Name: cldb_RemoveReplicaDB -- Description: Clear the cldb information from the replica -+ Description: Clear the cldb information from the replica - and delete the database file - */ - int cldb_RemoveReplicaDB(Replica *replica); -@@ -328,7 +329,7 @@ int cl5NotifyRUVChange(Replica *replica); - - void cl5CleanRUV(ReplicaId rid, Replica *replica); - void cl5NotifyCleanup(int rid); --void trigger_cl_purging(cleanruv_purge_data *purge_data); -+int32_t cldb_purge_rid(cleanruv_data *purge_data); - int cldb_SetReplicaDB(Replica *replica, void *arg); - int cldb_UnSetReplicaDB(Replica *replica, void *arg); - int cldb_StartTrimming(Replica *replica); -diff --git a/ldap/servers/plugins/replication/repl5.h b/ldap/servers/plugins/replication/repl5.h -index 45b42be0f..2ba2cfaa7 100644 ---- a/ldap/servers/plugins/replication/repl5.h -+++ b/ldap/servers/plugins/replication/repl5.h -@@ -827,13 +827,6 @@ typedef struct _cleanruv_data - PRBool original_task; - } cleanruv_data; - --typedef struct _cleanruv_purge_data --{ -- int cleaned_rid; -- Replica *replica; -- Slapi_Task *task; --} cleanruv_purge_data; -- - typedef struct _csngen_test_data - { - Slapi_Task *task; -@@ -927,5 +920,6 @@ void cleanruv_log(Slapi_Task *task, int rid, char *task_type, int sev_level, cha - char *replica_cleanallruv_get_local_maxcsn(ReplicaId rid, char *base_dn); - int replica_execute_cleanruv_task(Replica *r, ReplicaId rid, char *returntext); - int replica_execute_cleanall_ruv_task(Replica *r, ReplicaId rid, Slapi_Task *task, const char *force_cleaning, PRBool original_task, char *returntext); -+void delete_cleaned_rid_config(cleanruv_data *data); - - #endif /* _REPL5_H_ */ -diff --git a/ldap/servers/plugins/replication/repl5_protocol_util.c b/ldap/servers/plugins/replication/repl5_protocol_util.c -index 78fa863bb..25173e5cd 100644 ---- a/ldap/servers/plugins/replication/repl5_protocol_util.c -+++ b/ldap/servers/plugins/replication/repl5_protocol_util.c -@@ -361,7 +361,7 @@ acquire_replica(Private_Repl_Protocol *prp, char *prot_oid, RUV **ruv) - /* remote replica detected a duplicate ReplicaID */ - slapi_log_err(SLAPI_LOG_ERR, repl_plugin_name, - "acquire_replica - " -- "%s: Unable to aquire replica: the replica " -+ "%s: Unable to acquire replica: the replica " - "has the same Replica ID as this one. " - "Replication is aborting.\n", - agmt_get_long_name(prp->agmt)); -diff --git a/ldap/servers/plugins/replication/repl_cleanallruv.c b/ldap/servers/plugins/replication/repl_cleanallruv.c -index a985e691f..b62c2fae0 100644 ---- a/ldap/servers/plugins/replication/repl_cleanallruv.c -+++ b/ldap/servers/plugins/replication/repl_cleanallruv.c -@@ -41,7 +41,7 @@ static int replica_cleanallruv_send_abort_extop(Repl_Agmt *ra, Slapi_Task *task, - static int replica_cleanallruv_check_maxcsn(Repl_Agmt *agmt, char *basedn, char *rid_text, char *maxcsn, Slapi_Task *task); - static int replica_cleanallruv_replica_alive(Repl_Agmt *agmt); - static int replica_cleanallruv_check_ruv(char *repl_root, Repl_Agmt *ra, char *rid_text, Slapi_Task *task, char *force); --static void delete_cleaned_rid_config(cleanruv_data *data); -+ - static int replica_cleanallruv_is_finished(Repl_Agmt *agmt, char *filter, Slapi_Task *task); - static void check_replicas_are_done_cleaning(cleanruv_data *data); - static void check_replicas_are_done_aborting(cleanruv_data *data); -@@ -791,7 +791,7 @@ delete_aborted_rid(Replica *r, ReplicaId rid, char *repl_root, char *certify_all - /* - * Just remove the dse.ldif config, but we need to keep the cleaned rids in memory until we know we are done - */ --static void -+void - delete_cleaned_rid_config(cleanruv_data *clean_data) - { - Slapi_PBlock *pb, *modpb; -@@ -2087,7 +2087,6 @@ static void - replica_cleanallruv_thread(void *arg) - { - cleanruv_data *data = arg; -- cleanruv_purge_data *purge_data = NULL; - Object *agmt_obj = NULL; - Object *ruv_obj = NULL; - Repl_Agmt *agmt = NULL; -@@ -2351,13 +2350,11 @@ done: - /* - * Success - the rid has been cleaned! - * -- * Delete the cleaned rid config. - * Make sure all the replicas have been "pre_cleaned" - * Remove the keep alive entry if present - * Clean the agreements' RUV -- * Remove the rid from the internal clean list -+ * Purge the changelog - */ -- delete_cleaned_rid_config(data); - check_replicas_are_done_cleaning(data); - if (data->original_task) { - cleanruv_log(data->task, data->rid, CLEANALLRUV_ID, SLAPI_LOG_INFO, -@@ -2369,21 +2366,14 @@ done: - } - clean_agmts(data); - -- /* -- * Now purge the changelog. The purging thread will free the -- * purge_data and update the cleaned rid list -- */ -- purge_data = (cleanruv_purge_data *)slapi_ch_calloc(1, sizeof(cleanruv_purge_data)); -- purge_data->cleaned_rid = data->rid; -- purge_data->replica = data->replica; -- purge_data->task = data->task; - cleanruv_log(data->task, data->rid, CLEANALLRUV_ID, SLAPI_LOG_INFO, -- "Triggering changelog purge thread. This might complete " -- "after the cleaning task finishes."); -- trigger_cl_purging(purge_data); -- -- cleanruv_log(data->task, data->rid, CLEANALLRUV_ID, SLAPI_LOG_INFO, -- "Successfully cleaned rid(%d)", data->rid); -+ "Purging changelog..."); -+ if (cldb_purge_rid(data) == LDAP_SUCCESS) { -+ delete_cleaned_rid_config(data); -+ remove_cleaned_rid(data->rid); -+ cleanruv_log(data->task, data->rid, CLEANALLRUV_ID, SLAPI_LOG_INFO, -+ "Successfully cleaned rid(%d)", data->rid); -+ } - } else { - /* - * Shutdown or abort --- -2.47.1 - diff --git a/SOURCES/0019-Issue-6229-After-an-initial-failure-subsequent-onlin.patch b/SOURCES/0007-Issue-6229-After-an-initial-failure-subsequent-onlin.patch similarity index 97% rename from SOURCES/0019-Issue-6229-After-an-initial-failure-subsequent-onlin.patch rename to SOURCES/0007-Issue-6229-After-an-initial-failure-subsequent-onlin.patch index c02fe35..0abffa3 100644 --- a/SOURCES/0019-Issue-6229-After-an-initial-failure-subsequent-onlin.patch +++ b/SOURCES/0007-Issue-6229-After-an-initial-failure-subsequent-onlin.patch @@ -1,4 +1,4 @@ -From 2e5a470ab5195b5e5f31fa8fb7b03d0c20b6a90f Mon Sep 17 00:00:00 2001 +From 769e71499880a0820424bf925c0f0fe793e11cc8 Mon Sep 17 00:00:00 2001 From: progier389 Date: Fri, 28 Jun 2024 18:56:49 +0200 Subject: [PATCH] Issue 6229 - After an initial failure, subsequent online @@ -134,10 +134,10 @@ index 0460a42f6..6658cc80a 100644 slapi_ch_free_string(&backup_config_dir); slapi_ch_free_string(&dse_file); diff --git a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_layer.c b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_layer.c -index 457c5ed60..35f8173a7 100644 +index 70a289bdb..de4161b0c 100644 --- a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_layer.c +++ b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_layer.c -@@ -982,6 +982,9 @@ dbmdb_backup(struct ldbminfo *li, char *dest_dir, Slapi_Task *task) +@@ -983,6 +983,9 @@ dbmdb_backup(struct ldbminfo *li, char *dest_dir, Slapi_Task *task) if (ldbm_archive_config(dest_dir, task) != 0) { slapi_log_err(SLAPI_LOG_ERR, "dbmdb_backup", "Backup of config files failed or is incomplete\n"); @@ -148,7 +148,7 @@ index 457c5ed60..35f8173a7 100644 goto bail; diff --git a/src/lib389/lib389/__init__.py b/src/lib389/lib389/__init__.py -index 4edea63b7..95926a5d6 100644 +index 368741a66..cb372c138 100644 --- a/src/lib389/lib389/__init__.py +++ b/src/lib389/lib389/__init__.py @@ -69,7 +69,7 @@ from lib389.utils import ( @@ -160,7 +160,7 @@ index 4edea63b7..95926a5d6 100644 from lib389.dseldif import DSEldif # mixin -@@ -1420,7 +1420,7 @@ class DirSrv(SimpleLDAPObject, object): +@@ -1424,7 +1424,7 @@ class DirSrv(SimpleLDAPObject, object): name, self.ds_paths.prefix) # create the archive @@ -169,7 +169,7 @@ index 4edea63b7..95926a5d6 100644 backup_file = os.path.join(backup_dir, name) tar = tarfile.open(backup_file, "w:gz") tar.extraction_filter = (lambda member, path: member) -@@ -2806,7 +2806,7 @@ class DirSrv(SimpleLDAPObject, object): +@@ -2810,7 +2810,7 @@ class DirSrv(SimpleLDAPObject, object): else: # No output file specified. Use the default ldif location/name cmd.append('-a') @@ -178,7 +178,7 @@ index 4edea63b7..95926a5d6 100644 if bename: ldifname = os.path.join(self.ds_paths.ldif_dir, "%s-%s-%s.ldif" % (self.serverid, bename, tnow)) else: -@@ -2877,7 +2877,7 @@ class DirSrv(SimpleLDAPObject, object): +@@ -2881,7 +2881,7 @@ class DirSrv(SimpleLDAPObject, object): if archive_dir is None: # Use the instance name and date/time as the default backup name @@ -187,7 +187,7 @@ index 4edea63b7..95926a5d6 100644 archive_dir = os.path.join(self.ds_paths.backup_dir, "%s-%s" % (self.serverid, tnow)) elif not archive_dir.startswith("/"): # Relative path, append it to the bak directory -@@ -3499,7 +3499,7 @@ class DirSrv(SimpleLDAPObject, object): +@@ -3506,7 +3506,7 @@ class DirSrv(SimpleLDAPObject, object): if archive is None: # Use the instance name and date/time as the default backup name @@ -197,7 +197,7 @@ index 4edea63b7..95926a5d6 100644 backup_dir_name = "%s-%s" % (self.serverid, tnow) else: diff --git a/src/lib389/lib389/tasks.py b/src/lib389/lib389/tasks.py -index 193805780..c1a2e7aaa 100644 +index 6c2adb5b2..6bf302862 100644 --- a/src/lib389/lib389/tasks.py +++ b/src/lib389/lib389/tasks.py @@ -118,7 +118,7 @@ class Task(DSLdapObject): @@ -562,5 +562,5 @@ index 193805780..c1a2e7aaa 100644 dn = f'cn={self.cn},cn=reload ldapi mappings,cn=tasks,cn=config' super(LDAPIMappingReloadTask, self).__init__(instance, dn) -- -2.48.1 +2.48.0 diff --git a/SOURCES/0007-Issue-6284-BUG-freelist-ordering-causes-high-wtime-6.patch b/SOURCES/0007-Issue-6284-BUG-freelist-ordering-causes-high-wtime-6.patch deleted file mode 100644 index 4a2f1c9..0000000 --- a/SOURCES/0007-Issue-6284-BUG-freelist-ordering-causes-high-wtime-6.patch +++ /dev/null @@ -1,112 +0,0 @@ -From 1217d4a2a4bd43ff572d91a6379501feb5d4c517 Mon Sep 17 00:00:00 2001 -From: Firstyear -Date: Mon, 5 Aug 2024 08:57:35 +1000 -Subject: [PATCH] Issue 6284 - BUG - freelist ordering causes high wtime - (#6285) - -Bug Description: Multithread listeners were added to -support having multiple threads able to perform IO -for connections to reduce wtime. However, when the server -is first started if the number of clients is less than -the size of a single listeners conntable this causes -extremely high wtimes. - -This is because the initial connection freelist -construction adds every connection in order of *listener* -so new connections always fill the first listener thread, -then only once that listener is full it spills over to the -next. - -If the conntable size is small, this isn't noticeable, but -an example is if your contable is 16384 elements with 4 -listeners, then the first 4096 connections will always -go to the first listener. - -Fix Description: When the freelist is constructed rather -than iterate over each listener *then* each slot, we -iterate over each slot then each listenr. This causes -the initial freelist to be interleaved between all -listeners so that even with a small number of connections -the work is spread fairly without lasering a single -listener. - -A supplied test from a user shows a significant drop in -wtime and an increase in throughput of operations with -this change. - -fixes: https://github.com/389ds/389-ds-base/issues/6284 - -Author: William Brown - -Review by: @tbordaz and @jchapma (Thanks!) ---- - ldap/servers/slapd/conntable.c | 33 +++++++++++++++++++++++++++------ - 1 file changed, 27 insertions(+), 6 deletions(-) - -diff --git a/ldap/servers/slapd/conntable.c b/ldap/servers/slapd/conntable.c -index 90f08abd4..b8e2ce3b5 100644 ---- a/ldap/servers/slapd/conntable.c -+++ b/ldap/servers/slapd/conntable.c -@@ -115,20 +115,26 @@ connection_table_new(int table_size) - { - Connection_Table *ct; - size_t i = 0; -- int ct_list = 0; -- int free_idx = 0; -+ size_t ct_list = 0; -+ size_t free_idx = 0; - ber_len_t maxbersize = config_get_maxbersize(); - ct = (Connection_Table *)slapi_ch_calloc(1, sizeof(Connection_Table)); - ct->list_num = config_get_num_listeners(); - ct->num_active = (int *)slapi_ch_calloc(1, ct->list_num * sizeof(int)); -+ /* Connection table size must be divisible by the number of listeners */ - ct->size = table_size - (table_size % ct->list_num); - /* Account for first slot of each list being used as head (c_next). */ - ct->list_size = (ct->size/ct->list_num)+1; -+ /* -+ * Since there are extra list heads, in the case ct->size was a multiple of list_num, we -+ * need to expand ct->size to reflect the true allocation amount. -+ */ -+ ct->size = ct->list_size * ct->list_num; - ct->c = (Connection **)slapi_ch_calloc(1, ct->size * sizeof(Connection *)); - ct->fd = (struct POLL_STRUCT **)slapi_ch_calloc(1, ct->list_num * sizeof(struct POLL_STRUCT*)); - ct->table_mutex = PR_NewLock(); - /* Allocate the freelist (a slot for each connection plus another slot for the final NULL pointer) */ -- ct->c_freelist = (Connection **)slapi_ch_calloc(1, (ct->size+1) * sizeof(Connection *)); -+ ct->c_freelist = (Connection **)slapi_ch_calloc(1, (ct->size + 1) * sizeof(Connection *)); - ct->conn_next_offset = 0; - - slapi_log_err(SLAPI_LOG_INFO, "connection_table_new", "Number of connection sub-tables %d, each containing %d slots.\n", -@@ -184,11 +190,26 @@ connection_table_new(int table_size) - - /* Ready to rock, mark as such. */ - ct->c[ct_list][i].c_state = CONN_STATE_INIT; -+ } -+ } - -+ /* -+ * The freelist is how new connections are inserted into our ct to be used. We need to ensure -+ * these are *spread* initially over the set of listeners so that we distributed between handlers -+ * from the start. Over time as things are re-added to the freelist it will "shuffle" and we -+ * will effectively have randomised listener assignment. -+ * -+ * Without this it means that a single listener will be "focused on" until it's conntable -+ * is full at which point we spill out into the next listener. -+ * -+ * This is why in the subsequent loops we INVERT the loop to iterate over list_size -+ * first, and then the ct_list as the inner component so that the freelist initially -+ * alternates between the listeners first to help distribute requests. -+ */ -+ for (i = 1; i < ct->list_size; i++) { -+ for (ct_list = 0; ct_list < ct->list_num; ct_list++) { - /* Map multiple ct lists to a single freelist, but skip slot 0 of each list. */ -- if (i != 0) { -- ct->c_freelist[free_idx++] = &(ct->c[ct_list][i]); -- } -+ ct->c_freelist[free_idx++] = &(ct->c[ct_list][i]); - } - } - --- -2.47.1 - diff --git a/SOURCES/0008-Issue-6296-basic_test.py-test_conn_limits-fails-in-m.patch b/SOURCES/0008-Issue-6296-basic_test.py-test_conn_limits-fails-in-m.patch deleted file mode 100644 index 7f97b37..0000000 --- a/SOURCES/0008-Issue-6296-basic_test.py-test_conn_limits-fails-in-m.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 47709ccde40a50eb908bf43e11cce3dc68fa0ef5 Mon Sep 17 00:00:00 2001 -From: James Chapman -Date: Wed, 21 Aug 2024 23:00:37 +0100 -Subject: [PATCH] Issue 6296 - basic_test.py::test_conn_limits fails in main - branch (#6300) - -Description: -A CI test to validate connection management functionality by -configuring an instance with a very small connection table fails, -with the instance failing to start. - -Fix description: -In a multi list connection table configuration, the connection table -code has been updated to expand the connection table size to include -a head for each list. This expanded size needs to be accounted for -when we determine if we can accept new connections and on final check -at server starup time. - -Relates: https://github.com/389ds/389-ds-base/issues/6296 - -Reviewed by: @droideck (Thank you) ---- - ldap/servers/slapd/daemon.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/ldap/servers/slapd/daemon.c b/ldap/servers/slapd/daemon.c -index 9e2f32c43..56e20bd13 100644 ---- a/ldap/servers/slapd/daemon.c -+++ b/ldap/servers/slapd/daemon.c -@@ -829,8 +829,8 @@ accept_thread(void *vports) - num_poll = setup_pr_accept_pds(n_tcps, s_tcps, i_unix, &fds); - - while (!g_get_shutdown()) { -- /* Do we need to accept new connections? */ -- int accept_new_connections = (ct->size > ct->conn_next_offset); -+ /* Do we need to accept new connections, account for ct->size including list heads. */ -+ int accept_new_connections = ((ct->size - ct->list_num) > ct->conn_next_offset); - if (!accept_new_connections) { - if (last_accept_new_connections) { - slapi_log_err(SLAPI_LOG_ERR, "accept_thread", -@@ -2081,8 +2081,8 @@ unfurl_banners(Connection_Table *ct, daemon_ports_t *ports, PRFileDesc **n_tcps, - slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig(); - char addrbuf[256]; - int isfirsttime = 1; -- -- if (ct->size > (slapdFrontendConfig->maxdescriptors - slapdFrontendConfig->reservedescriptors)) { -+ /* Take into account that ct->size includes a list head for each listener. */ -+ if ((ct->size - ct->list_num) > (slapdFrontendConfig->maxdescriptors - slapdFrontendConfig->reservedescriptors)) { - slapi_log_err(SLAPI_LOG_ERR, "slapd_daemon", - "Not enough descriptors to accept any connections. " - "This may be because the maxdescriptors configuration " --- -2.47.1 - diff --git a/SOURCES/0017-Issue-6554-During-import-of-entries-without-nsUnique.patch b/SOURCES/0008-Issue-6554-During-import-of-entries-without-nsUnique.patch similarity index 94% rename from SOURCES/0017-Issue-6554-During-import-of-entries-without-nsUnique.patch rename to SOURCES/0008-Issue-6554-During-import-of-entries-without-nsUnique.patch index c1dc87f..f5dd5f0 100644 --- a/SOURCES/0017-Issue-6554-During-import-of-entries-without-nsUnique.patch +++ b/SOURCES/0008-Issue-6554-During-import-of-entries-without-nsUnique.patch @@ -1,4 +1,4 @@ -From 39138128783d3e3cd337a6d6b01b19abbc7bb6de Mon Sep 17 00:00:00 2001 +From b2511553590f0d9b41856d8baff5f3cd103dd46f Mon Sep 17 00:00:00 2001 From: tbordaz Date: Thu, 6 Feb 2025 18:25:36 +0100 Subject: [PATCH] Issue 6554 - During import of entries without nsUniqueId, a @@ -27,7 +27,7 @@ Reviewed by: Pierre Rogier 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/dirsrvtests/tests/suites/import/import_test.py b/dirsrvtests/tests/suites/import/import_test.py -index 832a27cf6..6b6630133 100644 +index b7cba32fd..18caec633 100644 --- a/dirsrvtests/tests/suites/import/import_test.py +++ b/dirsrvtests/tests/suites/import/import_test.py @@ -14,11 +14,13 @@ import os @@ -45,8 +45,8 @@ index 832a27cf6..6b6630133 100644 from lib389.dbgen import dbgen_users from lib389.tasks import ImportTask from lib389.index import Indexes -@@ -627,6 +629,81 @@ def test_crash_on_ldif2db_with_lmdb(topo, _import_clean): - __check_for_core(now) +@@ -690,6 +692,81 @@ def test_online_import_under_load(topo): + assert import_task.get_exit_code() == 0 +def test_duplicate_nsuniqueid(topo_m2, request): @@ -128,10 +128,10 @@ index 832a27cf6..6b6630133 100644 # Run isolated # -s for DEBUG mode diff --git a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c -index 65f564aff..716e3c0f3 100644 +index 707a110c5..0f445bb56 100644 --- a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c +++ b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c -@@ -606,10 +606,20 @@ dbmdb_import_generate_uniqueid(ImportJob *job, Slapi_Entry *e) +@@ -610,10 +610,20 @@ dbmdb_import_generate_uniqueid(ImportJob *job, Slapi_Entry *e) { const char *uniqueid = slapi_entry_get_uniqueid(e); int rc = UID_SUCCESS; @@ -152,7 +152,7 @@ index 65f564aff..716e3c0f3 100644 /* generate id based on dn */ if (job->uuid_gen_type == SLAPI_UNIQUEID_GENERATE_NAME_BASED) { char *dn = slapi_entry_get_dn(e); -@@ -620,6 +630,7 @@ dbmdb_import_generate_uniqueid(ImportJob *job, Slapi_Entry *e) +@@ -624,6 +634,7 @@ dbmdb_import_generate_uniqueid(ImportJob *job, Slapi_Entry *e) /* time based */ rc = slapi_uniqueIDGenerateString(&newuniqueid); } @@ -161,5 +161,5 @@ index 65f564aff..716e3c0f3 100644 if (rc == UID_SUCCESS) { slapi_entry_set_uniqueid(e, newuniqueid); -- -2.48.1 +2.48.0 diff --git a/SOURCES/0009-Issue-5798-Fix-dsconf-config-multi-valued-attr-opera.patch b/SOURCES/0009-Issue-5798-Fix-dsconf-config-multi-valued-attr-opera.patch deleted file mode 100644 index 8579b6d..0000000 --- a/SOURCES/0009-Issue-5798-Fix-dsconf-config-multi-valued-attr-opera.patch +++ /dev/null @@ -1,686 +0,0 @@ -From 569628ce405f214a7e35deb96b4e6c22519a4268 Mon Sep 17 00:00:00 2001 -From: Simon Pichugin -Date: Wed, 4 Dec 2024 22:29:11 -0500 -Subject: [PATCH] Issue 5798 - Fix dsconf config multi-valued attr operations - (#6426) - -Description: -Fix add operation to properly handle multi-valued attributes -so they persist after server restart. -Add support for multiple values at once via dsconf config. -Handle delete operation in a more flexible way. -Refactor attribute handling code for better error handling and consistency. -*Add CI test suite - -Fixes: https://github.com/389ds/389-ds-base/issues/5798 - -Reviewed by: @progier389 (Thanks!) ---- - .../tests/suites/clu/dsconf_config_test.py | 347 ++++++++++++++++++ - src/lib389/lib389/_mapped_object.py | 55 +-- - src/lib389/lib389/cli_conf/config.py | 172 +++++---- - 3 files changed, 481 insertions(+), 93 deletions(-) - create mode 100644 dirsrvtests/tests/suites/clu/dsconf_config_test.py - -diff --git a/dirsrvtests/tests/suites/clu/dsconf_config_test.py b/dirsrvtests/tests/suites/clu/dsconf_config_test.py -new file mode 100644 -index 000000000..d67679adf ---- /dev/null -+++ b/dirsrvtests/tests/suites/clu/dsconf_config_test.py -@@ -0,0 +1,347 @@ -+# --- BEGIN COPYRIGHT BLOCK --- -+# Copyright (C) 2024 Red Hat, Inc. -+# All rights reserved. -+# -+# License: GPL (version 3 or any later version). -+# See LICENSE for details. -+# --- END COPYRIGHT BLOCK --- -+# -+ -+import subprocess -+import logging -+import pytest -+from lib389._constants import DN_DM -+from lib389.topologies import topology_st -+ -+pytestmark = pytest.mark.tier1 -+ -+log = logging.getLogger(__name__) -+ -+HAPROXY_IPS = { -+ 'single': '192.168.1.1', -+ 'multiple': ['10.0.0.1', '172.16.0.1', '192.168.2.1'] -+} -+ -+REFERRALS = { -+ 'single': 'ldap://primary.example.com', -+ 'multiple': [ -+ 'ldap://server1.example.com', -+ 'ldap://server2.example.com', -+ 'ldap://server3.example.com' -+ ] -+} -+ -+TEST_ATTRS = [ -+ ('nsslapd-haproxy-trusted-ip', HAPROXY_IPS), -+ ('nsslapd-referral', REFERRALS) -+] -+ -+ -+def execute_dsconf_command(dsconf_cmd, subcommands): -+ """Execute dsconf command and return output and return code""" -+ -+ cmdline = dsconf_cmd + subcommands -+ proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE) -+ out, _ = proc.communicate() -+ return out.decode('utf-8'), proc.returncode -+ -+ -+def get_dsconf_base_cmd(topology): -+ """Return base dsconf command list""" -+ -+ return ['/usr/sbin/dsconf', topology.standalone.serverid, -+ '-D', DN_DM, '-w', 'password'] -+ -+ -+@pytest.mark.parametrize("attr_name,values_dict", TEST_ATTRS) -+def test_single_value_add(topology_st, attr_name, values_dict): -+ """Test adding a single value to an attribute -+ -+ :id: ffc912a6-c188-413d-9c35-7f4b3774d946 -+ :setup: Standalone DS instance -+ :steps: -+ 1. Add a single value to the specified attribute -+ 2. Verify the value was added correctly -+ :expectedresults: -+ 1. Command should execute successfully -+ 2. Added value should be present in the configuration -+ """ -+ dsconf_cmd = get_dsconf_base_cmd(topology_st) -+ -+ try: -+ value = values_dict['single'] -+ test_attr = f"{attr_name}={value}" -+ -+ # Add single value -+ output, rc = execute_dsconf_command(dsconf_cmd, ['config', 'add', test_attr]) -+ assert rc == 0 -+ -+ # Verify -+ output, _ = execute_dsconf_command(dsconf_cmd, ['config', 'get', attr_name]) -+ assert value in output -+ -+ finally: -+ execute_dsconf_command(dsconf_cmd, ['config', 'delete', attr_name]) -+ -+ -+@pytest.mark.parametrize("attr_name,values_dict", TEST_ATTRS) -+def test_single_value_replace(topology_st, attr_name, values_dict): -+ """Test replacing a single value in configuration attributes -+ -+ :id: 112e3e5e-8db8-4974-9ea4-ed789c2d02f2 -+ :setup: Standalone DS instance -+ :steps: -+ 1. Add initial value to the specified attribute -+ 2. Replace the value with a new one -+ 3. Verify the replacement was successful -+ :expectedresults: -+ 1. Initial value should be added successfully -+ 2. Replace command should execute successfully -+ 3. New value should be present and old value should be absent -+ """ -+ dsconf_cmd = get_dsconf_base_cmd(topology_st) -+ -+ try: -+ # Add initial value -+ value = values_dict['single'] -+ test_attr = f"{attr_name}={value}" -+ execute_dsconf_command(dsconf_cmd, ['config', 'add', test_attr]) -+ -+ # Replace with new value -+ new_value = values_dict['multiple'][0] -+ replace_attr = f"{attr_name}={new_value}" -+ output, rc = execute_dsconf_command(dsconf_cmd, ['config', 'replace', replace_attr]) -+ assert rc == 0 -+ -+ # Verify -+ output, _ = execute_dsconf_command(dsconf_cmd, ['config', 'get', attr_name]) -+ assert new_value in output -+ assert value not in output -+ -+ finally: -+ execute_dsconf_command(dsconf_cmd, ['config', 'delete', attr_name]) -+ -+ -+@pytest.mark.parametrize("attr_name,values_dict", TEST_ATTRS) -+def test_multi_value_batch_add(topology_st, attr_name, values_dict): -+ """Test adding multiple values in a single batch command -+ -+ :id: 4c34c7f8-16cc-4ab6-938a-967537be5470 -+ :setup: Standalone DS instance -+ :steps: -+ 1. Add multiple values to the attribute in a single command -+ 2. Verify all values were added correctly -+ :expectedresults: -+ 1. Batch add command should execute successfully -+ 2. All added values should be present in the configuration -+ """ -+ dsconf_cmd = get_dsconf_base_cmd(topology_st) -+ -+ try: -+ # Add multiple values in one command -+ attr_values = [f"{attr_name}={val}" for val in values_dict['multiple']] -+ output, rc = execute_dsconf_command(dsconf_cmd, ['config', 'add'] + attr_values) -+ assert rc == 0 -+ -+ # Verify all values -+ output, _ = execute_dsconf_command(dsconf_cmd, ['config', 'get', attr_name]) -+ for value in values_dict['multiple']: -+ assert value in output -+ -+ finally: -+ execute_dsconf_command(dsconf_cmd, ['config', 'delete', attr_name]) -+ -+ -+@pytest.mark.parametrize("attr_name,values_dict", TEST_ATTRS) -+def test_multi_value_batch_replace(topology_st, attr_name, values_dict): -+ """Test replacing with multiple values in a single batch command -+ -+ :id: 05cf28b8-000e-4856-a10b-7e1df012737d -+ :setup: Standalone DS instance -+ :steps: -+ 1. Add initial single value -+ 2. Replace with multiple values in a single command -+ 3. Verify the replacement was successful -+ :expectedresults: -+ 1. Initial value should be added successfully -+ 2. Batch replace command should execute successfully -+ 3. All new values should be present and initial value should be absent -+ """ -+ dsconf_cmd = get_dsconf_base_cmd(topology_st) -+ -+ try: -+ # Add initial value -+ initial_value = values_dict['single'] -+ execute_dsconf_command(dsconf_cmd, ['config', 'add', f"{attr_name}={initial_value}"]) -+ -+ # Replace with multiple values -+ attr_values = [f"{attr_name}={val}" for val in values_dict['multiple']] -+ output, rc = execute_dsconf_command(dsconf_cmd, ['config', 'replace'] + attr_values) -+ assert rc == 0 -+ -+ # Verify -+ output, _ = execute_dsconf_command(dsconf_cmd, ['config', 'get', attr_name]) -+ assert initial_value not in output -+ for value in values_dict['multiple']: -+ assert value in output -+ -+ finally: -+ execute_dsconf_command(dsconf_cmd, ['config', 'delete', attr_name]) -+ -+ -+@pytest.mark.parametrize("attr_name,values_dict", TEST_ATTRS) -+def test_multi_value_specific_delete(topology_st, attr_name, values_dict): -+ """Test deleting specific values from multi-valued attribute -+ -+ :id: bb325c9a-eae8-438a-b577-bd63540b91cb -+ :setup: Standalone DS instance -+ :steps: -+ 1. Add multiple values to the attribute -+ 2. Delete a specific value -+ 3. Verify the deletion was successful -+ :expectedresults: -+ 1. Multiple values should be added successfully -+ 2. Specific delete command should execute successfully -+ 3. Deleted value should be absent while others remain present -+ """ -+ dsconf_cmd = get_dsconf_base_cmd(topology_st) -+ -+ try: -+ # Add multiple values -+ attr_values = [f"{attr_name}={val}" for val in values_dict['multiple']] -+ execute_dsconf_command(dsconf_cmd, ['config', 'add'] + attr_values) -+ -+ # Delete middle value -+ delete_value = values_dict['multiple'][1] -+ output, rc = execute_dsconf_command(dsconf_cmd, -+ ['config', 'delete', f"{attr_name}={delete_value}"]) -+ assert rc == 0 -+ -+ # Verify remaining values -+ output, _ = execute_dsconf_command(dsconf_cmd, ['config', 'get', attr_name]) -+ assert delete_value not in output -+ assert values_dict['multiple'][0] in output -+ assert values_dict['multiple'][2] in output -+ -+ finally: -+ execute_dsconf_command(dsconf_cmd, ['config', 'delete', attr_name]) -+ -+ -+@pytest.mark.parametrize("attr_name,values_dict", TEST_ATTRS) -+def test_multi_value_batch_delete(topology_st, attr_name, values_dict): -+ """Test deleting multiple values in a single batch command -+ -+ :id: 4b105824-b060-4f83-97d7-001a01dba1a5 -+ :setup: Standalone DS instance -+ :steps: -+ 1. Add multiple values to the attribute -+ 2. Delete multiple values in a single command -+ 3. Verify the batch deletion was successful -+ :expectedresults: -+ 1. Multiple values should be added successfully -+ 2. Batch delete command should execute successfully -+ 3. Deleted values should be absent while others remain present -+ """ -+ dsconf_cmd = get_dsconf_base_cmd(topology_st) -+ -+ try: -+ # Add all values -+ attr_values = [f"{attr_name}={val}" for val in values_dict['multiple']] -+ execute_dsconf_command(dsconf_cmd, ['config', 'add'] + attr_values) -+ -+ # Delete multiple values in one command -+ delete_values = [f"{attr_name}={val}" for val in values_dict['multiple'][:2]] -+ output, rc = execute_dsconf_command(dsconf_cmd, ['config', 'delete'] + delete_values) -+ assert rc == 0 -+ -+ # Verify -+ output, _ = execute_dsconf_command(dsconf_cmd, ['config', 'get', attr_name]) -+ assert values_dict['multiple'][2] in output -+ assert values_dict['multiple'][0] not in output -+ assert values_dict['multiple'][1] not in output -+ -+ finally: -+ execute_dsconf_command(dsconf_cmd, ['config', 'delete', attr_name]) -+ -+ -+@pytest.mark.parametrize("attr_name,values_dict", TEST_ATTRS) -+def test_single_value_persists_after_restart(topology_st, attr_name, values_dict): -+ """Test single value persists after server restart -+ -+ :id: be1a7e3d-a9ca-48a1-a3bc-062990d4f3e9 -+ :setup: Standalone DS instance -+ :steps: -+ 1. Add single value to the attribute -+ 2. Verify the value is present -+ 3. Restart the server -+ 4. Verify the value persists after restart -+ :expectedresults: -+ 1. Value should be added successfully -+ 2. Value should be present before restart -+ 3. Server should restart successfully -+ 4. Value should still be present after restart -+ """ -+ dsconf_cmd = get_dsconf_base_cmd(topology_st) -+ -+ try: -+ # Add single value -+ value = values_dict['single'] -+ output, rc = execute_dsconf_command(dsconf_cmd, -+ ['config', 'add', f"{attr_name}={value}"]) -+ assert rc == 0 -+ -+ # Verify before restart -+ output, _ = execute_dsconf_command(dsconf_cmd, ['config', 'get', attr_name]) -+ assert value in output -+ -+ # Restart the server -+ topology_st.standalone.restart(timeout=10) -+ -+ # Verify after restart -+ output, _ = execute_dsconf_command(dsconf_cmd, ['config', 'get', attr_name]) -+ assert value in output -+ -+ finally: -+ execute_dsconf_command(dsconf_cmd, ['config', 'delete', attr_name]) -+ -+ -+@pytest.mark.parametrize("attr_name,values_dict", TEST_ATTRS) -+def test_multi_value_batch_persists_after_restart(topology_st, attr_name, values_dict): -+ """Test multiple values added in batch persist after server restart -+ -+ :id: fd0435e2-90b1-465a-8968-d3a375c8fb22 -+ :setup: Standalone DS instance -+ :steps: -+ 1. Add multiple values in a single batch command -+ 2. Verify all values are present -+ 3. Restart the server -+ 4. Verify all values persist after restart -+ :expectedresults: -+ 1. Batch add command should execute successfully -+ 2. All values should be present before restart -+ 3. Server should restart successfully -+ 4. All values should still be present after restart -+ """ -+ dsconf_cmd = get_dsconf_base_cmd(topology_st) -+ -+ try: -+ # Add multiple values -+ attr_values = [f"{attr_name}={val}" for val in values_dict['multiple']] -+ output, rc = execute_dsconf_command(dsconf_cmd, ['config', 'add'] + attr_values) -+ assert rc == 0 -+ -+ # Verify before restart -+ output, _ = execute_dsconf_command(dsconf_cmd, ['config', 'get', attr_name]) -+ for value in values_dict['multiple']: -+ assert value in output -+ -+ # Restart the server -+ topology_st.standalone.restart(timeout=10) -+ -+ # Verify after restart -+ output, _ = execute_dsconf_command(dsconf_cmd, ['config', 'get', attr_name]) -+ for value in values_dict['multiple']: -+ assert value in output -+ -+ finally: -+ execute_dsconf_command(dsconf_cmd, ['config', 'delete', attr_name]) -diff --git a/src/lib389/lib389/_mapped_object.py b/src/lib389/lib389/_mapped_object.py -index 9799b8839..af5aab71e 100644 ---- a/src/lib389/lib389/_mapped_object.py -+++ b/src/lib389/lib389/_mapped_object.py -@@ -321,25 +321,31 @@ class DSLdapObject(DSLogging, DSLint): - This is useful for configuration changes that require - atomic operation, and ease of use. - -- An example of usage is add_many((key, value), (key, value)) -+ An example of usage is add_many((key, value), (key, [value1, value2])) - - No wrapping list is needed for the arguments. - -- :param *args: tuples of key,value to replace. -- :type *args: (str, str) -+ :param *args: tuples of key,value to add. Value can be a single value -+ or a collection (list, tuple, set) of values. -+ :type *args: (str, str) or (str, list/tuple/set) - """ -- - mods = [] - for arg in args: -- if isinstance(arg[1], list) or isinstance(arg[1], tuple): -- value = ensure_list_bytes(arg[1]) -+ key, value = arg -+ if isinstance(value, (list, tuple, set)): -+ value = ensure_list_bytes(list(value)) - else: -- value = [ensure_bytes(arg[1])] -- mods.append((ldap.MOD_ADD, ensure_str(arg[0]), value)) -- return _modify_ext_s(self._instance,self._dn, mods, serverctrls=self._server_controls, -- clientctrls=self._client_controls, escapehatch='i am sure') -+ value = [ensure_bytes(value)] -+ -+ mods.append((ldap.MOD_ADD, ensure_str(key), value)) -+ -+ return _modify_ext_s(self._instance, -+ self._dn, -+ mods, -+ serverctrls=self._server_controls, -+ clientctrls=self._client_controls, -+ escapehatch='i am sure') - -- # Basically what it means; - def replace(self, key, value): - """Replace an attribute with a value - -@@ -355,23 +361,30 @@ class DSLdapObject(DSLogging, DSLint): - This is useful for configuration changes that require - atomic operation, and ease of use. - -- An example of usage is replace_many((key, value), (key, value)) -+ An example of usage is replace_many((key, value), (key, [value1, value2])) - - No wrapping list is needed for the arguments. - -- :param *args: tuples of key,value to replace. -- :type *args: (str, str) -+ :param *args: tuples of key,value to replace. Value can be a single value -+ or a collection (list, tuple, set) of values. -+ :type *args: (str, str) or (str, list/tuple/set) - """ -- - mods = [] - for arg in args: -- if isinstance(arg[1], list) or isinstance(arg[1], tuple): -- value = ensure_list_bytes(arg[1]) -+ key, value = arg -+ if isinstance(value, (list, tuple, set)): -+ value = ensure_list_bytes(list(value)) - else: -- value = [ensure_bytes(arg[1])] -- mods.append((ldap.MOD_REPLACE, ensure_str(arg[0]), value)) -- return _modify_ext_s(self._instance,self._dn, mods, serverctrls=self._server_controls, -- clientctrls=self._client_controls, escapehatch='i am sure') -+ value = [ensure_bytes(value)] -+ -+ mods.append((ldap.MOD_REPLACE, ensure_str(key), value)) -+ -+ return _modify_ext_s(self._instance, -+ self._dn, -+ mods, -+ serverctrls=self._server_controls, -+ clientctrls=self._client_controls, -+ escapehatch='i am sure') - - # This needs to work on key + val, and key - def remove(self, key, value): -diff --git a/src/lib389/lib389/cli_conf/config.py b/src/lib389/lib389/cli_conf/config.py -index fb4c68f8b..6f4eddc8c 100644 ---- a/src/lib389/lib389/cli_conf/config.py -+++ b/src/lib389/lib389/cli_conf/config.py -@@ -1,5 +1,5 @@ - # --- BEGIN COPYRIGHT BLOCK --- --# Copyright (C) 2023 Red Hat, Inc. -+# Copyright (C) 2024 Red Hat, Inc. - # All rights reserved. - # - # License: GPL (version 3 or any later version). -@@ -12,12 +12,9 @@ from lib389.config import Config - from lib389.cli_base import ( - _generic_get_entry, - _generic_get_attr, -- _generic_replace_attr, - CustomHelpFormatter - ) - --OpType = Enum("OpType", "add delete") -- - - def _config_display_ldapimaprootdn_warning(log, args): - """If we update the rootdn we need to update the ldapi settings too""" -@@ -28,44 +25,48 @@ def _config_display_ldapimaprootdn_warning(log, args): - "For LDAPI configuration, \"nsslapd-rootdn\" is used instead.") - - --def _config_get_existing_attrs(conf, args, op_type): -- """Get the existing attribute from the server and return them in a dict -- so we can add them back after the operation is done. -- -- For op_type == OpType.delete, we delete them from the server so we can add -- back only those that are not specified in the command line. -- (i.e delete nsslapd-haproxy-trusted-ip="192.168.0.1", but -- nsslapd-haproxy-trusted-ip has 192.168.0.1 and 192.168.0.2 values. -- So we want only 192.168.0.1 to be deleted in the end) -- """ -- -- existing_attrs = {} -- if args and args.attr: -- for attr in args.attr: -- if "=" in attr: -- [attr_name, val] = attr.split("=", 1) -- # We should process only multi-valued attributes this way -- if attr_name.lower() == "nsslapd-haproxy-trusted-ip" or \ -- attr_name.lower() == "nsslapd-referral": -- if attr_name not in existing_attrs.keys(): -- existing_attrs[attr_name] = conf.get_attr_vals_utf8(attr_name) -- existing_attrs[attr_name] = [x for x in existing_attrs[attr_name] if x != val] -- -- if op_type == OpType.add: -- if existing_attrs[attr_name] == []: -- del existing_attrs[attr_name] -- -- if op_type == OpType.delete: -- conf.remove_all(attr_name) -- else: -- if op_type == OpType.delete: -- conf.remove_all(attr) -- else: -- raise ValueError(f"You must specify a value to add for the attribute ({attr_name})") -- return existing_attrs -- else: -- # Missing value -- raise ValueError(f"Missing attribute to {op_type.name}") -+def _format_values_for_display(values): -+ """Format a set of values for display""" -+ -+ if not values: -+ return "" -+ if len(values) == 1: -+ return f"'{next(iter(values))}'" -+ return ', '.join(f"'{value}'" for value in sorted(values)) -+ -+ -+def _parse_attr_value_pairs(attrs, allow_no_value=False): -+ """Parse attribute value pairs from a list of strings in the format 'attr=value'""" -+ -+ attr_values = {} -+ attrs_without_values = set() -+ -+ for attr in attrs: -+ if "=" in attr: -+ attr_name, val = attr.split("=", 1) -+ if attr_name not in attr_values: -+ attr_values[attr_name] = set() -+ attr_values[attr_name].add(val) -+ elif allow_no_value: -+ attrs_without_values.add(attr) -+ else: -+ raise ValueError(f"Invalid attribute format: {attr}. Must be in format 'attr=value'") -+ -+ return attr_values, attrs_without_values -+ -+ -+def _handle_attribute_operation(conf, operation_type, attr_values, log): -+ """Handle attribute operations (add, replace) with consistent error handling""" -+ -+ if operation_type == "add": -+ conf.add_many(*[(k, v) for k, v in attr_values.items()]) -+ elif operation_type == "replace": -+ conf.replace_many(*[(k, v) for k, v in attr_values.items()]) -+ -+ for attr_name, values in attr_values.items(): -+ formatted_values = _format_values_for_display(values) -+ operation_past = "added" if operation_type == "add" else f"{operation_type}d" -+ log.info(f"Successfully {operation_past} value(s) for '{attr_name}': {formatted_values}") - - - def config_get(inst, basedn, log, args): -@@ -77,49 +78,76 @@ def config_get(inst, basedn, log, args): - - - def config_replace_attr(inst, basedn, log, args): -- _generic_replace_attr(inst, basedn, log.getChild('config_replace_attr'), Config, args) -+ if not args or not args.attr: -+ raise ValueError("Missing attribute to replace") - -+ conf = Config(inst, basedn) -+ attr_values, _ = _parse_attr_value_pairs(args.attr) -+ _handle_attribute_operation(conf, "replace", attr_values, log) - _config_display_ldapimaprootdn_warning(log, args) - - - def config_add_attr(inst, basedn, log, args): -+ if not args or not args.attr: -+ raise ValueError("Missing attribute to add") -+ - conf = Config(inst, basedn) -- final_mods = [] -- -- existing_attrs = _config_get_existing_attrs(conf, args, OpType.add) -- -- if args and args.attr: -- for attr in args.attr: -- if "=" in attr: -- [attr_name, val] = attr.split("=", 1) -- if attr_name in existing_attrs: -- for v in existing_attrs[attr_name]: -- final_mods.append((attr_name, v)) -- final_mods.append((attr_name, val)) -- try: -- conf.add_many(*set(final_mods)) -- except ldap.TYPE_OR_VALUE_EXISTS: -- pass -- else: -- raise ValueError(f"You must specify a value to add for the attribute ({attr_name})") -- else: -- # Missing value -- raise ValueError("Missing attribute to add") -+ attr_values, _ = _parse_attr_value_pairs(args.attr) - -+ # Validate no values already exist -+ for attr_name, values in attr_values.items(): -+ existing_vals = set(conf.get_attr_vals_utf8(attr_name) or []) -+ duplicate_vals = values & existing_vals -+ if duplicate_vals: -+ raise ldap.ALREADY_EXISTS( -+ f"Values {duplicate_vals} already exist for attribute '{attr_name}'") -+ -+ _handle_attribute_operation(conf, "add", attr_values, log) - _config_display_ldapimaprootdn_warning(log, args) - - - def config_del_attr(inst, basedn, log, args): -- conf = Config(inst, basedn) -- final_mods = [] -+ if not args or not args.attr: -+ raise ValueError("Missing attribute to delete") - -- existing_attrs = _config_get_existing_attrs(conf, args, OpType.delete) -+ conf = Config(inst, basedn) -+ attr_values, attrs_to_remove = _parse_attr_value_pairs(args.attr, allow_no_value=True) -+ -+ # Handle complete attribute removal -+ for attr in attrs_to_remove: -+ try: -+ if conf.get_attr_vals_utf8(attr): -+ conf.remove_all(attr) -+ log.info(f"Removed attribute '{attr}' completely") -+ else: -+ log.warning(f"Attribute '{attr}' does not exist - skipping") -+ except ldap.NO_SUCH_ATTRIBUTE: -+ log.warning(f"Attribute '{attr}' does not exist - skipping") -+ -+ # Validate and handle value-specific deletion -+ if attr_values: -+ for attr_name, values in attr_values.items(): -+ try: -+ existing_values = set(conf.get_attr_vals_utf8(attr_name) or []) -+ values_to_delete = values & existing_values -+ values_not_found = values - existing_values -+ -+ if values_not_found: -+ formatted_values = _format_values_for_display(values_not_found) -+ log.warning(f"Values {formatted_values} do not exist for attribute '{attr_name}' - skipping") -+ -+ if values_to_delete: -+ remaining_values = existing_values - values_to_delete -+ if not remaining_values: -+ conf.remove_all(attr_name) -+ else: -+ conf.replace_many((attr_name, remaining_values)) -+ formatted_values = _format_values_for_display(values_to_delete) -+ log.info(f"Successfully deleted values {formatted_values} from '{attr_name}'") -+ except ldap.NO_SUCH_ATTRIBUTE: -+ log.warning(f"Attribute '{attr_name}' does not exist - skipping") - -- # Then add the attributes back all except the one we need to remove -- for attr_name in existing_attrs.keys(): -- for val in existing_attrs[attr_name]: -- final_mods.append((attr_name, val)) -- conf.add_many(*set(final_mods)) -+ _config_display_ldapimaprootdn_warning(log, args) - - - def create_parser(subparsers): --- -2.48.0 - diff --git a/SOURCES/0018-Issue-6561-TLS-1.2-stickiness-in-FIPS-mode.patch b/SOURCES/0009-Issue-6561-TLS-1.2-stickiness-in-FIPS-mode.patch similarity index 88% rename from SOURCES/0018-Issue-6561-TLS-1.2-stickiness-in-FIPS-mode.patch rename to SOURCES/0009-Issue-6561-TLS-1.2-stickiness-in-FIPS-mode.patch index 42751ec..93fef39 100644 --- a/SOURCES/0018-Issue-6561-TLS-1.2-stickiness-in-FIPS-mode.patch +++ b/SOURCES/0009-Issue-6561-TLS-1.2-stickiness-in-FIPS-mode.patch @@ -1,4 +1,4 @@ -From a71c12881604b5e37d64093aedd158aa112b39cc Mon Sep 17 00:00:00 2001 +From 116b7cf21618ad7e717ae7f535709508a824f7d9 Mon Sep 17 00:00:00 2001 From: Viktor Ashirov Date: Thu, 13 Feb 2025 16:37:43 +0100 Subject: [PATCH] Issue 6561 - TLS 1.2 stickiness in FIPS mode @@ -15,10 +15,10 @@ Reviewed by: @mreynolds389 (Thanks!) 1 file changed, 8 deletions(-) diff --git a/ldap/servers/slapd/ssl.c b/ldap/servers/slapd/ssl.c -index ef9e97fb9..329bd5c90 100644 +index 94259efe7..84a7fb004 100644 --- a/ldap/servers/slapd/ssl.c +++ b/ldap/servers/slapd/ssl.c -@@ -1914,14 +1914,6 @@ slapd_ssl_init2(PRFileDesc **fd, int startTLS) +@@ -1929,14 +1929,6 @@ slapd_ssl_init2(PRFileDesc **fd, int startTLS) */ sslStatus = SSL_VersionRangeGet(pr_sock, &slapdNSSVersions); if (sslStatus == SECSuccess) { diff --git a/SOURCES/0010-Issue-6090-dbscan-use-bdb-by-default.patch b/SOURCES/0010-Issue-6090-dbscan-use-bdb-by-default.patch new file mode 100644 index 0000000..f39eb11 --- /dev/null +++ b/SOURCES/0010-Issue-6090-dbscan-use-bdb-by-default.patch @@ -0,0 +1,44 @@ +From 39d91c4b86fc2ad7e35f8bebd510dff984e8ba56 Mon Sep 17 00:00:00 2001 +From: Viktor Ashirov +Date: Wed, 5 Mar 2025 23:46:02 +0100 +Subject: [PATCH] Issue 6090 - dbscan: use bdb by default + +Bug Description: +dbscan started to use mdb by default on versions where it's not the +default. + +Fix Description: +Use bdb by default on 2.x versions. + +Relates: https://github.com/389ds/389-ds-base/issues/6090 + +Reviewed by: @mreynolds389 (Thanks!) +--- + ldap/servers/slapd/tools/dbscan.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/ldap/servers/slapd/tools/dbscan.c b/ldap/servers/slapd/tools/dbscan.c +index 12edf7c5b..9260c1532 100644 +--- a/ldap/servers/slapd/tools/dbscan.c ++++ b/ldap/servers/slapd/tools/dbscan.c +@@ -1280,7 +1280,7 @@ removedb(const char *dbimpl_name, const char *filename) + + if (!filename) { + printf("Error: -f option is missing.\n" +- "Usage: dbscan -D mdb -d -f //\n"); ++ "Usage: dbscan -D bdb -d -f //\n"); + return 1; + } + +@@ -1314,7 +1314,7 @@ main(int argc, char **argv) + char *find_key = NULL; + uint32_t entry_id = 0xffffffff; + char *defdbimpl = getenv("NSSLAPD_DB_LIB"); +- char *dbimpl_name = (char*) "mdb"; ++ char *dbimpl_name = (char*) "bdb"; + int longopt_idx = 0; + int c = 0; + char optstring[2*COUNTOF(options)+1] = {0}; +-- +2.48.1 + diff --git a/SOURCES/0010-Issue-6417-If-an-entry-RDN-is-identical-to-the-suffi.patch b/SOURCES/0010-Issue-6417-If-an-entry-RDN-is-identical-to-the-suffi.patch deleted file mode 100644 index b7f8d34..0000000 --- a/SOURCES/0010-Issue-6417-If-an-entry-RDN-is-identical-to-the-suffi.patch +++ /dev/null @@ -1,200 +0,0 @@ -From 7ed791beda5d507e15c970a88289f533aa06b2d3 Mon Sep 17 00:00:00 2001 -From: tbordaz -Date: Mon, 2 Dec 2024 17:18:32 +0100 -Subject: [PATCH] Issue 6417 - If an entry RDN is identical to the suffix, then - Entryrdn gets broken during a reindex (#6418) - -Bug description: - During a reindex, the entryrdn index is built at the end from - each entry in the suffix. - If one entry has a RDN that is identical to the suffix DN, - then entryrdn_lookup_dn may erroneously return the suffix DN - as the DN of the entry. - -Fix description: - When the lookup entry has no parent (because index is under - work) the loop lookup the entry using the RDN. - If this RDN matches the suffix DN, then it exits from the loop - with the suffix DN. - Before exiting it checks that the original lookup entryID - is equal to suffix entryID. If it does not match - the function fails and then the DN from the entry will be - built from id2enty - -fixes: #6417 - -Reviewed by: Pierre Rogier, Simon Pichugin (Thanks !!!) ---- - .../tests/suites/indexes/entryrdn_test.py | 108 +++++++++++++++++- - .../back-ldbm/db-mdb/mdb_import_threads.c | 2 +- - ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c | 11 +- - 3 files changed, 118 insertions(+), 3 deletions(-) - -diff --git a/dirsrvtests/tests/suites/indexes/entryrdn_test.py b/dirsrvtests/tests/suites/indexes/entryrdn_test.py -index 345955d4d..7669292ab 100644 ---- a/dirsrvtests/tests/suites/indexes/entryrdn_test.py -+++ b/dirsrvtests/tests/suites/indexes/entryrdn_test.py -@@ -11,11 +11,16 @@ import os - import pytest - import ldap - import logging -+from lib389 import Entry - from lib389._constants import DEFAULT_BENAME, DEFAULT_SUFFIX --from lib389.backend import Backends -+from lib389.backend import Backends, Backend -+from lib389.mappingTree import MappingTrees -+from lib389.configurations.sample import create_base_domain -+from lib389.idm.domain import Domain - from lib389.idm.user import UserAccounts, UserAccount - from lib389.idm.organizationalunit import OrganizationalUnits - from lib389.topologies import topology_m2 as topo_m2 -+from lib389.topologies import topology_st - from lib389.agreement import Agreements - from lib389.utils import ds_is_older, ensure_bytes - from lib389.tasks import Tasks,ExportTask, ImportTask -@@ -283,6 +288,107 @@ def test_long_rdn(topo_m2): - ou.delete() - assert not ou.exists() - -+def test_entry_rdn_same_as_suffix(topology_st, request): -+ """ -+ Test that a reindex is successful even if an entry -+ has a RDN that is identical to the suffix -+ -+ :id: 7f5a38e9-b979-4664-b132-81df0e60f38a -+ :setup: standalone -+ :steps: -+ 1. Create a new backend with suffix 'dc=dup_rdn' (ID 1) -+ 2. Create a dummy entry 'ou=my_org,dc=dup_rdn' (ID 2) -+ 3. Create the problematic entry 'dc=dup_rdn,dc=dup_rdn' (ID 3) -+ 4. Create a dummy entry 'ou=my_org,dc=dup_rdn,dc=dup_rdn' (ID 4) -+ 5. Do an offline reindex -+ 6. Check that entryrdn contains the key P3 (parent of ID 3) -+ 7. Check that error log does not contain 'entryrdn_insert_key - Same DN' -+ :expectedresults: -+ 1. Should succeed -+ 2. Should succeed -+ 3. Should succeed -+ 4. Should succeed -+ 5. Should succeed -+ 6. Should succeed -+ 7. Should succeed -+ """ -+ inst = topology_st.standalone -+ -+ # Create a suffix 'dc=dup_rdn' -+ be_name = 'domain' -+ dc_value = 'dup_rdn' -+ suffix = 'dc=' + dc_value -+ rdn = 'my_org' -+ be1 = Backend(inst) -+ be1.create(properties={ -+ 'cn': be_name, -+ 'nsslapd-suffix': suffix, -+ }, -+ create_mapping_tree=False -+ ) -+ -+ mts = MappingTrees(inst) -+ mt = mts.create(properties={ -+ 'cn': suffix, -+ 'nsslapd-state': 'backend', -+ 'nsslapd-backend': be_name, -+ }) -+ -+ # Create the domain entry 'dc=dup_rdn' -+ create_base_domain(inst, suffix) -+ -+ # Create the org ou=my_org,dc=dup_rdn -+ ous = OrganizationalUnits(inst, suffix) -+ ou = ous.create(properties={ 'ou': rdn }) -+ -+ # when reindexing entryrdn the following entry -+ # (dc=dup_rdn,dc=dup_rdn) Triggers -+ # this message. -+ # This is because its RDN (dc=dup_rdn) is also -+ # the suffix DN -+ info_message = 'entryrdn_insert_key - Same DN (dn: %s) is already in the entryrdn file with different' % (ou.dn) -+ log.info("In case if the bug still exist this line should be in the error log") -+ log.info(" --> " + info_message) -+ -+ # Create the domain entry 'dc=dup_rdn,dc=dup_rdn' -+ trigger_entry = suffix + "," + suffix -+ domain = Domain(inst, dn=trigger_entry) -+ domain.create(properties={ -+ 'dc': dc_value, -+ 'description': 'Entry with RDN identical to suffix' -+ }) -+ -+ # Create the org ou=my_org,dc=dup_rdn,dc=dup_rdn -+ ous = OrganizationalUnits(inst, trigger_entry) -+ ou = ous.create(properties={ 'ou': rdn }) -+ -+ -+ # Trigger an offline reindex -+ log.info('Offline reindex, stopping the server') -+ topology_st.standalone.stop() -+ -+ log.info('Reindex all the suffix') -+ topology_st.standalone.db2index(bename=be_name) -+ -+ # make sure the key 'P3' (parent of 'dc=dup_rdn,dc=dup_rdn') exists -+ dbscanout = topology_st.standalone.dbscan(bename=be_name, index='entryrdn') -+ log.info(dbscanout) -+ assert(ensure_bytes('P3') in ensure_bytes(dbscanout)) -+ -+ # make sure there is no failure detected/logged in error logs -+ if topology_st.standalone.get_db_lib() == "mdb": -+ pattern_str = ".*Inconsistent id2entry database.*" -+ else: -+ pattern_str = ".*entryrdn_insert_key - Same DN.*is already in the entryrdn file with different.*$" -+ assert not topology_st.standalone.ds_error_log.match(pattern_str) -+ -+ -+ def fin(): -+ topology_st.standalone.restart() -+ mt.delete() -+ be1.delete() -+ -+ request.addfinalizer(fin) - - if __name__ == "__main__": - # Run isolated -diff --git a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c -index 143f2c9df..65f564aff 100644 ---- a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c -+++ b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c -@@ -731,7 +731,7 @@ get_entry_type(WorkerQueueData_t *wqelmt, Slapi_DN *sdn) - int len = SLAPI_ATTR_UNIQUEID_LENGTH; - const char *ndn = slapi_sdn_get_ndn(sdn); - -- if (slapi_be_issuffix(be, sdn)) { -+ if (slapi_be_issuffix(be, sdn) && (wqelmt->wait_id == 1)) { - return DNRC_SUFFIX; - } - if (PL_strncasecmp(ndn, SLAPI_ATTR_UNIQUEID, len) || ndn[len] != '=') { -diff --git a/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c b/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c -index 267957a36..8901b790a 100644 ---- a/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c -+++ b/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c -@@ -1077,7 +1077,16 @@ entryrdn_lookup_dn(backend *be, - _ENTRYRDN_DEBUG_GOTO_BAIL(); - goto bail; - } -- maybesuffix = 1; -+ if (workid == 1) { -+ /* The loop (workid) iterates from the starting 'id' -+ * up to the suffix ID (i.e. '1'). -+ * A corner case (#6417) is if an entry, on the path -+ * 'id' -> suffix, has the same RDN than the suffix. -+ * In order to erroneously believe the loop hits the suffix -+ * we need to check that 'workid' is '1' (suffix) -+ */ -+ maybesuffix = 1; -+ } - } else { - _entryrdn_cursor_print_error("entryrdn_lookup_dn", - key.data, data.size, data.ulen, rc); --- -2.48.1 - diff --git a/SOURCES/0011-Issue-6375-UI-Update-cockpit.js-code-to-the-latest-v.patch b/SOURCES/0011-Issue-6375-UI-Update-cockpit.js-code-to-the-latest-v.patch new file mode 100644 index 0000000..d00746e --- /dev/null +++ b/SOURCES/0011-Issue-6375-UI-Update-cockpit.js-code-to-the-latest-v.patch @@ -0,0 +1,49373 @@ +From 56ecde548b05b526150cb6df712b2bda9fbfc452 Mon Sep 17 00:00:00 2001 +From: Simon Pichugin +Date: Mon, 2 Dec 2024 18:55:00 -0500 +Subject: [PATCH] Issue 6375 - UI - Update cockpit.js code to the latest + version (#6376) + +Description: Update src/cockpit/389-console/pkg/lib/cockpit.js to the latest version. +Update the entire src/cockpit/389-console/pkg/lib directory from Cockpit's repository. +Update package.json. +Update 389 DS UI components to PF5. + +Fixes: https://github.com/389ds/389-ds-base/issues/6375 + +Reviewed by: @progier389, @mreynolds389 (Thanks!!) +--- + src/cockpit/389-console/build.js | 38 +- + src/cockpit/389-console/buildAndRun.sh | 2 +- + src/cockpit/389-console/package-lock.json | 13600 ++++++++++++---- + src/cockpit/389-console/package.json | 87 +- + src/cockpit/389-console/pkg/lib/README | 2 +- + .../lib/cockpit-components-context-menu.tsx | 103 + + .../pkg/lib/cockpit-components-dialog.jsx | 30 +- + .../pkg/lib/cockpit-components-dropdown.tsx | 83 + + .../lib/cockpit-components-dynamic-list.jsx | 143 + + .../lib/cockpit-components-dynamic-list.scss | 39 + + .../lib/cockpit-components-empty-state.jsx | 15 +- + .../cockpit-components-file-autocomplete.jsx | 21 +- + .../cockpit-components-firewalld-request.jsx | 2 +- + .../lib/cockpit-components-form-helper.tsx | 51 + + ...cockpit-components-inline-notification.tsx | 83 + + .../lib/cockpit-components-install-dialog.jsx | 2 +- + .../lib/cockpit-components-listing-panel.jsx | 2 +- + .../lib/cockpit-components-listing-panel.scss | 3 +- + .../pkg/lib/cockpit-components-logs-panel.jsx | 6 +- + .../lib/cockpit-components-modifications.jsx | 223 +- + .../pkg/lib/cockpit-components-password.jsx | 115 +- + .../pkg/lib/cockpit-components-password.scss | 4 + + .../pkg/lib/cockpit-components-plot.jsx | 48 +- + .../pkg/lib/cockpit-components-privileged.jsx | 13 +- + .../pkg/lib/cockpit-components-shutdown.jsx | 21 +- + .../pkg/lib/cockpit-components-table.jsx | 40 +- + .../pkg/lib/cockpit-components-table.scss | 14 - + .../pkg/lib/cockpit-components-terminal.jsx | 31 +- + .../pkg/lib/cockpit-components-truncate.jsx | 42 + + .../pkg/lib/cockpit-components-truncate.scss | 4 + + .../pkg/lib/cockpit-connect-ssh.tsx | 604 + + .../389-console/pkg/lib/cockpit-dark-theme.ts | 72 + + .../389-console/pkg/lib/cockpit-path.ts | 46 + + .../389-console/pkg/lib/cockpit-po-plugin.js | 75 +- + .../pkg/lib/cockpit-rsync-plugin.js | 3 +- + .../pkg/lib/cockpit-upload-helper.ts | 183 + + src/cockpit/389-console/pkg/lib/cockpit.d.ts | 327 + + src/cockpit/389-console/pkg/lib/cockpit.js | 1639 +- + .../pkg/lib/cockpit/_internal/base64.js | 65 + + .../pkg/lib/cockpit/_internal/channel.js | 245 + + .../pkg/lib/cockpit/_internal/common.ts | 97 + + .../pkg/lib/cockpit/_internal/deferred.js | 237 + + .../pkg/lib/cockpit/_internal/event-mixin.js | 62 + + .../pkg/lib/cockpit/_internal/location.ts | 62 + + .../lib/cockpit/_internal/parentwebsocket.ts | 58 + + .../pkg/lib/cockpit/_internal/transport.ts | 312 + + .../389-console/pkg/lib/cockpit/channel.ts | 287 + + .../389-console/pkg/lib/cockpit/event.ts | 36 + + .../389-console/pkg/lib/cockpit/fsinfo.ts | 150 + + src/cockpit/389-console/pkg/lib/console.css | 7 +- + .../389-console/pkg/lib/credentials.js | 227 +- + src/cockpit/389-console/pkg/lib/dialogs.tsx | 194 + + .../pkg/lib/esbuild-cleanup-plugin.js | 4 +- + .../389-console/pkg/lib/esbuild-common.js | 7 - + .../pkg/lib/esbuild-compress-plugin.js | 8 +- + .../pkg/lib/esbuild-test-html-plugin.js | 14 +- + .../pkg/lib/get-timesync-backend.py | 2 +- + src/cockpit/389-console/pkg/lib/hooks.ts | 337 + + src/cockpit/389-console/pkg/lib/html2po.js | 9 +- + src/cockpit/389-console/pkg/lib/inotify.py | 7 +- + src/cockpit/389-console/pkg/lib/journal.css | 2 +- + src/cockpit/389-console/pkg/lib/journal.js | 3 +- + src/cockpit/389-console/pkg/lib/kernelopt.sh | 72 + + .../pkg/lib/long-running-process.js | 2 +- + .../389-console/pkg/lib/machine-info.js | 4 +- + .../389-console/pkg/lib/manifest2po.js | 2 + + .../389-console/pkg/lib/notifications.js | 6 +- + src/cockpit/389-console/pkg/lib/os-release.js | 2 +- + src/cockpit/389-console/pkg/lib/packagekit.js | 31 +- + .../389-console/pkg/lib/pam_user_parser.ts | 95 + + .../pkg/lib/patternfly/_fonts.scss | 8 +- + .../patternfly/patternfly-5-overrides.scss | 312 +- + src/cockpit/389-console/pkg/lib/plot.js | 2 +- + src/cockpit/389-console/pkg/lib/polyfills.js | 2 +- + src/cockpit/389-console/pkg/lib/python.js | 2 +- + .../389-console/pkg/lib/qunit-tap.d.ts | 3 + + .../pkg/lib/qunit-template.html.in | 8 +- + .../389-console/pkg/lib/qunit-tests.ts | 108 + + src/cockpit/389-console/pkg/lib/serverTime.js | 95 +- + src/cockpit/389-console/pkg/lib/service.js | 2 +- + .../389-console/pkg/lib/ssh-add-key.sh | 25 + + .../pkg/lib/ssh-show-default-key.sh | 16 + + src/cockpit/389-console/pkg/lib/superuser.js | 2 +- + src/cockpit/389-console/pkg/lib/table.css | 16 +- + src/cockpit/389-console/pkg/lib/test-path.ts | 57 + + src/cockpit/389-console/pkg/lib/timeformat.ts | 83 + + src/cockpit/389-console/pkg/lib/utils.tsx | 85 + + src/cockpit/389-console/src/LDAPEditor.jsx | 21 +- + src/cockpit/389-console/src/database.jsx | 43 +- + src/cockpit/389-console/src/ds.jsx | 69 +- + src/cockpit/389-console/src/dsModals.jsx | 34 +- + .../src/lib/database/attrEncryption.jsx | 18 +- + .../389-console/src/lib/database/backups.jsx | 8 +- + .../389-console/src/lib/database/chaining.jsx | 144 +- + .../src/lib/database/databaseConfig.jsx | 20 +- + .../src/lib/database/databaseModal.jsx | 40 +- + .../src/lib/database/databaseTables.jsx | 846 +- + .../src/lib/database/globalPwp.jsx | 151 +- + .../389-console/src/lib/database/indexes.jsx | 72 +- + .../389-console/src/lib/database/localPwp.jsx | 254 +- + .../src/lib/database/referrals.jsx | 10 +- + .../389-console/src/lib/database/suffix.jsx | 59 +- + .../src/lib/database/suffixConfig.jsx | 14 +- + .../src/lib/database/vlvIndexes.jsx | 54 +- + .../src/lib/ldap_editor/lib/editableTable.jsx | 521 +- + .../lib/ldap_editor/lib/genericPagination.jsx | 218 +- + .../src/lib/ldap_editor/search.jsx | 118 +- + .../src/lib/ldap_editor/tableView.jsx | 226 +- + .../src/lib/ldap_editor/treeView.jsx | 80 +- + .../src/lib/ldap_editor/wizards/aci.jsx | 180 +- + .../src/lib/ldap_editor/wizards/cos.jsx | 6 +- + .../ldap_editor/wizards/deleteOperation.jsx | 24 +- + .../src/lib/ldap_editor/wizards/newEntry.jsx | 12 +- + .../wizards/operations/aciBindRuleTable.jsx | 85 +- + .../ldap_editor/wizards/operations/aciNew.jsx | 212 +- + .../wizards/operations/addCosDefinition.jsx | 96 +- + .../wizards/operations/addCosTemplate.jsx | 292 +- + .../wizards/operations/addGroup.jsx | 70 +- + .../wizards/operations/addLdapEntry.jsx | 204 +- + .../wizards/operations/addRole.jsx | 154 +- + .../wizards/operations/addUser.jsx | 141 +- + .../wizards/operations/editGroup.jsx | 4 +- + .../wizards/operations/editLdapEntry.jsx | 287 +- + .../wizards/operations/genericUpdate.jsx | 78 +- + .../wizards/operations/groupTable.jsx | 124 +- + .../wizards/operations/renameEntry.jsx | 50 +- + .../389-console/src/lib/monitor/accesslog.jsx | 25 +- + .../src/lib/monitor/auditfaillog.jsx | 23 +- + .../389-console/src/lib/monitor/auditlog.jsx | 23 +- + .../src/lib/monitor/chainingMonitor.jsx | 23 +- + .../389-console/src/lib/monitor/errorlog.jsx | 25 +- + .../src/lib/monitor/monitorModals.jsx | 34 +- + .../src/lib/monitor/monitorTables.jsx | 1534 +- + .../src/lib/monitor/replMonAgmts.jsx | 16 +- + .../src/lib/monitor/replMonConflict.jsx | 20 +- + .../src/lib/monitor/replMonTasks.jsx | 16 +- + .../src/lib/monitor/replMonWinsync.jsx | 16 +- + .../src/lib/monitor/replMonitor.jsx | 19 +- + .../src/lib/monitor/securitylog.jsx | 25 +- + .../src/lib/monitor/serverMonitor.jsx | 17 +- + .../src/lib/monitor/suffixMonitor.jsx | 12 +- + .../389-console/src/lib/notifications.jsx | 2 +- + .../src/lib/plugins/accountPolicy.jsx | 64 +- + .../src/lib/plugins/attributeUniqueness.jsx | 52 +- + .../src/lib/plugins/autoMembership.jsx | 60 +- + .../389-console/src/lib/plugins/dna.jsx | 70 +- + .../src/lib/plugins/linkedAttributes.jsx | 38 +- + .../src/lib/plugins/managedEntries.jsx | 153 +- + .../389-console/src/lib/plugins/memberOf.jsx | 106 +- + .../src/lib/plugins/pamPassThru.jsx | 56 +- + .../lib/plugins/passthroughAuthentication.jsx | 8 +- + .../src/lib/plugins/pluginBasicConfig.jsx | 6 +- + .../src/lib/plugins/pluginTables.jsx | 1673 +- + .../src/lib/plugins/referentialIntegrity.jsx | 82 +- + .../src/lib/plugins/retroChangelog.jsx | 44 +- + .../src/lib/plugins/rootDNAccessControl.jsx | 56 +- + .../389-console/src/lib/plugins/usn.jsx | 4 +- + .../389-console/src/lib/plugins/winsync.jsx | 18 +- + .../src/lib/replication/replAgmts.jsx | 14 +- + .../src/lib/replication/replChangelog.jsx | 4 +- + .../src/lib/replication/replConfig.jsx | 8 +- + .../src/lib/replication/replModals.jsx | 210 +- + .../src/lib/replication/replSuffix.jsx | 29 +- + .../src/lib/replication/replTables.jsx | 383 +- + .../src/lib/replication/replTasks.jsx | 30 +- + .../src/lib/replication/winsyncAgmts.jsx | 4 +- + .../src/lib/schema/schemaModals.jsx | 56 +- + .../src/lib/schema/schemaTables.jsx | 626 +- + .../389-console/src/lib/security/ciphers.jsx | 48 +- + .../src/lib/security/securityModals.jsx | 109 +- + .../src/lib/security/securityTables.jsx | 593 +- + .../389-console/src/lib/server/accessLog.jsx | 75 +- + .../389-console/src/lib/server/auditLog.jsx | 86 +- + .../src/lib/server/auditfailLog.jsx | 28 +- + .../389-console/src/lib/server/errorLog.jsx | 93 +- + .../389-console/src/lib/server/ldapi.jsx | 58 +- + .../389-console/src/lib/server/sasl.jsx | 56 +- + .../src/lib/server/securityLog.jsx | 159 +- + .../src/lib/server/serverModals.jsx | 22 +- + .../src/lib/server/serverTables.jsx | 273 +- + .../389-console/src/lib/server/settings.jsx | 128 +- + .../389-console/src/lib/server/tuning.jsx | 30 +- + src/cockpit/389-console/src/monitor.jsx | 28 +- + src/cockpit/389-console/src/plugins.jsx | 6 +- + src/cockpit/389-console/src/replication.jsx | 17 +- + src/cockpit/389-console/src/schema.jsx | 20 +- + src/cockpit/389-console/src/security.jsx | 96 +- + src/cockpit/389-console/src/server.jsx | 15 +- + 188 files changed, 23216 insertions(+), 10735 deletions(-) + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit-components-context-menu.tsx + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit-components-dropdown.tsx + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit-components-dynamic-list.jsx + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit-components-dynamic-list.scss + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit-components-form-helper.tsx + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit-components-inline-notification.tsx + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit-components-truncate.jsx + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit-components-truncate.scss + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit-connect-ssh.tsx + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit-dark-theme.ts + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit-path.ts + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit-upload-helper.ts + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit.d.ts + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit/_internal/base64.js + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit/_internal/channel.js + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit/_internal/common.ts + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit/_internal/deferred.js + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit/_internal/event-mixin.js + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit/_internal/location.ts + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit/_internal/parentwebsocket.ts + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit/_internal/transport.ts + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit/channel.ts + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit/event.ts + create mode 100644 src/cockpit/389-console/pkg/lib/cockpit/fsinfo.ts + create mode 100644 src/cockpit/389-console/pkg/lib/dialogs.tsx + create mode 100644 src/cockpit/389-console/pkg/lib/hooks.ts + create mode 100755 src/cockpit/389-console/pkg/lib/kernelopt.sh + create mode 100644 src/cockpit/389-console/pkg/lib/pam_user_parser.ts + create mode 100644 src/cockpit/389-console/pkg/lib/qunit-tap.d.ts + create mode 100644 src/cockpit/389-console/pkg/lib/qunit-tests.ts + create mode 100755 src/cockpit/389-console/pkg/lib/ssh-add-key.sh + create mode 100755 src/cockpit/389-console/pkg/lib/ssh-show-default-key.sh + create mode 100644 src/cockpit/389-console/pkg/lib/test-path.ts + create mode 100644 src/cockpit/389-console/pkg/lib/timeformat.ts + create mode 100644 src/cockpit/389-console/pkg/lib/utils.tsx + +diff --git a/src/cockpit/389-console/build.js b/src/cockpit/389-console/build.js +index 6b62d0100..55a7a4fb2 100755 +--- a/src/cockpit/389-console/build.js ++++ b/src/cockpit/389-console/build.js +@@ -2,6 +2,7 @@ + + import fs from 'node:fs'; + import path from 'node:path'; ++import process from 'node:process'; + import os from 'node:os'; + + import copy from 'esbuild-plugin-copy'; +@@ -11,16 +12,20 @@ import { cockpitCompressPlugin } from './pkg/lib/esbuild-compress-plugin.js'; + import { cockpitPoEsbuildPlugin } from './pkg/lib/cockpit-po-plugin.js'; + import { cockpitRsyncEsbuildPlugin } from './pkg/lib/cockpit-rsync-plugin.js'; + import { esbuildStylesPlugins } from './pkg/lib/esbuild-common.js'; +-import { eslintPlugin } from './pkg/lib/esbuild-eslint-plugin.js'; +-import { stylelintPlugin } from './pkg/lib/esbuild-stylelint-plugin.js'; + ++const production = process.env.NODE_ENV === 'production'; + const useWasm = os.arch() !== 'x64'; + const esbuild = (await import(useWasm ? 'esbuild-wasm' : 'esbuild')).default; + +-const production = process.env.NODE_ENV === 'production'; +-const watchMode = process.env.ESBUILD_WATCH === "true"; +-// linters dominate the build time, so disable them for production builds by default, but enable in watch mode +-const lint = process.env.LINT ? (process.env.LINT !== 0) : (watchMode || !production); ++const parser = (await import('argparse')).default.ArgumentParser(); ++parser.add_argument('-r', '--rsync', { help: "rsync bundles to ssh target after build", metavar: "HOST" }); ++parser.add_argument('-w', '--watch', { action: 'store_true', help: "Enable watch mode", default: process.env.ESBUILD_WATCH === "true" }); ++parser.add_argument('-m', '--metafile', { help: "Enable bundle size information file", metavar: "FILE" }); ++const args = parser.parse_args(); ++ ++if (args.rsync) ++ process.env.RSYNC = args.rsync; ++ + // List of directories to use when using import statements + const nodePaths = ['pkg/lib']; + const outdir = 'dist'; +@@ -47,15 +52,12 @@ function notifyEndPlugin() { + }; + } + +-const cwd = process.cwd(); +- + // similar to fs.watch(), but recursively watches all subdirectories + function watch_dirs(dir, on_change) { + const callback = (ev, dir, fname) => { + // only listen for "change" events, as renames are noisy + // ignore hidden files +- const isHidden = /^\./.test(fname); +- if (ev !== "change" || isHidden) { ++ if (ev !== "change" || fname.startsWith('.')) { + return; + } + on_change(path.join(dir, fname)); +@@ -81,18 +83,13 @@ const context = await esbuild.context({ + external: ['*.woff', '*.woff2', '*.jpg', '*.svg', '../../assets*'], // Allow external font files which live in ../../static/fonts + legalComments: 'external', // Move all legal comments to a .LEGAL.txt file + loader: { ".js": "jsx" }, ++ metafile: !!args.metafile, + minify: production, + nodePaths, + outdir, + target: ['es2020'], + plugins: [ + cleanPlugin(), +- ...lint +- ? [ +- stylelintPlugin({ filter: new RegExp(cwd + '\/src\/.*\.(css?|scss?)$') }), +- eslintPlugin({ filter: new RegExp(cwd + '\/src\/.*\.(jsx?|js?)$') }) +- ] +- : [], + // Esbuild will only copy assets that are explicitly imported and used + // in the code. This is a problem for index.html and manifest.json which are not imported + copy({ +@@ -110,14 +107,17 @@ const context = await esbuild.context({ + }); + + try { +- await context.rebuild(); ++ const result = await context.rebuild(); ++ if (args.metafile) { ++ fs.writeFileSync(args.metafile, JSON.stringify(result.metafile)); ++ } + } catch (e) { +- if (!watchMode) ++ if (!args.watch) + process.exit(1); + // ignore errors in watch mode + } + +-if (watchMode) { ++if (args.watch) { + const on_change = async path => { + console.log("change detected:", path); + await context.cancel(); +diff --git a/src/cockpit/389-console/buildAndRun.sh b/src/cockpit/389-console/buildAndRun.sh +index d46f94d62..ef78830ae 100755 +--- a/src/cockpit/389-console/buildAndRun.sh ++++ b/src/cockpit/389-console/buildAndRun.sh +@@ -12,5 +12,5 @@ if [ $? != 0 ]; then + fi + + printf "\nBuilding and watching ...\n" +-ESBUILD_WATCH=true ./build.js ++./build.js --watch + # npm run watch +diff --git a/src/cockpit/389-console/package-lock.json b/src/cockpit/389-console/package-lock.json +index 53b11978f..6a4063fc3 100644 +--- a/src/cockpit/389-console/package-lock.json ++++ b/src/cockpit/389-console/package-lock.json +@@ -1,7 +1,7 @@ + { + "name": "389-console", + "version": "1.0.0", +- "lockfileVersion": 3, ++ "lockfileVersion": 2, + "requires": true, + "packages": { + "": { +@@ -12,459 +12,101 @@ + "@fortawesome/fontawesome-svg-core": "^1.2.34", + "@fortawesome/free-solid-svg-icons": "^5.15.2", + "@fortawesome/react-fontawesome": "^0.1.14", +- "@patternfly/patternfly": ">=4.90.3", +- "@patternfly/react-charts": "^6.34.1", +- "@patternfly/react-core": "^4.181.1", +- "@patternfly/react-icons": "^4.8.4", +- "@patternfly/react-styles": "^4.92.6", +- "@patternfly/react-table": "^4.50.1", ++ "@patternfly/patternfly": "5.4.1", ++ "@patternfly/react-charts": "7.4.3", ++ "@patternfly/react-core": "5.4.1", ++ "@patternfly/react-icons": "5.4.0", ++ "@patternfly/react-styles": "5.4.0", ++ "@patternfly/react-table": "5.4.1", ++ "@patternfly/react-tokens": "5.4.0", ++ "@xterm/addon-canvas": "0.7.0", ++ "@xterm/xterm": "5.5.0", ++ "dequal": "2.0.3", + "eslint-plugin-react-hooks": "^4.2.0", + "gettext-parser": "^2.0.0", +- "prop-types": "^15.7.2", +- "react": "17.0.2", +- "react-dom": "17.0.2" ++ "js-sha1": "0.7.0", ++ "js-sha256": "0.11.0", ++ "json-stable-stringify-without-jsonify": "1.0.1", ++ "prop-types": "15.8.1", ++ "react": "18.3.1", ++ "react-dom": "18.3.1", ++ "remarkable": "2.0.1", ++ "throttle-debounce": "5.0.2", ++ "uuid": "10.0.0" + }, + "devDependencies": { +- "argparse": "^2.0.1", ++ "@types/qunit": "^2.19.10", ++ "@types/react": "18.3.11", ++ "@types/react-dom": "18.3.0", ++ "@typescript-eslint/eslint-plugin": "8.8.0", ++ "argparse": "2.0.1", + "chrome-remote-interface": "^0.32.1", +- "esbuild": "^0.17.15", +- "esbuild-plugin-copy": "^2.1.1", +- "esbuild-plugin-replace": "^1.3.0", +- "esbuild-sass-plugin": "^2.8.0", +- "esbuild-wasm": "^0.17.16", +- "eslint": "^8.13.0", +- "eslint-config-standard": "^17.0.0-1", +- "eslint-config-standard-jsx": "^11.0.0-1", +- "eslint-config-standard-react": "^13.0.0", +- "eslint-plugin-flowtype": "^8.0.3", +- "eslint-plugin-import": "^2.26.0", +- "eslint-plugin-node": "^11.1.0", +- "eslint-plugin-promise": "^6.0.0", +- "eslint-plugin-react": "^7.29.4", +- "eslint-plugin-react-hooks": "^4.4.0", +- "htmlparser": "^1.7.7", +- "jed": "^1.1.1", ++ "esbuild": "0.24.0", ++ "esbuild-plugin-copy": "2.1.1", ++ "esbuild-plugin-replace": "1.4.0", ++ "esbuild-sass-plugin": "3.3.1", ++ "esbuild-wasm": "0.24.0", ++ "eslint": "8.57.1", ++ "eslint-config-standard": "17.1.0", ++ "eslint-config-standard-jsx": "11.0.0", ++ "eslint-config-standard-react": "13.0.0", ++ "eslint-plugin-import": "2.31.0", ++ "eslint-plugin-jsx-a11y": "6.10.0", ++ "eslint-plugin-node": "11.1.0", ++ "eslint-plugin-promise": "6.6.0", ++ "eslint-plugin-react": "7.37.1", ++ "eslint-plugin-react-hooks": "4.6.2", ++ "glob": "11.0.0", ++ "htmlparser": "1.7.7", ++ "jed": "1.1.1", + "po2json": "^1.0.0-alpha", +- "qunit": "^2.9.3", +- "sass": "^1.61.0", +- "sizzle": "^2.3.3", +- "stylelint": "^15.10.1", +- "stylelint-config-standard": "^33.0.0", +- "stylelint-config-standard-scss": "^10.0.0", +- "stylelint-formatter-pretty": "^3.2.0" +- } +- }, +- "node_modules/@aashutoshrathi/word-wrap": { +- "version": "1.2.6", +- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", +- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", +- "dev": true, +- "engines": { +- "node": ">=0.10.0" +- } +- }, +- "node_modules/@ampproject/remapping": { +- "version": "2.2.1", +- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", +- "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@jridgewell/gen-mapping": "^0.3.0", +- "@jridgewell/trace-mapping": "^0.3.9" +- }, +- "engines": { +- "node": ">=6.0.0" ++ "qunit": "2.22.0", ++ "qunit-tap": "1.5.1", ++ "sass": "1.79.4", ++ "sizzle": "2.3.10", ++ "stylelint": "16.9.0", ++ "stylelint-config-recommended-scss": "14.0.0", ++ "stylelint-config-standard": "36.0.1", ++ "stylelint-config-standard-scss": "13.1.0", ++ "stylelint-formatter-pretty": "4.0.1", ++ "stylelint-use-logical-spec": "5.0.1", ++ "typescript": "^5.3.3" + } + }, + "node_modules/@babel/code-frame": { +- "version": "7.22.13", +- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", +- "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", +- "dev": true, +- "dependencies": { +- "@babel/highlight": "^7.22.13", +- "chalk": "^2.4.2" +- }, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/compat-data": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", +- "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", +- "dev": true, +- "peer": true, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/core": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", +- "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@ampproject/remapping": "^2.2.0", +- "@babel/code-frame": "^7.22.5", +- "@babel/generator": "^7.22.5", +- "@babel/helper-compilation-targets": "^7.22.5", +- "@babel/helper-module-transforms": "^7.22.5", +- "@babel/helpers": "^7.22.5", +- "@babel/parser": "^7.22.5", +- "@babel/template": "^7.22.5", +- "@babel/traverse": "^7.22.5", +- "@babel/types": "^7.22.5", +- "convert-source-map": "^1.7.0", +- "debug": "^4.1.0", +- "gensync": "^1.0.0-beta.2", +- "json5": "^2.2.2", +- "semver": "^6.3.0" +- }, +- "engines": { +- "node": ">=6.9.0" +- }, +- "funding": { +- "type": "opencollective", +- "url": "https://opencollective.com/babel" +- } +- }, +- "node_modules/@babel/generator": { +- "version": "7.23.0", +- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", +- "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/types": "^7.23.0", +- "@jridgewell/gen-mapping": "^0.3.2", +- "@jridgewell/trace-mapping": "^0.3.17", +- "jsesc": "^2.5.1" +- }, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/helper-annotate-as-pure": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", +- "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/types": "^7.22.5" +- }, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/helper-compilation-targets": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", +- "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/compat-data": "^7.22.5", +- "@babel/helper-validator-option": "^7.22.5", +- "browserslist": "^4.21.3", +- "lru-cache": "^5.1.1", +- "semver": "^6.3.0" +- }, +- "engines": { +- "node": ">=6.9.0" +- }, +- "peerDependencies": { +- "@babel/core": "^7.0.0" +- } +- }, +- "node_modules/@babel/helper-environment-visitor": { +- "version": "7.22.20", +- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", +- "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", ++ "version": "7.26.2", ++ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", ++ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, +- "peer": true, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/helper-function-name": { +- "version": "7.23.0", +- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", +- "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/template": "^7.22.15", +- "@babel/types": "^7.23.0" +- }, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/helper-hoist-variables": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", +- "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/types": "^7.22.5" +- }, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/helper-module-imports": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", +- "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/types": "^7.22.5" +- }, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/helper-module-transforms": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", +- "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/helper-environment-visitor": "^7.22.5", +- "@babel/helper-module-imports": "^7.22.5", +- "@babel/helper-simple-access": "^7.22.5", +- "@babel/helper-split-export-declaration": "^7.22.5", +- "@babel/helper-validator-identifier": "^7.22.5", +- "@babel/template": "^7.22.5", +- "@babel/traverse": "^7.22.5", +- "@babel/types": "^7.22.5" +- }, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/helper-plugin-utils": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", +- "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", +- "dev": true, +- "peer": true, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/helper-simple-access": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", +- "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/types": "^7.22.5" +- }, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/helper-split-export-declaration": { +- "version": "7.22.6", +- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", +- "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", +- "dev": true, +- "peer": true, + "dependencies": { +- "@babel/types": "^7.22.5" ++ "@babel/helper-validator-identifier": "^7.25.9", ++ "js-tokens": "^4.0.0", ++ "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, +- "node_modules/@babel/helper-string-parser": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", +- "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", +- "dev": true, +- "peer": true, +- "engines": { +- "node": ">=6.9.0" +- } +- }, + "node_modules/@babel/helper-validator-identifier": { +- "version": "7.22.20", +- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", +- "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", +- "dev": true, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/helper-validator-option": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", +- "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", +- "dev": true, +- "peer": true, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/helpers": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", +- "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/template": "^7.22.5", +- "@babel/traverse": "^7.22.5", +- "@babel/types": "^7.22.5" +- }, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/highlight": { +- "version": "7.22.20", +- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", +- "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", +- "dev": true, +- "dependencies": { +- "@babel/helper-validator-identifier": "^7.22.20", +- "chalk": "^2.4.2", +- "js-tokens": "^4.0.0" +- }, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/parser": { +- "version": "7.23.0", +- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", +- "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", +- "dev": true, +- "peer": true, +- "bin": { +- "parser": "bin/babel-parser.js" +- }, +- "engines": { +- "node": ">=6.0.0" +- } +- }, +- "node_modules/@babel/plugin-syntax-flow": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", +- "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/helper-plugin-utils": "^7.22.5" +- }, +- "engines": { +- "node": ">=6.9.0" +- }, +- "peerDependencies": { +- "@babel/core": "^7.0.0-0" +- } +- }, +- "node_modules/@babel/plugin-syntax-jsx": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", +- "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/helper-plugin-utils": "^7.22.5" +- }, +- "engines": { +- "node": ">=6.9.0" +- }, +- "peerDependencies": { +- "@babel/core": "^7.0.0-0" +- } +- }, +- "node_modules/@babel/plugin-transform-react-jsx": { +- "version": "7.22.5", +- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", +- "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/helper-annotate-as-pure": "^7.22.5", +- "@babel/helper-module-imports": "^7.22.5", +- "@babel/helper-plugin-utils": "^7.22.5", +- "@babel/plugin-syntax-jsx": "^7.22.5", +- "@babel/types": "^7.22.5" +- }, +- "engines": { +- "node": ">=6.9.0" +- }, +- "peerDependencies": { +- "@babel/core": "^7.0.0-0" +- } +- }, +- "node_modules/@babel/template": { +- "version": "7.22.15", +- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", +- "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/code-frame": "^7.22.13", +- "@babel/parser": "^7.22.15", +- "@babel/types": "^7.22.15" +- }, +- "engines": { +- "node": ">=6.9.0" +- } +- }, +- "node_modules/@babel/traverse": { +- "version": "7.23.2", +- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", +- "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", ++ "version": "7.25.9", ++ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", ++ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/code-frame": "^7.22.13", +- "@babel/generator": "^7.23.0", +- "@babel/helper-environment-visitor": "^7.22.20", +- "@babel/helper-function-name": "^7.23.0", +- "@babel/helper-hoist-variables": "^7.22.5", +- "@babel/helper-split-export-declaration": "^7.22.6", +- "@babel/parser": "^7.23.0", +- "@babel/types": "^7.23.0", +- "debug": "^4.1.0", +- "globals": "^11.1.0" +- }, + "engines": { + "node": ">=6.9.0" + } + }, +- "node_modules/@babel/types": { +- "version": "7.23.0", +- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", +- "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", ++ "node_modules/@bufbuild/protobuf": { ++ "version": "2.2.3", ++ "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.3.tgz", ++ "integrity": "sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==", + "dev": true, +- "peer": true, +- "dependencies": { +- "@babel/helper-string-parser": "^7.22.5", +- "@babel/helper-validator-identifier": "^7.22.20", +- "to-fast-properties": "^2.0.0" +- }, +- "engines": { +- "node": ">=6.9.0" +- } ++ "peer": true + }, + "node_modules/@csstools/css-parser-algorithms": { +- "version": "2.3.0", +- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.0.tgz", +- "integrity": "sha512-dTKSIHHWc0zPvcS5cqGP+/TPFUJB0ekJ9dGKvMAFoNuBFhDPBt9OMGNZiIA5vTiNdGHHBeScYPXIGBMnVOahsA==", ++ "version": "3.0.4", ++ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", ++ "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { +@@ -477,29 +119,35 @@ + } + ], + "engines": { +- "node": "^14 || ^16 || >=18" ++ "node": ">=18" + }, + "peerDependencies": { +- "@csstools/css-tokenizer": "^2.1.1" ++ "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { +- "version": "2.1.1", +- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.1.1.tgz", +- "integrity": "sha512-GbrTj2Z8MCTUv+52GE0RbFGM527xuXZ0Xa5g0Z+YN573uveS4G0qi6WNOMyz3yrFM/jaILTTwJ0+umx81EzqfA==", ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", ++ "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/csstools" ++ }, ++ { ++ "type": "opencollective", ++ "url": "https://opencollective.com/csstools" ++ } ++ ], + "engines": { +- "node": "^14 || ^16 || >=18" +- }, +- "funding": { +- "type": "opencollective", +- "url": "https://opencollective.com/csstools" ++ "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { +- "version": "2.1.2", +- "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.2.tgz", +- "integrity": "sha512-M8cFGGwl866o6++vIY7j1AKuq9v57cf+dGepScwCcbut9ypJNr4Cj+LLTWligYUZ0uyhEoJDKt5lvyBfh2L3ZQ==", ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", ++ "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "dev": true, + "funding": [ + { +@@ -512,17 +160,17 @@ + } + ], + "engines": { +- "node": "^14 || ^16 || >=18" ++ "node": ">=18" + }, + "peerDependencies": { +- "@csstools/css-parser-algorithms": "^2.3.0", +- "@csstools/css-tokenizer": "^2.1.1" ++ "@csstools/css-parser-algorithms": "^3.0.1", ++ "@csstools/css-tokenizer": "^3.0.1" + } + }, + "node_modules/@csstools/selector-specificity": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", +- "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", ++ "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", + "dev": true, + "funding": [ + { +@@ -535,16 +183,42 @@ + } + ], + "engines": { +- "node": "^14 || ^16 || >=18" ++ "node": ">=18" + }, + "peerDependencies": { +- "postcss-selector-parser": "^6.0.13" ++ "postcss-selector-parser": "^6.1.0" ++ } ++ }, ++ "node_modules/@dual-bundle/import-meta-resolve": { ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", ++ "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", ++ "dev": true, ++ "funding": { ++ "type": "github", ++ "url": "https://github.com/sponsors/wooorm" ++ } ++ }, ++ "node_modules/@esbuild/aix-ppc64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", ++ "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", ++ "cpu": [ ++ "ppc64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "aix" ++ ], ++ "engines": { ++ "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", +- "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", ++ "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], +@@ -554,13 +228,13 @@ + "android" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", +- "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", ++ "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], +@@ -570,13 +244,13 @@ + "android" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", +- "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", ++ "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], +@@ -586,13 +260,13 @@ + "android" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", +- "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", ++ "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], +@@ -602,13 +276,13 @@ + "darwin" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", +- "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", ++ "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], +@@ -618,13 +292,13 @@ + "darwin" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", +- "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", ++ "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], +@@ -634,13 +308,13 @@ + "freebsd" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", +- "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", ++ "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], +@@ -650,13 +324,13 @@ + "freebsd" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", +- "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", ++ "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], +@@ -666,13 +340,13 @@ + "linux" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", +- "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", ++ "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], +@@ -682,13 +356,13 @@ + "linux" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", +- "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", ++ "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], +@@ -698,13 +372,13 @@ + "linux" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", +- "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", ++ "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], +@@ -714,13 +388,13 @@ + "linux" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", +- "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", ++ "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], +@@ -730,13 +404,13 @@ + "linux" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", +- "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", ++ "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], +@@ -746,13 +420,13 @@ + "linux" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", +- "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", ++ "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], +@@ -762,13 +436,13 @@ + "linux" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", +- "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", ++ "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], +@@ -778,13 +452,13 @@ + "linux" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", +- "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", ++ "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], +@@ -794,13 +468,13 @@ + "linux" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", +- "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", ++ "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], +@@ -810,13 +484,29 @@ + "netbsd" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" ++ } ++ }, ++ "node_modules/@esbuild/openbsd-arm64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", ++ "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "openbsd" ++ ], ++ "engines": { ++ "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", +- "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", ++ "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], +@@ -826,13 +516,13 @@ + "openbsd" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", +- "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", ++ "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], +@@ -842,13 +532,13 @@ + "sunos" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", +- "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", ++ "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], +@@ -858,13 +548,13 @@ + "win32" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", +- "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", ++ "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], +@@ -874,13 +564,13 @@ + "win32" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", +- "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", ++ "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], +@@ -890,42 +580,45 @@ + "win32" + ], + "engines": { +- "node": ">=12" ++ "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { +- "version": "4.4.0", +- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", +- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", ++ "version": "4.4.1", ++ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", ++ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "dependencies": { +- "eslint-visitor-keys": "^3.3.0" ++ "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" ++ }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { +- "version": "4.5.1", +- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", +- "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", ++ "version": "4.12.1", ++ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", ++ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { +- "version": "2.0.3", +- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", +- "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", ++ "version": "2.1.4", ++ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", ++ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", +- "espree": "^9.5.2", ++ "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", +@@ -940,37 +633,32 @@ + "url": "https://opencollective.com/eslint" + } + }, +- "node_modules/@eslint/eslintrc/node_modules/globals": { +- "version": "13.20.0", +- "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", +- "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", ++ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { +- "type-fest": "^0.20.2" +- }, +- "engines": { +- "node": ">=8" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" + } + }, +- "node_modules/@eslint/eslintrc/node_modules/type-fest": { +- "version": "0.20.2", +- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", +- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", ++ "node_modules/@eslint/eslintrc/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, +- "engines": { +- "node": ">=10" ++ "dependencies": { ++ "brace-expansion": "^1.1.7" + }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "engines": { ++ "node": "*" + } + }, + "node_modules/@eslint/js": { +- "version": "8.42.0", +- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", +- "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", ++ "version": "8.57.1", ++ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", ++ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +@@ -1022,19 +710,42 @@ + } + }, + "node_modules/@humanwhocodes/config-array": { +- "version": "0.11.10", +- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", +- "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", ++ "version": "0.13.0", ++ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", ++ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", ++ "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { +- "@humanwhocodes/object-schema": "^1.2.1", +- "debug": "^4.1.1", ++ "@humanwhocodes/object-schema": "^2.0.3", ++ "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, ++ "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "dependencies": { ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", +@@ -1049,71 +760,56 @@ + } + }, + "node_modules/@humanwhocodes/object-schema": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", +- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", ++ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", ++ "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, +- "node_modules/@jridgewell/gen-mapping": { +- "version": "0.3.3", +- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", +- "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", ++ "node_modules/@isaacs/cliui": { ++ "version": "8.0.2", ++ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", ++ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, +- "peer": true, + "dependencies": { +- "@jridgewell/set-array": "^1.0.1", +- "@jridgewell/sourcemap-codec": "^1.4.10", +- "@jridgewell/trace-mapping": "^0.3.9" ++ "string-width": "^5.1.2", ++ "string-width-cjs": "npm:string-width@^4.2.0", ++ "strip-ansi": "^7.0.1", ++ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", ++ "wrap-ansi": "^8.1.0", ++ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { +- "node": ">=6.0.0" +- } +- }, +- "node_modules/@jridgewell/resolve-uri": { +- "version": "3.1.0", +- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", +- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", +- "dev": true, +- "peer": true, +- "engines": { +- "node": ">=6.0.0" ++ "node": ">=12" + } + }, +- "node_modules/@jridgewell/set-array": { +- "version": "1.1.2", +- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", +- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", ++ "node_modules/@isaacs/cliui/node_modules/ansi-regex": { ++ "version": "6.1.0", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", ++ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, +- "peer": true, + "engines": { +- "node": ">=6.0.0" ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, +- "node_modules/@jridgewell/sourcemap-codec": { +- "version": "1.4.15", +- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", +- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", +- "dev": true, +- "peer": true +- }, +- "node_modules/@jridgewell/trace-mapping": { +- "version": "0.3.18", +- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", +- "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", ++ "node_modules/@isaacs/cliui/node_modules/strip-ansi": { ++ "version": "7.1.0", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", ++ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, +- "peer": true, + "dependencies": { +- "@jridgewell/resolve-uri": "3.1.0", +- "@jridgewell/sourcemap-codec": "1.4.14" ++ "ansi-regex": "^6.0.1" ++ }, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, +- "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { +- "version": "1.4.14", +- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", +- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", +- "dev": true, +- "peer": true +- }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", +@@ -1150,149 +846,155 @@ + } + }, + "node_modules/@patternfly/patternfly": { +- "version": "4.224.2", +- "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-4.224.2.tgz", +- "integrity": "sha512-HGNV26uyHSIECuhjPg/WGn0mXbAotcs6ODfhAOkfYjIgGylddgiwElxUe1rpEHV5mQJJ2rMn4OdeJIIpzRX61g==" ++ "version": "5.4.1", ++ "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.4.1.tgz", ++ "integrity": "sha512-0+KxsQJrFzOMANALW82BHAO7bSm9tEbG1RrOlGT23ME1CaBoetGSMRLymutvojn/b/EKfJIr5rLzQa+14Lvg2g==" + }, + "node_modules/@patternfly/react-charts": { +- "version": "6.94.19", +- "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-6.94.19.tgz", +- "integrity": "sha512-+yYwXAy/GBH2bTHFzMpdVKc8LUJCCNEqqS7bqovNkNLd0m3FP3q9fKJ22QxNnP9NeFHK6UFa4KfouQAb2fInfQ==", ++ "version": "7.4.3", ++ "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-7.4.3.tgz", ++ "integrity": "sha512-HW55rc7UtuiUSk5kUEdCsbfU+/lVPXDruebQKxzImseiyjeLL3e3Tb8L778ga6Kt0YKaUTaqETuprR9ucRA0+w==", + "dependencies": { +- "@patternfly/react-styles": "^4.92.6", +- "@patternfly/react-tokens": "^4.94.6", +- "hoist-non-react-statics": "^3.3.0", +- "lodash": "^4.17.19", +- "tslib": "^2.0.0", +- "victory-area": "^36.6.7", +- "victory-axis": "^36.6.7", +- "victory-bar": "^36.6.7", +- "victory-chart": "^36.6.7", +- "victory-core": "^36.6.7", +- "victory-create-container": "^36.6.7", +- "victory-cursor-container": "^36.6.7", +- "victory-group": "^36.6.7", +- "victory-legend": "^36.6.7", +- "victory-line": "^36.6.7", +- "victory-pie": "^36.6.7", +- "victory-scatter": "^36.6.7", +- "victory-stack": "^36.6.7", +- "victory-tooltip": "^36.6.7", +- "victory-voronoi-container": "^36.6.7", +- "victory-zoom-container": "^36.6.7" ++ "@patternfly/react-styles": "^5.4.0", ++ "@patternfly/react-tokens": "^5.4.0", ++ "hoist-non-react-statics": "^3.3.2", ++ "lodash": "^4.17.21", ++ "tslib": "^2.6.3", ++ "victory-area": "^37.1.1", ++ "victory-axis": "^37.1.1", ++ "victory-bar": "^37.1.1", ++ "victory-box-plot": "^37.1.1", ++ "victory-chart": "^37.1.1", ++ "victory-core": "^37.1.1", ++ "victory-create-container": "^37.1.1", ++ "victory-cursor-container": "^37.1.1", ++ "victory-group": "^37.1.1", ++ "victory-legend": "^37.1.1", ++ "victory-line": "^37.1.1", ++ "victory-pie": "^37.1.1", ++ "victory-scatter": "^37.1.1", ++ "victory-stack": "^37.1.1", ++ "victory-tooltip": "^37.1.1", ++ "victory-voronoi-container": "^37.1.1", ++ "victory-zoom-container": "^37.1.1" + }, + "peerDependencies": { +- "react": "^16.8 || ^17 || ^18", +- "react-dom": "^16.8 || ^17 || ^18" ++ "react": "^17 || ^18", ++ "react-dom": "^17 || ^18" + } + }, + "node_modules/@patternfly/react-core": { +- "version": "4.276.8", +- "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-4.276.8.tgz", +- "integrity": "sha512-dn322rEzBeiVztZEuCZMUUittNb8l1hk30h9ZN31FLZLLVtXGlThFNV9ieqOJYA9zrYxYZrHMkTnOxSWVacMZg==", +- "dependencies": { +- "@patternfly/react-icons": "^4.93.6", +- "@patternfly/react-styles": "^4.92.6", +- "@patternfly/react-tokens": "^4.94.6", +- "focus-trap": "6.9.2", +- "react-dropzone": "9.0.0", +- "tippy.js": "5.1.2", +- "tslib": "^2.0.0" ++ "version": "5.4.1", ++ "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.4.1.tgz", ++ "integrity": "sha512-PJjwN4OCR7jTdWKi0RzuFdtlSQ8gBR+0REczuDHHPW8ky0bs1cIcqGsn5p/b6OgPlztl3UaXqRYLsroiEMasOw==", ++ "dependencies": { ++ "@patternfly/react-icons": "^5.4.0", ++ "@patternfly/react-styles": "^5.4.0", ++ "@patternfly/react-tokens": "^5.4.0", ++ "focus-trap": "7.5.4", ++ "react-dropzone": "^14.2.3", ++ "tslib": "^2.6.3" + }, + "peerDependencies": { +- "react": "^16.8 || ^17 || ^18", +- "react-dom": "^16.8 || ^17 || ^18" ++ "react": "^17 || ^18", ++ "react-dom": "^17 || ^18" + } + }, + "node_modules/@patternfly/react-icons": { +- "version": "4.93.6", +- "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-4.93.6.tgz", +- "integrity": "sha512-ZrXegc/81oiuTIeWvoHb3nG/eZODbB4rYmekBEsrbiysyO7m/sUFoi/RLvgFINrRoh6YCJqL5fj06Jg6d7jX1g==", ++ "version": "5.4.0", ++ "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.4.0.tgz", ++ "integrity": "sha512-2M3qN/naultvRHeG2laJMmoIroFCGAyfwTVrnCjSkG6/KnRoXV0+dqd+Xrh7xzpzvIJB1klvifC0oX42cEkDrA==", + "peerDependencies": { +- "react": "^16.8 || ^17 || ^18", +- "react-dom": "^16.8 || ^17 || ^18" ++ "react": "^17 || ^18", ++ "react-dom": "^17 || ^18" + } + }, + "node_modules/@patternfly/react-styles": { +- "version": "4.92.6", +- "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-4.92.6.tgz", +- "integrity": "sha512-b8uQdEReMyeoMzjpMri845QxqtupY/tIFFYfVeKoB2neno8gkcW1RvDdDe62LF88q45OktCwAe/8A99ker10Iw==" ++ "version": "5.4.0", ++ "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.4.0.tgz", ++ "integrity": "sha512-4ZE0s6LkX/0KsN0FOeogrDoj18m+BPA73YKnabZGB4SDRzrBNeBh2a6bSt546ZseEjkoJ+S81kOG0G8YckPQYg==" + }, + "node_modules/@patternfly/react-table": { +- "version": "4.113.0", +- "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-4.113.0.tgz", +- "integrity": "sha512-qxa3NWCdYasqQQL1rqEd8DyNa8oWr6HNveNW5YJRakE7imWZhUPG2Nd6Op60+KYX8kbCSl7gwSmgAZAYMBMZkQ==", +- "dependencies": { +- "@patternfly/react-core": "^4.276.8", +- "@patternfly/react-icons": "^4.93.6", +- "@patternfly/react-styles": "^4.92.6", +- "@patternfly/react-tokens": "^4.94.6", +- "lodash": "^4.17.19", +- "tslib": "^2.0.0" ++ "version": "5.4.1", ++ "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.4.1.tgz", ++ "integrity": "sha512-T05djy6YPqjbGWjpnwUs9oqup8oqqIOBnDOcThnHukgzlwnZvLNywgdoMR5XAKxTcIx/iBE1cu8ieETlITOGLw==", ++ "dependencies": { ++ "@patternfly/react-core": "^5.4.1", ++ "@patternfly/react-icons": "^5.4.0", ++ "@patternfly/react-styles": "^5.4.0", ++ "@patternfly/react-tokens": "^5.4.0", ++ "lodash": "^4.17.21", ++ "tslib": "^2.6.3" + }, + "peerDependencies": { +- "react": "^16.8 || ^17 || ^18", +- "react-dom": "^16.8 || ^17 || ^18" ++ "react": "^17 || ^18", ++ "react-dom": "^17 || ^18" + } + }, + "node_modules/@patternfly/react-tokens": { +- "version": "4.94.6", +- "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-4.94.6.tgz", +- "integrity": "sha512-tm7C6nat+uKMr1hrapis7hS3rN9cr41tpcCKhx6cod6FLU8KwF2Yt5KUxakhIOCEcE/M/EhXhAw/qejp8w0r7Q==" ++ "version": "5.4.0", ++ "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.4.0.tgz", ++ "integrity": "sha512-KONkwCVOMyklhuuaYeYgcAsGtCBQXnsBGZeolhOdSzr2Mj0RVSW0oMrQPgZuPVzhhC/kbqgClHJJl6xuG9xheA==" ++ }, ++ "node_modules/@rtsao/scc": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", ++ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", ++ "dev": true + }, + "node_modules/@types/d3-array": { +- "version": "3.0.5", +- "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", +- "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==" ++ "version": "3.2.1", ++ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", ++ "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "node_modules/@types/d3-color": { +- "version": "3.1.0", +- "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", +- "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" ++ "version": "3.1.3", ++ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", ++ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "node_modules/@types/d3-ease": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", +- "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" ++ "version": "3.0.2", ++ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", ++ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + }, + "node_modules/@types/d3-interpolate": { +- "version": "3.0.1", +- "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", +- "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", ++ "version": "3.0.4", ++ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", ++ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", +- "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", ++ "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" + }, + "node_modules/@types/d3-scale": { +- "version": "4.0.3", +- "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", +- "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", ++ "version": "4.0.8", ++ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", ++ "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { +- "version": "3.1.1", +- "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", +- "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", ++ "version": "3.1.7", ++ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", ++ "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", +- "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" ++ "version": "3.0.4", ++ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", ++ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==" + }, + "node_modules/@types/d3-timer": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", +- "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" ++ "version": "3.0.2", ++ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", ++ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", +@@ -1300,479 +1002,932 @@ + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, +- "node_modules/@types/minimist": { +- "version": "1.2.2", +- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", +- "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", ++ "node_modules/@types/prop-types": { ++ "version": "15.7.14", ++ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", ++ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "dev": true + }, +- "node_modules/@types/normalize-package-data": { +- "version": "2.4.1", +- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", +- "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", ++ "node_modules/@types/qunit": { ++ "version": "2.19.12", ++ "resolved": "https://registry.npmjs.org/@types/qunit/-/qunit-2.19.12.tgz", ++ "integrity": "sha512-II+C1wgzUia0g+tGAH+PBb4XiTm8/C/i6sN23r21NNskBYOYrv+qnW0tFQ/IxZzKVwrK4CTglf8YO3poJUclQA==", + "dev": true + }, +- "node_modules/acorn": { +- "version": "8.8.2", +- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", +- "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", ++ "node_modules/@types/react": { ++ "version": "18.3.11", ++ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", ++ "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", + "dev": true, +- "bin": { +- "acorn": "bin/acorn" +- }, +- "engines": { +- "node": ">=0.4.0" ++ "dependencies": { ++ "@types/prop-types": "*", ++ "csstype": "^3.0.2" + } + }, +- "node_modules/acorn-jsx": { +- "version": "5.3.2", +- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", +- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", ++ "node_modules/@types/react-dom": { ++ "version": "18.3.0", ++ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", ++ "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, +- "peerDependencies": { +- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" ++ "dependencies": { ++ "@types/react": "*" + } + }, +- "node_modules/ajv": { +- "version": "6.12.6", +- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", +- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", ++ "node_modules/@typescript-eslint/eslint-plugin": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz", ++ "integrity": "sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==", + "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" ++ "@eslint-community/regexpp": "^4.10.0", ++ "@typescript-eslint/scope-manager": "8.8.0", ++ "@typescript-eslint/type-utils": "8.8.0", ++ "@typescript-eslint/utils": "8.8.0", ++ "@typescript-eslint/visitor-keys": "8.8.0", ++ "graphemer": "^1.4.0", ++ "ignore": "^5.3.1", ++ "natural-compare": "^1.4.0", ++ "ts-api-utils": "^1.3.0" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { +- "type": "github", +- "url": "https://github.com/sponsors/epoberezkin" ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", ++ "eslint": "^8.57.0 || ^9.0.0" ++ }, ++ "peerDependenciesMeta": { ++ "typescript": { ++ "optional": true ++ } + } + }, +- "node_modules/ansi-escapes": { +- "version": "4.3.2", +- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", +- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", ++ "node_modules/@typescript-eslint/parser": { ++ "version": "8.22.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.22.0.tgz", ++ "integrity": "sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==", + "dev": true, ++ "peer": true, + "dependencies": { +- "type-fest": "^0.21.3" ++ "@typescript-eslint/scope-manager": "8.22.0", ++ "@typescript-eslint/types": "8.22.0", ++ "@typescript-eslint/typescript-estree": "8.22.0", ++ "@typescript-eslint/visitor-keys": "8.22.0", ++ "debug": "^4.3.4" + }, + "engines": { +- "node": ">=8" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "eslint": "^8.57.0 || ^9.0.0", ++ "typescript": ">=4.8.4 <5.8.0" + } + }, +- "node_modules/ansi-escapes/node_modules/type-fest": { +- "version": "0.21.3", +- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", +- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", ++ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { ++ "version": "8.22.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz", ++ "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==", + "dev": true, ++ "peer": true, ++ "dependencies": { ++ "@typescript-eslint/types": "8.22.0", ++ "@typescript-eslint/visitor-keys": "8.22.0" ++ }, + "engines": { +- "node": ">=10" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" + } + }, +- "node_modules/ansi-regex": { +- "version": "5.0.1", +- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", +- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", ++ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { ++ "version": "8.22.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz", ++ "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==", + "dev": true, ++ "peer": true, ++ "dependencies": { ++ "@typescript-eslint/types": "8.22.0", ++ "eslint-visitor-keys": "^4.2.0" ++ }, + "engines": { +- "node": ">=8" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" + } + }, +- "node_modules/ansi-styles": { +- "version": "3.2.1", +- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", +- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", ++ "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", ++ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, +- "dependencies": { +- "color-convert": "^1.9.0" +- }, ++ "peer": true, + "engines": { +- "node": ">=4" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" + } + }, +- "node_modules/anymatch": { +- "version": "3.1.3", +- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", +- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", ++ "node_modules/@typescript-eslint/scope-manager": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz", ++ "integrity": "sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==", + "dev": true, + "dependencies": { +- "normalize-path": "^3.0.0", +- "picomatch": "^2.0.4" ++ "@typescript-eslint/types": "8.8.0", ++ "@typescript-eslint/visitor-keys": "8.8.0" + }, + "engines": { +- "node": ">= 8" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" + } + }, +- "node_modules/argparse": { +- "version": "2.0.1", +- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", +- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", +- "dev": true +- }, +- "node_modules/array-buffer-byte-length": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", +- "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", ++ "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", ++ "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", + "dev": true, +- "dependencies": { +- "call-bind": "^1.0.2", +- "is-array-buffer": "^3.0.1" ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" + } + }, +- "node_modules/array-includes": { +- "version": "3.1.6", +- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", +- "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", ++ "node_modules/@typescript-eslint/type-utils": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz", ++ "integrity": "sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.4", +- "es-abstract": "^1.20.4", +- "get-intrinsic": "^1.1.3", +- "is-string": "^1.0.7" ++ "@typescript-eslint/typescript-estree": "8.8.0", ++ "@typescript-eslint/utils": "8.8.0", ++ "debug": "^4.3.4", ++ "ts-api-utils": "^1.3.0" + }, + "engines": { +- "node": ">= 0.4" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependenciesMeta": { ++ "typescript": { ++ "optional": true ++ } + } + }, +- "node_modules/array-union": { +- "version": "2.1.0", +- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", +- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", ++ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", ++ "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", + "dev": true, + "engines": { +- "node": ">=8" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" + } + }, +- "node_modules/array.prototype.flat": { +- "version": "1.3.1", +- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", +- "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", ++ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", ++ "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.4", +- "es-abstract": "^1.20.4", +- "es-shim-unscopables": "^1.0.0" ++ "@typescript-eslint/types": "8.8.0", ++ "@typescript-eslint/visitor-keys": "8.8.0", ++ "debug": "^4.3.4", ++ "fast-glob": "^3.3.2", ++ "is-glob": "^4.0.3", ++ "minimatch": "^9.0.4", ++ "semver": "^7.6.0", ++ "ts-api-utils": "^1.3.0" + }, + "engines": { +- "node": ">= 0.4" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependenciesMeta": { ++ "typescript": { ++ "optional": true ++ } + } + }, +- "node_modules/array.prototype.flatmap": { +- "version": "1.3.1", +- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", +- "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", ++ "node_modules/@typescript-eslint/types": { ++ "version": "8.22.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz", ++ "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==", ++ "dev": true, ++ "peer": true, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ } ++ }, ++ "node_modules/@typescript-eslint/typescript-estree": { ++ "version": "8.22.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz", ++ "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==", + "dev": true, ++ "peer": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.4", +- "es-abstract": "^1.20.4", +- "es-shim-unscopables": "^1.0.0" ++ "@typescript-eslint/types": "8.22.0", ++ "@typescript-eslint/visitor-keys": "8.22.0", ++ "debug": "^4.3.4", ++ "fast-glob": "^3.3.2", ++ "is-glob": "^4.0.3", ++ "minimatch": "^9.0.4", ++ "semver": "^7.6.0", ++ "ts-api-utils": "^2.0.0" + }, + "engines": { +- "node": ">= 0.4" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "typescript": ">=4.8.4 <5.8.0" + } + }, +- "node_modules/array.prototype.tosorted": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", +- "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", ++ "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { ++ "version": "8.22.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz", ++ "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==", + "dev": true, ++ "peer": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.4", +- "es-abstract": "^1.20.4", +- "es-shim-unscopables": "^1.0.0", +- "get-intrinsic": "^1.1.3" ++ "@typescript-eslint/types": "8.22.0", ++ "eslint-visitor-keys": "^4.2.0" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" + } + }, +- "node_modules/arrify": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", +- "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", ++ "node_modules/@typescript-eslint/typescript-estree/node_modules/eslint-visitor-keys": { ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", ++ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, ++ "peer": true, + "engines": { +- "node": ">=0.10.0" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" + } + }, +- "node_modules/astral-regex": { ++ "node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { + "version": "2.0.0", +- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", +- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", ++ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", ++ "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", + "dev": true, ++ "peer": true, + "engines": { +- "node": ">=8" ++ "node": ">=18.12" ++ }, ++ "peerDependencies": { ++ "typescript": ">=4.8.4" + } + }, +- "node_modules/attr-accept": { +- "version": "1.1.3", +- "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz", +- "integrity": "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==", ++ "node_modules/@typescript-eslint/utils": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.0.tgz", ++ "integrity": "sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==", ++ "dev": true, + "dependencies": { +- "core-js": "^2.5.0" ++ "@eslint-community/eslint-utils": "^4.4.0", ++ "@typescript-eslint/scope-manager": "8.8.0", ++ "@typescript-eslint/types": "8.8.0", ++ "@typescript-eslint/typescript-estree": "8.8.0" + }, + "engines": { +- "node": ">=4" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "eslint": "^8.57.0 || ^9.0.0" + } + }, +- "node_modules/available-typed-arrays": { +- "version": "1.0.5", +- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", +- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", ++ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", ++ "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", + "dev": true, + "engines": { +- "node": ">= 0.4" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" + } + }, +- "node_modules/balanced-match": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", +- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", +- "dev": true +- }, +- "node_modules/binary-extensions": { +- "version": "2.2.0", +- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", +- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", ++ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", ++ "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", + "dev": true, ++ "dependencies": { ++ "@typescript-eslint/types": "8.8.0", ++ "@typescript-eslint/visitor-keys": "8.8.0", ++ "debug": "^4.3.4", ++ "fast-glob": "^3.3.2", ++ "is-glob": "^4.0.3", ++ "minimatch": "^9.0.4", ++ "semver": "^7.6.0", ++ "ts-api-utils": "^1.3.0" ++ }, + "engines": { +- "node": ">=8" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependenciesMeta": { ++ "typescript": { ++ "optional": true ++ } + } + }, +- "node_modules/brace-expansion": { +- "version": "1.1.11", +- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", +- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "node_modules/@typescript-eslint/visitor-keys": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz", ++ "integrity": "sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==", + "dev": true, + "dependencies": { +- "balanced-match": "^1.0.0", +- "concat-map": "0.0.1" ++ "@typescript-eslint/types": "8.8.0", ++ "eslint-visitor-keys": "^3.4.3" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" + } + }, +- "node_modules/braces": { +- "version": "3.0.3", +- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", +- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", ++ "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", ++ "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", + "dev": true, +- "dependencies": { +- "fill-range": "^7.1.1" +- }, + "engines": { +- "node": ">=8" ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" + } + }, +- "node_modules/browserslist": { +- "version": "4.21.7", +- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", +- "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", ++ "node_modules/@ungap/structured-clone": { ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", ++ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", ++ "dev": true ++ }, ++ "node_modules/@xterm/addon-canvas": { ++ "version": "0.7.0", ++ "resolved": "https://registry.npmjs.org/@xterm/addon-canvas/-/addon-canvas-0.7.0.tgz", ++ "integrity": "sha512-LF5LYcfvefJuJ7QotNRdRSPc9YASAVDeoT5uyXS/nZshZXjYplGXRECBGiznwvhNL2I8bq1Lf5MzRwstsYQ2Iw==", ++ "peerDependencies": { ++ "@xterm/xterm": "^5.0.0" ++ } ++ }, ++ "node_modules/@xterm/xterm": { ++ "version": "5.5.0", ++ "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz", ++ "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==" ++ }, ++ "node_modules/acorn": { ++ "version": "8.14.0", ++ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", ++ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, +- "funding": [ +- { +- "type": "opencollective", +- "url": "https://opencollective.com/browserslist" +- }, +- { +- "type": "tidelift", +- "url": "https://tidelift.com/funding/github/npm/browserslist" +- }, +- { +- "type": "github", +- "url": "https://github.com/sponsors/ai" +- } +- ], +- "peer": true, +- "dependencies": { +- "caniuse-lite": "^1.0.30001489", +- "electron-to-chromium": "^1.4.411", +- "node-releases": "^2.0.12", +- "update-browserslist-db": "^1.0.11" +- }, + "bin": { +- "browserslist": "cli.js" ++ "acorn": "bin/acorn" + }, + "engines": { +- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" ++ "node": ">=0.4.0" + } + }, +- "node_modules/builtins": { +- "version": "5.0.1", +- "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", +- "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", ++ "node_modules/acorn-jsx": { ++ "version": "5.3.2", ++ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", ++ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, +- "peer": true, +- "dependencies": { +- "semver": "^7.0.0" ++ "peerDependencies": { ++ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, +- "node_modules/builtins/node_modules/lru-cache": { +- "version": "6.0.0", +- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", +- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", ++ "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, +- "peer": true, + "dependencies": { +- "yallist": "^4.0.0" ++ "fast-deep-equal": "^3.1.1", ++ "fast-json-stable-stringify": "^2.0.0", ++ "json-schema-traverse": "^0.4.1", ++ "uri-js": "^4.2.2" + }, +- "engines": { +- "node": ">=10" ++ "funding": { ++ "type": "github", ++ "url": "https://github.com/sponsors/epoberezkin" + } + }, +- "node_modules/builtins/node_modules/semver": { +- "version": "7.5.4", +- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", +- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", ++ "node_modules/ansi-escapes": { ++ "version": "7.0.0", ++ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", ++ "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, +- "peer": true, + "dependencies": { +- "lru-cache": "^6.0.0" +- }, +- "bin": { +- "semver": "bin/semver.js" ++ "environment": "^1.0.0" + }, + "engines": { +- "node": ">=10" ++ "node": ">=18" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" + } + }, +- "node_modules/builtins/node_modules/yallist": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", +- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", ++ "node_modules/ansi-regex": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", ++ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, +- "peer": true ++ "engines": { ++ "node": ">=8" ++ } + }, +- "node_modules/call-bind": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", +- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", ++ "node_modules/ansi-styles": { ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", ++ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { +- "function-bind": "^1.1.1", +- "get-intrinsic": "^1.0.2" ++ "color-convert": "^2.0.1" ++ }, ++ "engines": { ++ "node": ">=8" + }, + "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, +- "node_modules/callsites": { +- "version": "3.1.0", +- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", +- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", ++ "node_modules/anymatch": { ++ "version": "3.1.3", ++ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", ++ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, ++ "dependencies": { ++ "normalize-path": "^3.0.0", ++ "picomatch": "^2.0.4" ++ }, + "engines": { +- "node": ">=6" ++ "node": ">= 8" ++ } ++ }, ++ "node_modules/argparse": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", ++ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", ++ "dev": true ++ }, ++ "node_modules/aria-query": { ++ "version": "5.1.3", ++ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", ++ "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", ++ "dev": true, ++ "dependencies": { ++ "deep-equal": "^2.0.5" + } + }, +- "node_modules/camelcase": { +- "version": "6.3.0", +- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", +- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", ++ "node_modules/array-buffer-byte-length": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", ++ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.3", ++ "is-array-buffer": "^3.0.5" ++ }, + "engines": { +- "node": ">=10" ++ "node": ">= 0.4" + }, + "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/camelcase-keys": { +- "version": "7.0.2", +- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", +- "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", ++ "node_modules/array-includes": { ++ "version": "3.1.8", ++ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", ++ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { +- "camelcase": "^6.3.0", +- "map-obj": "^4.1.0", +- "quick-lru": "^5.1.1", +- "type-fest": "^1.2.1" ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.2", ++ "es-object-atoms": "^1.0.0", ++ "get-intrinsic": "^1.2.4", ++ "is-string": "^1.0.7" + }, + "engines": { +- "node": ">=12" ++ "node": ">= 0.4" + }, + "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/caniuse-lite": { +- "version": "1.0.30001497", +- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001497.tgz", +- "integrity": "sha512-I4/duVK4wL6rAK/aKZl3HXB4g+lIZvaT4VLAn2rCgJ38jVLb0lv2Xug6QuqmxXFVRJMF74SPPWPJ/1Sdm3vCzw==", ++ "node_modules/array-union": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", ++ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, +- "funding": [ +- { +- "type": "opencollective", +- "url": "https://opencollective.com/browserslist" +- }, +- { +- "type": "tidelift", +- "url": "https://tidelift.com/funding/github/npm/caniuse-lite" +- }, +- { +- "type": "github", +- "url": "https://github.com/sponsors/ai" +- } +- ], +- "peer": true ++ "engines": { ++ "node": ">=8" ++ } + }, +- "node_modules/chalk": { +- "version": "2.4.2", +- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", +- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", ++ "node_modules/array.prototype.findlast": { ++ "version": "1.2.5", ++ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", ++ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { +- "ansi-styles": "^3.2.1", +- "escape-string-regexp": "^1.0.5", +- "supports-color": "^5.3.0" ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.2", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", ++ "es-shim-unscopables": "^1.0.2" + }, + "engines": { +- "node": ">=4" ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/chokidar": { +- "version": "3.5.3", +- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", +- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", ++ "node_modules/array.prototype.findlastindex": { ++ "version": "1.2.5", ++ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", ++ "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, +- "funding": [ +- { +- "type": "individual", +- "url": "https://paulmillr.com/funding/" +- } +- ], + "dependencies": { +- "anymatch": "~3.1.2", +- "braces": "~3.0.2", +- "glob-parent": "~5.1.2", +- "is-binary-path": "~2.1.0", +- "is-glob": "~4.0.1", +- "normalize-path": "~3.0.0", +- "readdirp": "~3.6.0" ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.2", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", ++ "es-shim-unscopables": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/array.prototype.flat": { ++ "version": "1.3.3", ++ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", ++ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", ++ "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.8", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.5", ++ "es-shim-unscopables": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/array.prototype.flatmap": { ++ "version": "1.3.3", ++ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", ++ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", ++ "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.8", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.5", ++ "es-shim-unscopables": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/array.prototype.tosorted": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", ++ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", ++ "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.3", ++ "es-errors": "^1.3.0", ++ "es-shim-unscopables": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/arraybuffer.prototype.slice": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", ++ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", ++ "dev": true, ++ "dependencies": { ++ "array-buffer-byte-length": "^1.0.1", ++ "call-bind": "^1.0.8", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.5", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.6", ++ "is-array-buffer": "^3.0.4" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/ast-types-flow": { ++ "version": "0.0.8", ++ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", ++ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", ++ "dev": true ++ }, ++ "node_modules/astral-regex": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", ++ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", ++ "dev": true, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/async-function": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", ++ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", ++ "dev": true, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/attr-accept": { ++ "version": "2.2.5", ++ "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", ++ "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", ++ "engines": { ++ "node": ">=4" ++ } ++ }, ++ "node_modules/autolinker": { ++ "version": "3.16.2", ++ "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.16.2.tgz", ++ "integrity": "sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==", ++ "dependencies": { ++ "tslib": "^2.3.0" ++ } ++ }, ++ "node_modules/available-typed-arrays": { ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", ++ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", ++ "dev": true, ++ "dependencies": { ++ "possible-typed-array-names": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/axe-core": { ++ "version": "4.10.2", ++ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", ++ "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", ++ "dev": true, ++ "engines": { ++ "node": ">=4" ++ } ++ }, ++ "node_modules/axobject-query": { ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", ++ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", ++ "dev": true, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/balanced-match": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", ++ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", ++ "dev": true ++ }, ++ "node_modules/binary-extensions": { ++ "version": "2.3.0", ++ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", ++ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", ++ "dev": true, ++ "engines": { ++ "node": ">=8" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/brace-expansion": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", ++ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", ++ "dev": true, ++ "dependencies": { ++ "balanced-match": "^1.0.0" ++ } ++ }, ++ "node_modules/braces": { ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", ++ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", ++ "dev": true, ++ "dependencies": { ++ "fill-range": "^7.1.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/buffer-builder": { ++ "version": "0.2.0", ++ "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", ++ "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", ++ "dev": true, ++ "peer": true ++ }, ++ "node_modules/builtin-modules": { ++ "version": "3.3.0", ++ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", ++ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", ++ "dev": true, ++ "peer": true, ++ "engines": { ++ "node": ">=6" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/builtins": { ++ "version": "5.1.0", ++ "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", ++ "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", ++ "dev": true, ++ "peer": true, ++ "dependencies": { ++ "semver": "^7.0.0" ++ } ++ }, ++ "node_modules/call-bind": { ++ "version": "1.0.8", ++ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", ++ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", ++ "dev": true, ++ "dependencies": { ++ "call-bind-apply-helpers": "^1.0.0", ++ "es-define-property": "^1.0.0", ++ "get-intrinsic": "^1.2.4", ++ "set-function-length": "^1.2.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/call-bind-apply-helpers": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", ++ "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", ++ "dev": true, ++ "dependencies": { ++ "es-errors": "^1.3.0", ++ "function-bind": "^1.1.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/call-bound": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", ++ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", ++ "dev": true, ++ "dependencies": { ++ "call-bind-apply-helpers": "^1.0.1", ++ "get-intrinsic": "^1.2.6" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/callsites": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", ++ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", ++ "dev": true, ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/chalk": { ++ "version": "4.1.2", ++ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", ++ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", ++ "dev": true, ++ "dependencies": { ++ "ansi-styles": "^4.1.0", ++ "supports-color": "^7.1.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/chalk?sponsor=1" ++ } ++ }, ++ "node_modules/chokidar": { ++ "version": "3.6.0", ++ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", ++ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", ++ "dev": true, ++ "dependencies": { ++ "anymatch": "~3.1.2", ++ "braces": "~3.0.2", ++ "glob-parent": "~5.1.2", ++ "is-binary-path": "~2.1.0", ++ "is-glob": "~4.0.1", ++ "normalize-path": "~3.0.0", ++ "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, ++ "funding": { ++ "url": "https://paulmillr.com/funding/" ++ }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } +@@ -1791,18 +1946,21 @@ + } + }, + "node_modules/color-convert": { +- "version": "1.9.3", +- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", +- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", ++ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { +- "color-name": "1.1.3" ++ "color-name": "~1.1.4" ++ }, ++ "engines": { ++ "node": ">=7.0.0" + } + }, + "node_modules/color-name": { +- "version": "1.1.3", +- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", +- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", ++ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colord": { +@@ -1811,6 +1969,13 @@ + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, ++ "node_modules/colorjs.io": { ++ "version": "0.5.2", ++ "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", ++ "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", ++ "dev": true, ++ "peer": true ++ }, + "node_modules/commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", +@@ -1823,36 +1988,35 @@ + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, +- "node_modules/convert-source-map": { +- "version": "1.9.0", +- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", +- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", +- "dev": true, +- "peer": true +- }, +- "node_modules/core-js": { +- "version": "2.6.12", +- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", +- "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", +- "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", +- "hasInstallScript": true ++ "node_modules/core-util-is": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", ++ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { +- "version": "8.2.0", +- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", +- "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", ++ "version": "9.0.0", ++ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", ++ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { +- "import-fresh": "^3.2.1", ++ "env-paths": "^2.2.1", ++ "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", +- "parse-json": "^5.0.0", +- "path-type": "^4.0.0" ++ "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" ++ }, ++ "peerDependencies": { ++ "typescript": ">=4.9.5" ++ }, ++ "peerDependenciesMeta": { ++ "typescript": { ++ "optional": true ++ } + } + }, + "node_modules/cross-spawn": { +@@ -1860,7 +2024,6 @@ + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, +- "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", +@@ -1871,12 +2034,12 @@ + } + }, + "node_modules/css-functions-list": { +- "version": "3.1.0", +- "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", +- "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", ++ "version": "3.2.3", ++ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", ++ "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "dev": true, + "engines": { +- "node": ">=12.22" ++ "node": ">=12 || >=16" + } + }, + "node_modules/css-tree": { +@@ -1904,6 +2067,12 @@ + "node": ">=4" + } + }, ++ "node_modules/csstype": { ++ "version": "3.1.3", ++ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", ++ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", ++ "dev": true ++ }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", +@@ -2014,67 +2183,110 @@ + "node": ">=12" + } + }, +- "node_modules/debug": { +- "version": "4.3.4", +- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", +- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", +- "dev": true, +- "dependencies": { +- "ms": "2.1.2" ++ "node_modules/damerau-levenshtein": { ++ "version": "1.0.8", ++ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", ++ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", ++ "dev": true ++ }, ++ "node_modules/data-view-buffer": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", ++ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", ++ "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.3", ++ "es-errors": "^1.3.0", ++ "is-data-view": "^1.0.2" + }, + "engines": { +- "node": ">=6.0" ++ "node": ">= 0.4" + }, +- "peerDependenciesMeta": { +- "supports-color": { +- "optional": true +- } ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/decamelize": { +- "version": "5.0.1", +- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", +- "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", ++ "node_modules/data-view-byte-length": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", ++ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.3", ++ "es-errors": "^1.3.0", ++ "is-data-view": "^1.0.2" ++ }, + "engines": { +- "node": ">=10" ++ "node": ">= 0.4" + }, + "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "url": "https://github.com/sponsors/inspect-js" + } + }, +- "node_modules/decamelize-keys": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", +- "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", ++ "node_modules/data-view-byte-offset": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", ++ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "dependencies": { +- "decamelize": "^1.1.0", +- "map-obj": "^1.0.0" ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "is-data-view": "^1.0.1" + }, + "engines": { +- "node": ">=0.10.0" ++ "node": ">= 0.4" + }, + "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/decamelize-keys/node_modules/decamelize": { +- "version": "1.2.0", +- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", +- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", ++ "node_modules/debug": { ++ "version": "4.4.0", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", ++ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, ++ "dependencies": { ++ "ms": "^2.1.3" ++ }, + "engines": { +- "node": ">=0.10.0" ++ "node": ">=6.0" ++ }, ++ "peerDependenciesMeta": { ++ "supports-color": { ++ "optional": true ++ } + } + }, +- "node_modules/decamelize-keys/node_modules/map-obj": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", +- "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", ++ "node_modules/deep-equal": { ++ "version": "2.2.3", ++ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", ++ "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, ++ "dependencies": { ++ "array-buffer-byte-length": "^1.0.0", ++ "call-bind": "^1.0.5", ++ "es-get-iterator": "^1.1.3", ++ "get-intrinsic": "^1.2.2", ++ "is-arguments": "^1.1.1", ++ "is-array-buffer": "^3.0.2", ++ "is-date-object": "^1.0.5", ++ "is-regex": "^1.1.4", ++ "is-shared-array-buffer": "^1.0.2", ++ "isarray": "^2.0.5", ++ "object-is": "^1.1.5", ++ "object-keys": "^1.1.1", ++ "object.assign": "^4.1.4", ++ "regexp.prototype.flags": "^1.5.1", ++ "side-channel": "^1.0.4", ++ "which-boxed-primitive": "^1.0.2", ++ "which-collection": "^1.0.1", ++ "which-typed-array": "^1.1.13" ++ }, + "engines": { +- "node": ">=0.10.0" ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { +@@ -2083,12 +2295,30 @@ + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, ++ "node_modules/define-data-property": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", ++ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", ++ "dev": true, ++ "dependencies": { ++ "es-define-property": "^1.0.0", ++ "es-errors": "^1.3.0", ++ "gopd": "^1.0.1" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, + "node_modules/define-properties": { +- "version": "1.2.0", +- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", +- "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", ++ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { ++ "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, +@@ -2112,6 +2342,14 @@ + "delaunator": "^4.0.0" + } + }, ++ "node_modules/dequal": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", ++ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", ++ "engines": { ++ "node": ">=6" ++ } ++ }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", +@@ -2136,17 +2374,30 @@ + "node": ">=6.0.0" + } + }, +- "node_modules/electron-to-chromium": { +- "version": "1.4.425", +- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.425.tgz", +- "integrity": "sha512-wv1NufHxu11zfDbY4fglYQApMswleE9FL/DSeyOyauVXDZ+Kco96JK/tPfBUaDqfRarYp2WH2hJ/5UnVywp9Jg==", ++ "node_modules/dunder-proto": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", ++ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, +- "peer": true ++ "dependencies": { ++ "call-bind-apply-helpers": "^1.0.1", ++ "es-errors": "^1.3.0", ++ "gopd": "^1.2.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/eastasianwidth": { ++ "version": "0.2.0", ++ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", ++ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", ++ "dev": true + }, + "node_modules/emoji-regex": { +- "version": "8.0.0", +- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", +- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", ++ "version": "9.2.2", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", ++ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/encoding": { +@@ -2157,6 +2408,27 @@ + "iconv-lite": "^0.6.2" + } + }, ++ "node_modules/env-paths": { ++ "version": "2.2.1", ++ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", ++ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", ++ "dev": true, ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/environment": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", ++ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", ++ "dev": true, ++ "engines": { ++ "node": ">=18" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", +@@ -2167,85 +2439,180 @@ + } + }, + "node_modules/es-abstract": { +- "version": "1.21.2", +- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", +- "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", ++ "version": "1.23.9", ++ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", ++ "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", ++ "dev": true, ++ "dependencies": { ++ "array-buffer-byte-length": "^1.0.2", ++ "arraybuffer.prototype.slice": "^1.0.4", ++ "available-typed-arrays": "^1.0.7", ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "data-view-buffer": "^1.0.2", ++ "data-view-byte-length": "^1.0.2", ++ "data-view-byte-offset": "^1.0.1", ++ "es-define-property": "^1.0.1", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", ++ "es-set-tostringtag": "^2.1.0", ++ "es-to-primitive": "^1.3.0", ++ "function.prototype.name": "^1.1.8", ++ "get-intrinsic": "^1.2.7", ++ "get-proto": "^1.0.0", ++ "get-symbol-description": "^1.1.0", ++ "globalthis": "^1.0.4", ++ "gopd": "^1.2.0", ++ "has-property-descriptors": "^1.0.2", ++ "has-proto": "^1.2.0", ++ "has-symbols": "^1.1.0", ++ "hasown": "^2.0.2", ++ "internal-slot": "^1.1.0", ++ "is-array-buffer": "^3.0.5", ++ "is-callable": "^1.2.7", ++ "is-data-view": "^1.0.2", ++ "is-regex": "^1.2.1", ++ "is-shared-array-buffer": "^1.0.4", ++ "is-string": "^1.1.1", ++ "is-typed-array": "^1.1.15", ++ "is-weakref": "^1.1.0", ++ "math-intrinsics": "^1.1.0", ++ "object-inspect": "^1.13.3", ++ "object-keys": "^1.1.1", ++ "object.assign": "^4.1.7", ++ "own-keys": "^1.0.1", ++ "regexp.prototype.flags": "^1.5.3", ++ "safe-array-concat": "^1.1.3", ++ "safe-push-apply": "^1.0.0", ++ "safe-regex-test": "^1.1.0", ++ "set-proto": "^1.0.0", ++ "string.prototype.trim": "^1.2.10", ++ "string.prototype.trimend": "^1.0.9", ++ "string.prototype.trimstart": "^1.0.8", ++ "typed-array-buffer": "^1.0.3", ++ "typed-array-byte-length": "^1.0.3", ++ "typed-array-byte-offset": "^1.0.4", ++ "typed-array-length": "^1.0.7", ++ "unbox-primitive": "^1.1.0", ++ "which-typed-array": "^1.1.18" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/es-define-property": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", ++ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", ++ "dev": true, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/es-errors": { ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", ++ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", ++ "dev": true, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/es-get-iterator": { ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", ++ "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { +- "array-buffer-byte-length": "^1.0.0", +- "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", +- "es-set-tostringtag": "^2.0.1", +- "es-to-primitive": "^1.2.1", +- "function.prototype.name": "^1.1.5", +- "get-intrinsic": "^1.2.0", +- "get-symbol-description": "^1.0.0", +- "globalthis": "^1.0.3", +- "gopd": "^1.0.1", +- "has": "^1.0.3", +- "has-property-descriptors": "^1.0.0", +- "has-proto": "^1.0.1", ++ "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", +- "internal-slot": "^1.0.5", +- "is-array-buffer": "^3.0.2", +- "is-callable": "^1.2.7", +- "is-negative-zero": "^2.0.2", +- "is-regex": "^1.1.4", +- "is-shared-array-buffer": "^1.0.2", ++ "is-arguments": "^1.1.1", ++ "is-map": "^2.0.2", ++ "is-set": "^2.0.2", + "is-string": "^1.0.7", +- "is-typed-array": "^1.1.10", +- "is-weakref": "^1.0.2", +- "object-inspect": "^1.12.3", +- "object-keys": "^1.1.1", +- "object.assign": "^4.1.4", +- "regexp.prototype.flags": "^1.4.3", +- "safe-regex-test": "^1.0.0", +- "string.prototype.trim": "^1.2.7", +- "string.prototype.trimend": "^1.0.6", +- "string.prototype.trimstart": "^1.0.6", +- "typed-array-length": "^1.0.4", +- "unbox-primitive": "^1.0.2", +- "which-typed-array": "^1.1.9" ++ "isarray": "^2.0.5", ++ "stop-iteration-iterator": "^1.0.0" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/es-iterator-helpers": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", ++ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", ++ "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.6", ++ "es-errors": "^1.3.0", ++ "es-set-tostringtag": "^2.0.3", ++ "function-bind": "^1.1.2", ++ "get-intrinsic": "^1.2.6", ++ "globalthis": "^1.0.4", ++ "gopd": "^1.2.0", ++ "has-property-descriptors": "^1.0.2", ++ "has-proto": "^1.2.0", ++ "has-symbols": "^1.1.0", ++ "internal-slot": "^1.1.0", ++ "iterator.prototype": "^1.1.4", ++ "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" ++ } ++ }, ++ "node_modules/es-object-atoms": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", ++ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", ++ "dev": true, ++ "dependencies": { ++ "es-errors": "^1.3.0" + }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "engines": { ++ "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { +- "version": "2.0.1", +- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", +- "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", ++ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "dependencies": { +- "get-intrinsic": "^1.1.3", +- "has": "^1.0.3", +- "has-tostringtag": "^1.0.0" ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.6", ++ "has-tostringtag": "^1.0.2", ++ "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", +- "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", ++ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { +- "has": "^1.0.3" ++ "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", +- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", ++ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "dependencies": { +- "is-callable": "^1.1.4", +- "is-date-object": "^1.0.1", +- "is-symbol": "^1.0.2" ++ "is-callable": "^1.2.7", ++ "is-date-object": "^1.0.5", ++ "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" +@@ -2255,40 +2622,42 @@ + } + }, + "node_modules/esbuild": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", +- "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", ++ "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { +- "node": ">=12" ++ "node": ">=18" + }, + "optionalDependencies": { +- "@esbuild/android-arm": "0.17.19", +- "@esbuild/android-arm64": "0.17.19", +- "@esbuild/android-x64": "0.17.19", +- "@esbuild/darwin-arm64": "0.17.19", +- "@esbuild/darwin-x64": "0.17.19", +- "@esbuild/freebsd-arm64": "0.17.19", +- "@esbuild/freebsd-x64": "0.17.19", +- "@esbuild/linux-arm": "0.17.19", +- "@esbuild/linux-arm64": "0.17.19", +- "@esbuild/linux-ia32": "0.17.19", +- "@esbuild/linux-loong64": "0.17.19", +- "@esbuild/linux-mips64el": "0.17.19", +- "@esbuild/linux-ppc64": "0.17.19", +- "@esbuild/linux-riscv64": "0.17.19", +- "@esbuild/linux-s390x": "0.17.19", +- "@esbuild/linux-x64": "0.17.19", +- "@esbuild/netbsd-x64": "0.17.19", +- "@esbuild/openbsd-x64": "0.17.19", +- "@esbuild/sunos-x64": "0.17.19", +- "@esbuild/win32-arm64": "0.17.19", +- "@esbuild/win32-ia32": "0.17.19", +- "@esbuild/win32-x64": "0.17.19" ++ "@esbuild/aix-ppc64": "0.24.0", ++ "@esbuild/android-arm": "0.24.0", ++ "@esbuild/android-arm64": "0.24.0", ++ "@esbuild/android-x64": "0.24.0", ++ "@esbuild/darwin-arm64": "0.24.0", ++ "@esbuild/darwin-x64": "0.24.0", ++ "@esbuild/freebsd-arm64": "0.24.0", ++ "@esbuild/freebsd-x64": "0.24.0", ++ "@esbuild/linux-arm": "0.24.0", ++ "@esbuild/linux-arm64": "0.24.0", ++ "@esbuild/linux-ia32": "0.24.0", ++ "@esbuild/linux-loong64": "0.24.0", ++ "@esbuild/linux-mips64el": "0.24.0", ++ "@esbuild/linux-ppc64": "0.24.0", ++ "@esbuild/linux-riscv64": "0.24.0", ++ "@esbuild/linux-s390x": "0.24.0", ++ "@esbuild/linux-x64": "0.24.0", ++ "@esbuild/netbsd-x64": "0.24.0", ++ "@esbuild/openbsd-arm64": "0.24.0", ++ "@esbuild/openbsd-x64": "0.24.0", ++ "@esbuild/sunos-x64": "0.24.0", ++ "@esbuild/win32-arm64": "0.24.0", ++ "@esbuild/win32-ia32": "0.24.0", ++ "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/esbuild-plugin-copy": { +@@ -2306,76 +2675,6 @@ + "esbuild": ">= 0.14.0" + } + }, +- "node_modules/esbuild-plugin-copy/node_modules/ansi-styles": { +- "version": "4.3.0", +- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", +- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", +- "dev": true, +- "dependencies": { +- "color-convert": "^2.0.1" +- }, +- "engines": { +- "node": ">=8" +- }, +- "funding": { +- "url": "https://github.com/chalk/ansi-styles?sponsor=1" +- } +- }, +- "node_modules/esbuild-plugin-copy/node_modules/chalk": { +- "version": "4.1.2", +- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", +- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", +- "dev": true, +- "dependencies": { +- "ansi-styles": "^4.1.0", +- "supports-color": "^7.1.0" +- }, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/chalk/chalk?sponsor=1" +- } +- }, +- "node_modules/esbuild-plugin-copy/node_modules/color-convert": { +- "version": "2.0.1", +- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", +- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", +- "dev": true, +- "dependencies": { +- "color-name": "~1.1.4" +- }, +- "engines": { +- "node": ">=7.0.0" +- } +- }, +- "node_modules/esbuild-plugin-copy/node_modules/color-name": { +- "version": "1.1.4", +- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", +- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", +- "dev": true +- }, +- "node_modules/esbuild-plugin-copy/node_modules/has-flag": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", +- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", +- "dev": true, +- "engines": { +- "node": ">=8" +- } +- }, +- "node_modules/esbuild-plugin-copy/node_modules/supports-color": { +- "version": "7.2.0", +- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", +- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", +- "dev": true, +- "dependencies": { +- "has-flag": "^4.0.0" +- }, +- "engines": { +- "node": ">=8" +- } +- }, + "node_modules/esbuild-plugin-replace": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-replace/-/esbuild-plugin-replace-1.4.0.tgz", +@@ -2386,71 +2685,68 @@ + } + }, + "node_modules/esbuild-sass-plugin": { +- "version": "2.9.0", +- "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.9.0.tgz", +- "integrity": "sha512-D7c8Ub+C4RfaqhOoo9EEWprYmP5ZCmpmcodmYDtpvCfPZLgsSbLaLHPXdul4TUWUMH5eJ6POw+aes/s42ffwrA==", ++ "version": "3.3.1", ++ "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-3.3.1.tgz", ++ "integrity": "sha512-SnO1ls+d52n6j8gRRpjexXI8MsHEaumS0IdDHaYM29Y6gakzZYMls6i9ql9+AWMSQk/eryndmUpXEgT34QrX1A==", + "dev": true, + "dependencies": { +- "resolve": "^1.22.2", +- "sass": "^1.62.0" ++ "resolve": "^1.22.8", ++ "safe-identifier": "^0.4.2", ++ "sass": "^1.71.1" + }, + "peerDependencies": { +- "esbuild": "^0.17.17" ++ "esbuild": ">=0.20.1", ++ "sass-embedded": "^1.71.1" + } + }, + "node_modules/esbuild-wasm": { +- "version": "0.17.19", +- "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.19.tgz", +- "integrity": "sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg==", ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.24.0.tgz", ++ "integrity": "sha512-xhNn5tL1AhkPg4ft59yXT6FkwKXiPSYyz1IeinJHUJpjvOHOIPvdmFQc0pGdjxlKSbzZc2mNmtVOWAR1EF/JAg==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { +- "node": ">=12" +- } +- }, +- "node_modules/escalade": { +- "version": "3.1.1", +- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", +- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", +- "dev": true, +- "peer": true, +- "engines": { +- "node": ">=6" ++ "node": ">=18" + } + }, + "node_modules/escape-string-regexp": { +- "version": "1.0.5", +- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", +- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", ++ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { +- "node": ">=0.8.0" ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { +- "version": "8.42.0", +- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", +- "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", ++ "version": "8.57.1", ++ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", ++ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", ++ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", +- "@eslint-community/regexpp": "^4.4.0", +- "@eslint/eslintrc": "^2.0.3", +- "@eslint/js": "8.42.0", +- "@humanwhocodes/config-array": "^0.11.10", ++ "@eslint-community/regexpp": "^4.6.1", ++ "@eslint/eslintrc": "^2.1.4", ++ "@eslint/js": "8.57.1", ++ "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", +- "ajv": "^6.10.0", ++ "@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.0", +- "eslint-visitor-keys": "^3.4.1", +- "espree": "^9.5.2", ++ "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", +@@ -2460,7 +2756,6 @@ + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", +- "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", +@@ -2470,9 +2765,8 @@ + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", +- "optionator": "^0.9.1", ++ "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", +- "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { +@@ -2485,6 +2779,22 @@ + "url": "https://opencollective.com/eslint" + } + }, ++ "node_modules/eslint-compat-utils": { ++ "version": "0.5.1", ++ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", ++ "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", ++ "dev": true, ++ "peer": true, ++ "dependencies": { ++ "semver": "^7.5.4" ++ }, ++ "engines": { ++ "node": ">=12" ++ }, ++ "peerDependencies": { ++ "eslint": ">=6.0.0" ++ } ++ }, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", +@@ -2564,14 +2874,14 @@ + } + }, + "node_modules/eslint-import-resolver-node": { +- "version": "0.3.7", +- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", +- "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", ++ "version": "0.3.9", ++ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", ++ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", +- "is-core-module": "^2.11.0", +- "resolve": "^1.22.1" ++ "is-core-module": "^2.13.0", ++ "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { +@@ -2584,9 +2894,9 @@ + } + }, + "node_modules/eslint-module-utils": { +- "version": "2.8.0", +- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", +- "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", ++ "version": "2.12.0", ++ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", ++ "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" +@@ -2629,70 +2939,68 @@ + } + }, + "node_modules/eslint-plugin-es-x": { +- "version": "6.2.1", +- "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-6.2.1.tgz", +- "integrity": "sha512-uR34zUhZ9EBoiSD2DdV5kHLpydVEvwWqjteUr9sXRgJknwbKZJZhdJ7uFnaTtd+Nr/2G3ceJHnHXrFhJ67n3Tw==", ++ "version": "7.8.0", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", ++ "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, ++ "funding": [ ++ "https://github.com/sponsors/ota-meshi", ++ "https://opencollective.com/eslint" ++ ], + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", +- "@eslint-community/regexpp": "^4.5.0" ++ "@eslint-community/regexpp": "^4.11.0", ++ "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, +- "funding": { +- "url": "https://github.com/sponsors/ota-meshi" +- }, + "peerDependencies": { + "eslint": ">=8" + } + }, +- "node_modules/eslint-plugin-flowtype": { +- "version": "8.0.3", +- "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", +- "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", ++ "node_modules/eslint-plugin-import": { ++ "version": "2.31.0", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", ++ "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "dependencies": { +- "lodash": "^4.17.21", +- "string-natural-compare": "^3.0.1" +- }, +- "engines": { +- "node": ">=12.0.0" +- }, +- "peerDependencies": { +- "@babel/plugin-syntax-flow": "^7.14.5", +- "@babel/plugin-transform-react-jsx": "^7.14.9", +- "eslint": "^8.1.0" +- } +- }, +- "node_modules/eslint-plugin-import": { +- "version": "2.27.5", +- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", +- "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", +- "dev": true, +- "dependencies": { +- "array-includes": "^3.1.6", +- "array.prototype.flat": "^1.3.1", +- "array.prototype.flatmap": "^1.3.1", ++ "@rtsao/scc": "^1.1.0", ++ "array-includes": "^3.1.8", ++ "array.prototype.findlastindex": "^1.2.5", ++ "array.prototype.flat": "^1.3.2", ++ "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", +- "eslint-import-resolver-node": "^0.3.7", +- "eslint-module-utils": "^2.7.4", +- "has": "^1.0.3", +- "is-core-module": "^2.11.0", ++ "eslint-import-resolver-node": "^0.3.9", ++ "eslint-module-utils": "^2.12.0", ++ "hasown": "^2.0.2", ++ "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", +- "object.values": "^1.1.6", +- "resolve": "^1.22.1", +- "semver": "^6.3.0", +- "tsconfig-paths": "^3.14.1" ++ "object.fromentries": "^2.0.8", ++ "object.groupby": "^1.0.3", ++ "object.values": "^1.2.0", ++ "semver": "^6.3.1", ++ "string.prototype.trimend": "^1.0.8", ++ "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { +- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" ++ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" ++ } ++ }, ++ "node_modules/eslint-plugin-import/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { +@@ -2716,21 +3024,97 @@ + "node": ">=0.10.0" + } + }, ++ "node_modules/eslint-plugin-import/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "dependencies": { ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, ++ "node_modules/eslint-plugin-import/node_modules/semver": { ++ "version": "6.3.1", ++ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", ++ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", ++ "dev": true, ++ "bin": { ++ "semver": "bin/semver.js" ++ } ++ }, ++ "node_modules/eslint-plugin-jsx-a11y": { ++ "version": "6.10.0", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", ++ "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", ++ "dev": true, ++ "dependencies": { ++ "aria-query": "~5.1.3", ++ "array-includes": "^3.1.8", ++ "array.prototype.flatmap": "^1.3.2", ++ "ast-types-flow": "^0.0.8", ++ "axe-core": "^4.10.0", ++ "axobject-query": "^4.1.0", ++ "damerau-levenshtein": "^1.0.8", ++ "emoji-regex": "^9.2.2", ++ "es-iterator-helpers": "^1.0.19", ++ "hasown": "^2.0.2", ++ "jsx-ast-utils": "^3.3.5", ++ "language-tags": "^1.0.9", ++ "minimatch": "^3.1.2", ++ "object.fromentries": "^2.0.8", ++ "safe-regex-test": "^1.0.3", ++ "string.prototype.includes": "^2.0.0" ++ }, ++ "engines": { ++ "node": ">=4.0" ++ }, ++ "peerDependencies": { ++ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" ++ } ++ }, ++ "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "dependencies": { ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, + "node_modules/eslint-plugin-n": { +- "version": "16.0.0", +- "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.0.tgz", +- "integrity": "sha512-akkZTE3hsHBrq6CwmGuYCzQREbVUrA855kzcHqe6i0FLBkeY7Y/6tThCVkjUnjhvRBAlc+8lILcSe5QvvDpeZQ==", ++ "version": "16.6.2", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", ++ "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", +- "eslint-plugin-es-x": "^6.1.0", +- "ignore": "^5.1.1", +- "is-core-module": "^2.12.0", ++ "eslint-plugin-es-x": "^7.5.0", ++ "get-tsconfig": "^4.7.0", ++ "globals": "^13.24.0", ++ "ignore": "^5.2.4", ++ "is-builtin-module": "^3.2.1", ++ "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", +- "semver": "^7.5.0" ++ "semver": "^7.5.3" + }, + "engines": { + "node": ">=16.0.0" +@@ -2742,42 +3126,30 @@ + "eslint": ">=7.0.0" + } + }, +- "node_modules/eslint-plugin-n/node_modules/lru-cache": { +- "version": "6.0.0", +- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", +- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", ++ "node_modules/eslint-plugin-n/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { +- "yallist": "^4.0.0" +- }, +- "engines": { +- "node": ">=10" ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" + } + }, +- "node_modules/eslint-plugin-n/node_modules/semver": { +- "version": "7.5.4", +- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", +- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", ++ "node_modules/eslint-plugin-n/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { +- "lru-cache": "^6.0.0" +- }, +- "bin": { +- "semver": "bin/semver.js" ++ "brace-expansion": "^1.1.7" + }, + "engines": { +- "node": ">=10" ++ "node": "*" + } + }, +- "node_modules/eslint-plugin-n/node_modules/yallist": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", +- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", +- "dev": true, +- "peer": true +- }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", +@@ -2798,51 +3170,88 @@ + "eslint": ">=5.16.0" + } + }, ++ "node_modules/eslint-plugin-node/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "node_modules/eslint-plugin-node/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "dependencies": { ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, ++ "node_modules/eslint-plugin-node/node_modules/semver": { ++ "version": "6.3.1", ++ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", ++ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", ++ "dev": true, ++ "bin": { ++ "semver": "bin/semver.js" ++ } ++ }, + "node_modules/eslint-plugin-promise": { +- "version": "6.1.1", +- "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", +- "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", ++ "version": "6.6.0", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", ++ "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" ++ }, + "peerDependencies": { +- "eslint": "^7.0.0 || ^8.0.0" ++ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react": { +- "version": "7.32.2", +- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", +- "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", ++ "version": "7.37.1", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz", ++ "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==", + "dev": true, + "dependencies": { +- "array-includes": "^3.1.6", +- "array.prototype.flatmap": "^1.3.1", +- "array.prototype.tosorted": "^1.1.1", ++ "array-includes": "^3.1.8", ++ "array.prototype.findlast": "^1.2.5", ++ "array.prototype.flatmap": "^1.3.2", ++ "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", ++ "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", ++ "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", +- "object.entries": "^1.1.6", +- "object.fromentries": "^2.0.6", +- "object.hasown": "^1.1.2", +- "object.values": "^1.1.6", ++ "object.entries": "^1.1.8", ++ "object.fromentries": "^2.0.8", ++ "object.values": "^1.2.0", + "prop-types": "^15.8.1", +- "resolve": "^2.0.0-next.4", +- "semver": "^6.3.0", +- "string.prototype.matchall": "^4.0.8" ++ "resolve": "^2.0.0-next.5", ++ "semver": "^6.3.1", ++ "string.prototype.matchall": "^4.0.11", ++ "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { +- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" ++ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { +- "version": "4.6.0", +- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", +- "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", ++ "version": "4.6.2", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", ++ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" +@@ -2851,6 +3260,16 @@ + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, ++ "node_modules/eslint-plugin-react/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", +@@ -2863,13 +3282,25 @@ + "node": ">=0.10.0" + } + }, ++ "node_modules/eslint-plugin-react/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "dependencies": { ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, + "node_modules/eslint-plugin-react/node_modules/resolve": { +- "version": "2.0.0-next.4", +- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", +- "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", ++ "version": "2.0.0-next.5", ++ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", ++ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { +- "is-core-module": "^2.9.0", ++ "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, +@@ -2880,10 +3311,19 @@ + "url": "https://github.com/sponsors/ljharb" + } + }, ++ "node_modules/eslint-plugin-react/node_modules/semver": { ++ "version": "6.3.1", ++ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", ++ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", ++ "dev": true, ++ "bin": { ++ "semver": "bin/semver.js" ++ } ++ }, + "node_modules/eslint-scope": { +- "version": "7.2.0", +- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", +- "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", ++ "version": "7.2.2", ++ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", ++ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", +@@ -2921,9 +3361,9 @@ + } + }, + "node_modules/eslint-visitor-keys": { +- "version": "3.4.1", +- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", +- "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", ++ "version": "3.4.3", ++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", ++ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +@@ -2932,65 +3372,14 @@ + "url": "https://opencollective.com/eslint" + } + }, +- "node_modules/eslint/node_modules/ansi-styles": { +- "version": "4.3.0", +- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", +- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", +- "dev": true, +- "dependencies": { +- "color-convert": "^2.0.1" +- }, +- "engines": { +- "node": ">=8" +- }, +- "funding": { +- "url": "https://github.com/chalk/ansi-styles?sponsor=1" +- } +- }, +- "node_modules/eslint/node_modules/chalk": { +- "version": "4.1.2", +- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", +- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", +- "dev": true, +- "dependencies": { +- "ansi-styles": "^4.1.0", +- "supports-color": "^7.1.0" +- }, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/chalk/chalk?sponsor=1" +- } +- }, +- "node_modules/eslint/node_modules/color-convert": { +- "version": "2.0.1", +- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", +- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", ++ "node_modules/eslint/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { +- "color-name": "~1.1.4" +- }, +- "engines": { +- "node": ">=7.0.0" +- } +- }, +- "node_modules/eslint/node_modules/color-name": { +- "version": "1.1.4", +- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", +- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", +- "dev": true +- }, +- "node_modules/eslint/node_modules/escape-string-regexp": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", +- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", +- "dev": true, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/glob-parent": { +@@ -3005,61 +3394,25 @@ + "node": ">=10.13.0" + } + }, +- "node_modules/eslint/node_modules/globals": { +- "version": "13.20.0", +- "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", +- "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", +- "dev": true, +- "dependencies": { +- "type-fest": "^0.20.2" +- }, +- "engines": { +- "node": ">=8" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" +- } +- }, +- "node_modules/eslint/node_modules/has-flag": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", +- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", +- "dev": true, +- "engines": { +- "node": ">=8" +- } +- }, +- "node_modules/eslint/node_modules/supports-color": { +- "version": "7.2.0", +- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", +- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", ++ "node_modules/eslint/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { +- "has-flag": "^4.0.0" ++ "brace-expansion": "^1.1.7" + }, + "engines": { +- "node": ">=8" +- } +- }, +- "node_modules/eslint/node_modules/type-fest": { +- "version": "0.20.2", +- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", +- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", +- "dev": true, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "node": "*" + } + }, + "node_modules/espree": { +- "version": "9.5.2", +- "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", +- "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", ++ "version": "9.6.1", ++ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", ++ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { +- "acorn": "^8.8.0", ++ "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, +@@ -3071,9 +3424,9 @@ + } + }, + "node_modules/esquery": { +- "version": "1.5.0", +- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", +- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", ++ "version": "1.6.0", ++ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", ++ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" +@@ -3119,16 +3472,16 @@ + "dev": true + }, + "node_modules/fast-glob": { +- "version": "3.3.0", +- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", +- "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", ++ "version": "3.3.3", ++ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", ++ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", +- "micromatch": "^4.0.4" ++ "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" +@@ -3146,9 +3499,25 @@ + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, +- "node_modules/fastest-levenshtein": { +- "version": "1.0.16", +- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", ++ "node_modules/fast-uri": { ++ "version": "3.0.6", ++ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", ++ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", ++ "dev": true, ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/fastify" ++ }, ++ { ++ "type": "opencollective", ++ "url": "https://opencollective.com/fastify" ++ } ++ ] ++ }, ++ "node_modules/fastest-levenshtein": { ++ "version": "1.0.16", ++ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { +@@ -3156,9 +3525,9 @@ + } + }, + "node_modules/fastq": { +- "version": "1.15.0", +- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", +- "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", ++ "version": "1.18.0", ++ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", ++ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" +@@ -3177,14 +3546,14 @@ + } + }, + "node_modules/file-selector": { +- "version": "0.1.19", +- "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.1.19.tgz", +- "integrity": "sha512-kCWw3+Aai8Uox+5tHCNgMFaUdgidxvMnLWO6fM5sZ0hA2wlHP5/DHGF0ECe84BiB95qdJbKNEJhWKVDvMN+JDQ==", ++ "version": "2.1.2", ++ "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", ++ "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", + "dependencies": { +- "tslib": "^2.0.1" ++ "tslib": "^2.7.0" + }, + "engines": { +- "node": ">= 10" ++ "node": ">= 12" + } + }, + "node_modules/fill-range": { +@@ -3216,12 +3585,13 @@ + } + }, + "node_modules/flat-cache": { +- "version": "3.0.4", +- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", +- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", ++ "version": "3.2.0", ++ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", ++ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { +- "flatted": "^3.1.0", ++ "flatted": "^3.2.9", ++ "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { +@@ -3229,26 +3599,48 @@ + } + }, + "node_modules/flatted": { +- "version": "3.2.7", +- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", +- "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", ++ "version": "3.3.2", ++ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", ++ "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true + }, + "node_modules/focus-trap": { +- "version": "6.9.2", +- "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-6.9.2.tgz", +- "integrity": "sha512-gBEuXOPNOKPrLdZpMFUSTyIo1eT2NSZRrwZ9r/0Jqw5tmT3Yvxfmu8KBHw8xW2XQkw6E/JoG+OlEq7UDtSUNgw==", ++ "version": "7.5.4", ++ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", ++ "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dependencies": { +- "tabbable": "^5.3.2" ++ "tabbable": "^6.2.0" + } + }, + "node_modules/for-each": { +- "version": "0.3.3", +- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", +- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", ++ "version": "0.3.4", ++ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz", ++ "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==", ++ "dev": true, ++ "dependencies": { ++ "is-callable": "^1.2.7" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/foreground-child": { ++ "version": "3.3.0", ++ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", ++ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { +- "is-callable": "^1.1.3" ++ "cross-spawn": "^7.0.0", ++ "signal-exit": "^4.0.1" ++ }, ++ "engines": { ++ "node": ">=14" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-extra": { +@@ -3272,9 +3664,9 @@ + "dev": true + }, + "node_modules/fsevents": { +- "version": "2.3.2", +- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", +- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", ++ "version": "2.3.3", ++ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", ++ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, +@@ -3286,21 +3678,26 @@ + } + }, + "node_modules/function-bind": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", +- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", +- "dev": true ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", ++ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", ++ "dev": true, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } + }, + "node_modules/function.prototype.name": { +- "version": "1.1.5", +- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", +- "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", ++ "version": "1.1.8", ++ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", ++ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.3", +- "es-abstract": "^1.19.0", +- "functions-have-names": "^1.2.2" ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "define-properties": "^1.2.1", ++ "functions-have-names": "^1.2.3", ++ "hasown": "^2.0.2", ++ "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" +@@ -3318,39 +3715,64 @@ + "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/gensync": { +- "version": "1.0.0-beta.2", +- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", +- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", ++ "node_modules/get-east-asian-width": { ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", ++ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, +- "peer": true, + "engines": { +- "node": ">=6.9.0" ++ "node": ">=18" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", +- "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", ++ "version": "1.2.7", ++ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", ++ "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "dev": true, + "dependencies": { +- "function-bind": "^1.1.1", +- "has": "^1.0.3", +- "has-proto": "^1.0.1", +- "has-symbols": "^1.0.3" ++ "call-bind-apply-helpers": "^1.0.1", ++ "es-define-property": "^1.0.1", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", ++ "function-bind": "^1.1.2", ++ "get-proto": "^1.0.0", ++ "gopd": "^1.2.0", ++ "has-symbols": "^1.1.0", ++ "hasown": "^2.0.2", ++ "math-intrinsics": "^1.1.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, ++ "node_modules/get-proto": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", ++ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", ++ "dev": true, ++ "dependencies": { ++ "dunder-proto": "^1.0.1", ++ "es-object-atoms": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, + "node_modules/get-symbol-description": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", +- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", ++ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "get-intrinsic": "^1.1.1" ++ "call-bound": "^1.0.3", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" +@@ -3359,12 +3781,26 @@ + "url": "https://github.com/sponsors/ljharb" + } + }, ++ "node_modules/get-tsconfig": { ++ "version": "4.10.0", ++ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", ++ "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", ++ "dev": true, ++ "peer": true, ++ "dependencies": { ++ "resolve-pkg-maps": "^1.0.0" ++ }, ++ "funding": { ++ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" ++ } ++ }, + "node_modules/gettext-parser": { +- "version": "2.0.0", +- "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-2.0.0.tgz", +- "integrity": "sha512-FDs/7XjNw58ToQwJFO7avZZbPecSYgw8PBYhd0An+4JtZSrSzKhEvTsVV2uqdO7VziWTOGSgLGD5YRPdsCjF7Q==", ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-2.1.0.tgz", ++ "integrity": "sha512-YGmu8DSm7PBnwItT+aOiqejOogqctHFzn+wBKUzjDFQP00psAtn/W2paWQxqE5eA5Ijrqaf7xuTKqyCHpuxnrg==", + "dependencies": { + "encoding": "^0.1.12", ++ "readable-stream": "^2.0.0", + "safe-buffer": "^5.1.2" + } + }, +@@ -3391,20 +3827,23 @@ + } + }, + "node_modules/glob": { +- "version": "7.2.3", +- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", +- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", ++ "version": "11.0.0", ++ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", ++ "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "dependencies": { +- "fs.realpath": "^1.0.0", +- "inflight": "^1.0.4", +- "inherits": "2", +- "minimatch": "^3.1.1", +- "once": "^1.3.0", +- "path-is-absolute": "^1.0.0" ++ "foreground-child": "^3.1.0", ++ "jackspeak": "^4.0.1", ++ "minimatch": "^10.0.0", ++ "minipass": "^7.1.2", ++ "package-json-from-dist": "^1.0.0", ++ "path-scurry": "^2.0.0" ++ }, ++ "bin": { ++ "glob": "dist/esm/bin.mjs" + }, + "engines": { +- "node": "*" ++ "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" +@@ -3422,6 +3861,21 @@ + "node": ">= 6" + } + }, ++ "node_modules/glob/node_modules/minimatch": { ++ "version": "10.0.1", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", ++ "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", ++ "dev": true, ++ "dependencies": { ++ "brace-expansion": "^2.0.1" ++ }, ++ "engines": { ++ "node": "20 || >=22" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" ++ } ++ }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", +@@ -3461,22 +3915,28 @@ + } + }, + "node_modules/globals": { +- "version": "11.12.0", +- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", +- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", ++ "version": "13.24.0", ++ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", ++ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, +- "peer": true, ++ "dependencies": { ++ "type-fest": "^0.20.2" ++ }, + "engines": { +- "node": ">=4" ++ "node": ">=8" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", +- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", ++ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { +- "define-properties": "^1.1.3" ++ "define-properties": "^1.2.1", ++ "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" +@@ -3524,12 +3984,12 @@ + "dev": true + }, + "node_modules/gopd": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", +- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", ++ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, +- "dependencies": { +- "get-intrinsic": "^1.1.3" ++ "engines": { ++ "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" +@@ -3547,62 +4007,47 @@ + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, +- "node_modules/hard-rejection": { +- "version": "2.1.0", +- "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", +- "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", ++ "node_modules/has-bigints": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", ++ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "engines": { +- "node": ">=6" +- } +- }, +- "node_modules/has": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", +- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", +- "dev": true, +- "dependencies": { +- "function-bind": "^1.1.1" ++ "node": ">= 0.4" + }, +- "engines": { +- "node": ">= 0.4.0" +- } +- }, +- "node_modules/has-bigints": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", +- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", +- "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", +- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", ++ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { +- "node": ">=4" ++ "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", +- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", ++ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { +- "get-intrinsic": "^1.1.1" ++ "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", +- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", ++ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, ++ "dependencies": { ++ "dunder-proto": "^1.0.0" ++ }, + "engines": { + "node": ">= 0.4" + }, +@@ -3611,9 +4056,9 @@ + } + }, + "node_modules/has-symbols": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", +- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", ++ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "engines": { + "node": ">= 0.4" +@@ -3623,12 +4068,12 @@ + } + }, + "node_modules/has-tostringtag": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", +- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", ++ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { +- "has-symbols": "^1.0.2" ++ "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" +@@ -3637,44 +4082,26 @@ + "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/hoist-non-react-statics": { +- "version": "3.3.2", +- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", +- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", +- "dependencies": { +- "react-is": "^16.7.0" +- } +- }, +- "node_modules/hosted-git-info": { +- "version": "4.1.0", +- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", +- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", ++ "node_modules/hasown": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", ++ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { +- "lru-cache": "^6.0.0" ++ "function-bind": "^1.1.2" + }, + "engines": { +- "node": ">=10" ++ "node": ">= 0.4" + } + }, +- "node_modules/hosted-git-info/node_modules/lru-cache": { +- "version": "6.0.0", +- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", +- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", +- "dev": true, ++ "node_modules/hoist-non-react-statics": { ++ "version": "3.3.2", ++ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", ++ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { +- "yallist": "^4.0.0" +- }, +- "engines": { +- "node": ">=10" ++ "react-is": "^16.7.0" + } + }, +- "node_modules/hosted-git-info/node_modules/yallist": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", +- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", +- "dev": true +- }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", +@@ -3708,18 +4135,18 @@ + } + }, + "node_modules/ignore": { +- "version": "5.2.4", +- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", +- "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", ++ "version": "5.3.2", ++ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", ++ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { +- "version": "4.3.0", +- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", +- "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", ++ "version": "4.3.7", ++ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", ++ "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true + }, + "node_modules/import-fresh": { +@@ -3738,15 +4165,6 @@ + "url": "https://github.com/sponsors/sindresorhus" + } + }, +- "node_modules/import-lazy": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", +- "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", +- "dev": true, +- "engines": { +- "node": ">=8" +- } +- }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", +@@ -3756,22 +4174,11 @@ + "node": ">=0.8.19" + } + }, +- "node_modules/indent-string": { +- "version": "5.0.0", +- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", +- "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", +- "dev": true, +- "engines": { +- "node": ">=12" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" +- } +- }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", ++ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", +@@ -3781,8 +4188,7 @@ + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", +- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", +- "dev": true ++ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", +@@ -3791,14 +4197,14 @@ + "dev": true + }, + "node_modules/internal-slot": { +- "version": "1.0.5", +- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", +- "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", ++ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "dependencies": { +- "get-intrinsic": "^1.2.0", +- "has": "^1.0.3", +- "side-channel": "^1.0.4" ++ "es-errors": "^1.3.0", ++ "hasown": "^2.0.2", ++ "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" +@@ -3821,15 +4227,34 @@ + "node": ">=8" + } + }, ++ "node_modules/is-arguments": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", ++ "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", ++ "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.2", ++ "has-tostringtag": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, + "node_modules/is-array-buffer": { +- "version": "3.0.2", +- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", +- "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", ++ "version": "3.0.5", ++ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", ++ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "get-intrinsic": "^1.2.0", +- "is-typed-array": "^1.1.10" ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "get-intrinsic": "^1.2.6" ++ }, ++ "engines": { ++ "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" +@@ -3841,13 +4266,35 @@ + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, ++ "node_modules/is-async-function": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", ++ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", ++ "dev": true, ++ "dependencies": { ++ "async-function": "^1.0.0", ++ "call-bound": "^1.0.3", ++ "get-proto": "^1.0.1", ++ "has-tostringtag": "^1.0.2", ++ "safe-regex-test": "^1.1.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, + "node_modules/is-bigint": { +- "version": "1.0.4", +- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", +- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", ++ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "dependencies": { +- "has-bigints": "^1.0.1" ++ "has-bigints": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" +@@ -3866,13 +4313,13 @@ + } + }, + "node_modules/is-boolean-object": { +- "version": "1.1.2", +- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", +- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", ++ "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "has-tostringtag": "^1.0.0" ++ "call-bound": "^1.0.2", ++ "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" +@@ -3881,6 +4328,22 @@ + "url": "https://github.com/sponsors/ljharb" + } + }, ++ "node_modules/is-builtin-module": { ++ "version": "3.2.1", ++ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", ++ "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", ++ "dev": true, ++ "peer": true, ++ "dependencies": { ++ "builtin-modules": "^3.3.0" ++ }, ++ "engines": { ++ "node": ">=6" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", +@@ -3894,24 +4357,29 @@ + } + }, + "node_modules/is-core-module": { +- "version": "2.12.1", +- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", +- "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", ++ "version": "2.16.1", ++ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", ++ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { +- "has": "^1.0.3" ++ "hasown": "^2.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/is-date-object": { +- "version": "1.0.5", +- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", +- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", ++ "node_modules/is-data-view": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", ++ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "dependencies": { +- "has-tostringtag": "^1.0.0" ++ "call-bound": "^1.0.2", ++ "get-intrinsic": "^1.2.6", ++ "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" +@@ -3920,15 +4388,46 @@ + "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/is-extglob": { +- "version": "2.1.1", +- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", +- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", +- "dev": true, ++ "node_modules/is-date-object": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", ++ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", ++ "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.2", ++ "has-tostringtag": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-extglob": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", ++ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", ++ "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, ++ "node_modules/is-finalizationregistry": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", ++ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", ++ "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.3" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", +@@ -3938,6 +4437,24 @@ + "node": ">=8" + } + }, ++ "node_modules/is-generator-function": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", ++ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", ++ "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.3", ++ "get-proto": "^1.0.0", ++ "has-tostringtag": "^1.0.2", ++ "safe-regex-test": "^1.1.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", +@@ -3950,10 +4467,10 @@ + "node": ">=0.10.0" + } + }, +- "node_modules/is-negative-zero": { +- "version": "2.0.2", +- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", +- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", ++ "node_modules/is-map": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", ++ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" +@@ -3972,12 +4489,13 @@ + } + }, + "node_modules/is-number-object": { +- "version": "1.0.7", +- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", +- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", ++ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "dependencies": { +- "has-tostringtag": "^1.0.0" ++ "call-bound": "^1.0.3", ++ "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" +@@ -3995,15 +4513,6 @@ + "node": ">=8" + } + }, +- "node_modules/is-plain-obj": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", +- "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", +- "dev": true, +- "engines": { +- "node": ">=0.10.0" +- } +- }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", +@@ -4014,13 +4523,15 @@ + } + }, + "node_modules/is-regex": { +- "version": "1.1.4", +- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", +- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", ++ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "has-tostringtag": "^1.0.0" ++ "call-bound": "^1.0.2", ++ "gopd": "^1.2.0", ++ "has-tostringtag": "^1.0.2", ++ "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" +@@ -4029,25 +4540,41 @@ + "url": "https://github.com/sponsors/ljharb" + } + }, ++ "node_modules/is-set": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", ++ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", ++ "dev": true, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, + "node_modules/is-shared-array-buffer": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", +- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", ++ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2" ++ "call-bound": "^1.0.3" ++ }, ++ "engines": { ++ "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { +- "version": "1.0.7", +- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", +- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", ++ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "dependencies": { +- "has-tostringtag": "^1.0.0" ++ "call-bound": "^1.0.3", ++ "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" +@@ -4057,12 +4584,14 @@ + } + }, + "node_modules/is-symbol": { +- "version": "1.0.4", +- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", +- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", ++ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "dependencies": { +- "has-symbols": "^1.0.2" ++ "call-bound": "^1.0.2", ++ "has-symbols": "^1.1.0", ++ "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" +@@ -4072,16 +4601,12 @@ + } + }, + "node_modules/is-typed-array": { +- "version": "1.1.10", +- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", +- "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", ++ "version": "1.1.15", ++ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", ++ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "dependencies": { +- "available-typed-arrays": "^1.0.5", +- "call-bind": "^1.0.2", +- "for-each": "^0.3.3", +- "gopd": "^1.0.1", +- "has-tostringtag": "^1.0.0" ++ "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" +@@ -4091,41 +4616,120 @@ + } + }, + "node_modules/is-unicode-supported": { +- "version": "0.1.0", +- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", +- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", ++ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "engines": { +- "node": ">=10" ++ "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, ++ "node_modules/is-weakmap": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", ++ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", ++ "dev": true, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, + "node_modules/is-weakref": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", +- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", ++ "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", ++ "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/is-weakset": { ++ "version": "2.0.4", ++ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", ++ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2" ++ "call-bound": "^1.0.3", ++ "get-intrinsic": "^1.2.6" ++ }, ++ "engines": { ++ "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, ++ "node_modules/isarray": { ++ "version": "2.0.5", ++ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", ++ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", ++ "dev": true ++ }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, ++ "node_modules/iterator.prototype": { ++ "version": "1.1.5", ++ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", ++ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", ++ "dev": true, ++ "dependencies": { ++ "define-data-property": "^1.1.4", ++ "es-object-atoms": "^1.0.0", ++ "get-intrinsic": "^1.2.6", ++ "get-proto": "^1.0.0", ++ "has-symbols": "^1.1.0", ++ "set-function-name": "^2.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/jackspeak": { ++ "version": "4.0.2", ++ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", ++ "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", ++ "dev": true, ++ "dependencies": { ++ "@isaacs/cliui": "^8.0.2" ++ }, ++ "engines": { ++ "node": "20 || >=22" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" ++ } ++ }, + "node_modules/jed": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz", + "integrity": "sha512-z35ZSEcXHxLW4yumw0dF6L464NT36vmx3wxJw8MDpraBcWuNVgUPZgPJKcu1HekNgwlMFNqol7i/IpSbjhqwqA==", + "dev": true + }, ++ "node_modules/js-sha1": { ++ "version": "0.7.0", ++ "resolved": "https://registry.npmjs.org/js-sha1/-/js-sha1-0.7.0.tgz", ++ "integrity": "sha512-oQZ1Mo7440BfLSv9TX87VNEyU52pXPVG19F9PL3gTgNt0tVxlZ8F4O6yze3CLuLx28TxotxvlyepCNaaV0ZjMw==" ++ }, ++ "node_modules/js-sha256": { ++ "version": "0.11.0", ++ "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.11.0.tgz", ++ "integrity": "sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q==" ++ }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", +@@ -4143,18 +4747,11 @@ + "js-yaml": "bin/js-yaml.js" + } + }, +- "node_modules/jsesc": { +- "version": "2.5.2", +- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", +- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", +- "dev": true, +- "peer": true, +- "bin": { +- "jsesc": "bin/jsesc" +- }, +- "engines": { +- "node": ">=4" +- } ++ "node_modules/json-buffer": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", ++ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", ++ "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", +@@ -4171,8 +4768,7 @@ + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", +- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", +- "dev": true ++ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", +@@ -4180,16 +4776,15 @@ + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { +- "version": "2.2.3", +- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", +- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", ++ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, +- "peer": true, ++ "dependencies": { ++ "minimist": "^1.2.0" ++ }, + "bin": { + "json5": "lib/cli.js" +- }, +- "engines": { +- "node": ">=6" + } + }, + "node_modules/jsonfile": { +@@ -4205,18 +4800,29 @@ + } + }, + "node_modules/jsx-ast-utils": { +- "version": "3.3.3", +- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", +- "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", ++ "version": "3.3.5", ++ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", ++ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { +- "array-includes": "^3.1.5", +- "object.assign": "^4.1.3" ++ "array-includes": "^3.1.6", ++ "array.prototype.flat": "^1.3.1", ++ "object.assign": "^4.1.4", ++ "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, ++ "node_modules/keyv": { ++ "version": "4.5.4", ++ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", ++ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", ++ "dev": true, ++ "dependencies": { ++ "json-buffer": "3.0.1" ++ } ++ }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", +@@ -4227,11 +4833,29 @@ + } + }, + "node_modules/known-css-properties": { +- "version": "0.27.0", +- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz", +- "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==", ++ "version": "0.34.0", ++ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", ++ "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", ++ "dev": true ++ }, ++ "node_modules/language-subtag-registry": { ++ "version": "0.3.23", ++ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", ++ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true + }, ++ "node_modules/language-tags": { ++ "version": "1.0.9", ++ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", ++ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", ++ "dev": true, ++ "dependencies": { ++ "language-subtag-registry": "^0.3.20" ++ }, ++ "engines": { ++ "node": ">=0.10" ++ } ++ }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", +@@ -4284,91 +4908,21 @@ + "dev": true + }, + "node_modules/log-symbols": { +- "version": "4.1.0", +- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", +- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", ++ "version": "7.0.0", ++ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.0.tgz", ++ "integrity": "sha512-zrc91EDk2M+2AXo/9BTvK91pqb7qrPg2nX/Hy+u8a5qQlbaOflCKO+6SqgZ+M+xUFxGdKTgwnGiL96b1W3ikRA==", + "dev": true, + "dependencies": { +- "chalk": "^4.1.0", +- "is-unicode-supported": "^0.1.0" ++ "is-unicode-supported": "^2.0.0", ++ "yoctocolors": "^2.1.1" + }, + "engines": { +- "node": ">=10" ++ "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, +- "node_modules/log-symbols/node_modules/ansi-styles": { +- "version": "4.3.0", +- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", +- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", +- "dev": true, +- "dependencies": { +- "color-convert": "^2.0.1" +- }, +- "engines": { +- "node": ">=8" +- }, +- "funding": { +- "url": "https://github.com/chalk/ansi-styles?sponsor=1" +- } +- }, +- "node_modules/log-symbols/node_modules/chalk": { +- "version": "4.1.2", +- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", +- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", +- "dev": true, +- "dependencies": { +- "ansi-styles": "^4.1.0", +- "supports-color": "^7.1.0" +- }, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/chalk/chalk?sponsor=1" +- } +- }, +- "node_modules/log-symbols/node_modules/color-convert": { +- "version": "2.0.1", +- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", +- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", +- "dev": true, +- "dependencies": { +- "color-name": "~1.1.4" +- }, +- "engines": { +- "node": ">=7.0.0" +- } +- }, +- "node_modules/log-symbols/node_modules/color-name": { +- "version": "1.1.4", +- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", +- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", +- "dev": true +- }, +- "node_modules/log-symbols/node_modules/has-flag": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", +- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", +- "dev": true, +- "engines": { +- "node": ">=8" +- } +- }, +- "node_modules/log-symbols/node_modules/supports-color": { +- "version": "7.2.0", +- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", +- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", +- "dev": true, +- "dependencies": { +- "has-flag": "^4.0.0" +- }, +- "engines": { +- "node": ">=8" +- } +- }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", +@@ -4381,13 +4935,12 @@ + } + }, + "node_modules/lru-cache": { +- "version": "5.1.1", +- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", +- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", ++ "version": "11.0.2", ++ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", ++ "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "dev": true, +- "peer": true, +- "dependencies": { +- "yallist": "^3.0.2" ++ "engines": { ++ "node": "20 || >=22" + } + }, + "node_modules/magic-string": { +@@ -4399,16 +4952,13 @@ + "sourcemap-codec": "^1.4.8" + } + }, +- "node_modules/map-obj": { +- "version": "4.3.0", +- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", +- "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", ++ "node_modules/math-intrinsics": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", ++ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { +- "node": ">=8" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "node": ">= 0.4" + } + }, + "node_modules/mathml-tag-names": { +@@ -4428,26 +4978,12 @@ + "dev": true + }, + "node_modules/meow": { +- "version": "10.1.5", +- "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", +- "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", ++ "version": "13.2.0", ++ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", ++ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, +- "dependencies": { +- "@types/minimist": "^1.2.2", +- "camelcase-keys": "^7.0.0", +- "decamelize": "^5.0.0", +- "decamelize-keys": "^1.1.0", +- "hard-rejection": "^2.1.0", +- "minimist-options": "4.1.0", +- "normalize-package-data": "^3.0.2", +- "read-pkg-up": "^8.0.0", +- "redent": "^4.0.0", +- "trim-newlines": "^4.0.2", +- "type-fest": "^1.2.2", +- "yargs-parser": "^20.2.9" +- }, + "engines": { +- "node": "^12.20.0 || ^14.13.1 || >=16.0.0" ++ "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" +@@ -4475,25 +5011,19 @@ + "node": ">=8.6" + } + }, +- "node_modules/min-indent": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", +- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", +- "dev": true, +- "engines": { +- "node": ">=4" +- } +- }, + "node_modules/minimatch": { +- "version": "3.1.2", +- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", +- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "version": "9.0.5", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", ++ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { +- "brace-expansion": "^1.1.7" ++ "brace-expansion": "^2.0.1" + }, + "engines": { +- "node": "*" ++ "node": ">=16 || 14 >=14.17" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { +@@ -4505,24 +5035,19 @@ + "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/minimist-options": { +- "version": "4.1.0", +- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", +- "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", ++ "node_modules/minipass": { ++ "version": "7.1.2", ++ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", ++ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, +- "dependencies": { +- "arrify": "^1.0.1", +- "is-plain-obj": "^1.1.0", +- "kind-of": "^6.0.3" +- }, + "engines": { +- "node": ">= 6" ++ "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { +- "version": "2.1.2", +- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", +- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", ++ "version": "2.1.3", ++ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", ++ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { +@@ -4536,7 +5061,6 @@ + "url": "https://github.com/sponsors/ai" + } + ], +- "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, +@@ -4550,13 +5074,6 @@ + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, +- "node_modules/node-releases": { +- "version": "2.0.12", +- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", +- "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", +- "dev": true, +- "peer": true +- }, + "node_modules/node-watch": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.3.tgz", +@@ -4566,54 +5083,6 @@ + "node": ">=6" + } + }, +- "node_modules/normalize-package-data": { +- "version": "3.0.3", +- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", +- "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", +- "dev": true, +- "dependencies": { +- "hosted-git-info": "^4.0.1", +- "is-core-module": "^2.5.0", +- "semver": "^7.3.4", +- "validate-npm-package-license": "^3.0.1" +- }, +- "engines": { +- "node": ">=10" +- } +- }, +- "node_modules/normalize-package-data/node_modules/lru-cache": { +- "version": "6.0.0", +- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", +- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", +- "dev": true, +- "dependencies": { +- "yallist": "^4.0.0" +- }, +- "engines": { +- "node": ">=10" +- } +- }, +- "node_modules/normalize-package-data/node_modules/semver": { +- "version": "7.5.4", +- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", +- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", +- "dev": true, +- "dependencies": { +- "lru-cache": "^6.0.0" +- }, +- "bin": { +- "semver": "bin/semver.js" +- }, +- "engines": { +- "node": ">=10" +- } +- }, +- "node_modules/normalize-package-data/node_modules/yallist": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", +- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", +- "dev": true +- }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", +@@ -4632,10 +5101,29 @@ + } + }, + "node_modules/object-inspect": { +- "version": "1.12.3", +- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", +- "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", ++ "version": "1.13.3", ++ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", ++ "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", ++ "dev": true, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/object-is": { ++ "version": "1.1.6", ++ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", ++ "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } +@@ -4650,14 +5138,16 @@ + } + }, + "node_modules/object.assign": { +- "version": "4.1.4", +- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", +- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", ++ "version": "4.1.7", ++ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", ++ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.4", +- "has-symbols": "^1.0.3", ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "define-properties": "^1.2.1", ++ "es-object-atoms": "^1.0.0", ++ "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { +@@ -4668,28 +5158,29 @@ + } + }, + "node_modules/object.entries": { +- "version": "1.1.6", +- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", +- "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", ++ "version": "1.1.8", ++ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", ++ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.4", +- "es-abstract": "^1.20.4" ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { +- "version": "2.0.6", +- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", +- "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", ++ "version": "2.0.8", ++ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", ++ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.4", +- "es-abstract": "^1.20.4" ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.2", ++ "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -4698,28 +5189,30 @@ + "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/object.hasown": { +- "version": "1.1.2", +- "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", +- "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", ++ "node_modules/object.groupby": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", ++ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { +- "define-properties": "^1.1.4", +- "es-abstract": "^1.20.4" ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.2" + }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "engines": { ++ "node": ">= 0.4" + } + }, + "node_modules/object.values": { +- "version": "1.1.6", +- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", +- "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", ++ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.4", +- "es-abstract": "^1.20.4" ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "define-properties": "^1.2.1", ++ "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -4738,22 +5231,39 @@ + } + }, + "node_modules/optionator": { +- "version": "0.9.3", +- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", +- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", ++ "version": "0.9.4", ++ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", ++ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { +- "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", +- "type-check": "^0.4.0" ++ "type-check": "^0.4.0", ++ "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, ++ "node_modules/own-keys": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", ++ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", ++ "dev": true, ++ "dependencies": { ++ "get-intrinsic": "^1.2.6", ++ "object-keys": "^1.1.1", ++ "safe-push-apply": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", +@@ -4784,6 +5294,12 @@ + "url": "https://github.com/sponsors/sindresorhus" + } + }, ++ "node_modules/package-json-from-dist": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", ++ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", ++ "dev": true ++ }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", +@@ -4847,6 +5363,22 @@ + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, ++ "node_modules/path-scurry": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", ++ "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", ++ "dev": true, ++ "dependencies": { ++ "lru-cache": "^11.0.0", ++ "minipass": "^7.1.2" ++ }, ++ "engines": { ++ "node": "20 || >=22" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" ++ } ++ }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", +@@ -4857,9 +5389,9 @@ + } + }, + "node_modules/picocolors": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", +- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", ++ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { +@@ -4875,15 +5407,15 @@ + } + }, + "node_modules/plur": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", +- "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", ++ "version": "5.1.0", ++ "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", ++ "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", + "dev": true, + "dependencies": { +- "irregular-plurals": "^3.2.0" ++ "irregular-plurals": "^3.3.0" + }, + "engines": { +- "node": ">=10" ++ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" +@@ -4920,20 +5452,29 @@ + "node": ">= 6" + } + }, +- "node_modules/popper.js": { +- "version": "1.16.1", +- "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", +- "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", +- "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", +- "funding": { +- "type": "opencollective", +- "url": "https://opencollective.com/popperjs" ++ "node_modules/po2json/node_modules/gettext-parser": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-2.0.0.tgz", ++ "integrity": "sha512-FDs/7XjNw58ToQwJFO7avZZbPecSYgw8PBYhd0An+4JtZSrSzKhEvTsVV2uqdO7VziWTOGSgLGD5YRPdsCjF7Q==", ++ "dev": true, ++ "dependencies": { ++ "encoding": "^0.1.12", ++ "safe-buffer": "^5.1.2" ++ } ++ }, ++ "node_modules/possible-typed-array-names": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", ++ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", ++ "dev": true, ++ "engines": { ++ "node": ">= 0.4" + } + }, + "node_modules/postcss": { +- "version": "8.4.31", +- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", +- "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", ++ "version": "8.5.1", ++ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", ++ "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "dev": true, + "funding": [ + { +@@ -4950,9 +5491,9 @@ + } + ], + "dependencies": { +- "nanoid": "^3.3.6", +- "picocolors": "^1.0.0", +- "source-map-js": "^1.0.2" ++ "nanoid": "^3.3.8", ++ "picocolors": "^1.1.1", ++ "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" +@@ -4965,31 +5506,41 @@ + "dev": true + }, + "node_modules/postcss-resolve-nested-selector": { +- "version": "0.1.1", +- "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", +- "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", ++ "version": "0.1.6", ++ "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", ++ "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true + }, + "node_modules/postcss-safe-parser": { +- "version": "6.0.0", +- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", +- "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", ++ "version": "7.0.1", ++ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", ++ "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, ++ "funding": [ ++ { ++ "type": "opencollective", ++ "url": "https://opencollective.com/postcss/" ++ }, ++ { ++ "type": "tidelift", ++ "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" ++ }, ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/ai" ++ } ++ ], + "engines": { +- "node": ">=12.0" +- }, +- "funding": { +- "type": "opencollective", +- "url": "https://opencollective.com/postcss/" ++ "node": ">=18.0" + }, + "peerDependencies": { +- "postcss": "^8.3.3" ++ "postcss": "^8.4.31" + } + }, + "node_modules/postcss-scss": { +- "version": "4.0.6", +- "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz", +- "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==", ++ "version": "4.0.9", ++ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", ++ "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { +@@ -4999,19 +5550,23 @@ + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" ++ }, ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { +- "postcss": "^8.4.19" ++ "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { +- "version": "6.0.13", +- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", +- "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", ++ "version": "6.1.2", ++ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", ++ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", +@@ -5036,6 +5591,11 @@ + "node": ">= 0.8.0" + } + }, ++ "node_modules/process-nextick-args": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", ++ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" ++ }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", +@@ -5046,22 +5606,10 @@ + "react-is": "^16.13.1" + } + }, +- "node_modules/prop-types-extra": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", +- "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", +- "dependencies": { +- "react-is": "^16.3.2", +- "warning": "^4.0.0" +- }, +- "peerDependencies": { +- "react": ">=0.14.0" +- } +- }, + "node_modules/punycode": { +- "version": "2.3.0", +- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", +- "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", ++ "version": "2.3.1", ++ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", ++ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" +@@ -5087,22 +5635,10 @@ + } + ] + }, +- "node_modules/quick-lru": { +- "version": "5.1.1", +- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", +- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", +- "dev": true, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" +- } +- }, + "node_modules/qunit": { +- "version": "2.19.4", +- "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.19.4.tgz", +- "integrity": "sha512-aqUzzUeCqlleWYKlpgfdHHw9C6KxkB9H3wNfiBg5yHqQMzy0xw/pbCRHYFkjl8MsP/t8qkTQE+JTYL71azgiew==", ++ "version": "2.22.0", ++ "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.22.0.tgz", ++ "integrity": "sha512-wPYvAvpjTL3zlUeyCX75T8gfZfdVXZa8y1EVkGe/XZNORIsCH/WI2X8R2KlemT921X9EKSZUL6CLGSPC7Ks08g==", + "dev": true, + "dependencies": { + "commander": "7.2.0", +@@ -5116,6 +5652,18 @@ + "node": ">=10" + } + }, ++ "node_modules/qunit-tap": { ++ "version": "1.5.1", ++ "resolved": "https://registry.npmjs.org/qunit-tap/-/qunit-tap-1.5.1.tgz", ++ "integrity": "sha512-ZEgx3kF/DN5WYX3qkR7Kgq/+vtnttaHkX69GFqZ3EEKyXsQ3mYDReWjyetN3jtBEl3ZvQ7DhW6rLq/9sJzoUHQ==", ++ "dev": true, ++ "engines": [ ++ "node >=0.1.96", ++ "spidermonkey", ++ "rhino", ++ "phantomjs" ++ ] ++ }, + "node_modules/qunit/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", +@@ -5126,45 +5674,42 @@ + } + }, + "node_modules/react": { +- "version": "17.0.2", +- "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", +- "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", ++ "version": "18.3.1", ++ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", ++ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { +- "loose-envify": "^1.1.0", +- "object-assign": "^4.1.1" ++ "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { +- "version": "17.0.2", +- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", +- "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", ++ "version": "18.3.1", ++ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", ++ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", +- "object-assign": "^4.1.1", +- "scheduler": "^0.20.2" ++ "scheduler": "^0.23.2" + }, + "peerDependencies": { +- "react": "17.0.2" ++ "react": "^18.3.1" + } + }, + "node_modules/react-dropzone": { +- "version": "9.0.0", +- "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-9.0.0.tgz", +- "integrity": "sha512-wZ2o9B2qkdE3RumWhfyZT9swgJYJPeU5qHEcMU8weYpmLex1eeWX0CC32/Y0VutB+BBi2D+iePV/YZIiB4kZGw==", ++ "version": "14.3.5", ++ "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz", ++ "integrity": "sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==", + "dependencies": { +- "attr-accept": "^1.1.3", +- "file-selector": "^0.1.8", +- "prop-types": "^15.6.2", +- "prop-types-extra": "^1.1.0" ++ "attr-accept": "^2.2.4", ++ "file-selector": "^2.1.0", ++ "prop-types": "^15.8.1" + }, + "engines": { +- "node": ">= 6" ++ "node": ">= 10.13" + }, + "peerDependencies": { +- "react": ">=0.14.0" ++ "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/react-fast-compare": { +@@ -5177,40 +5722,29 @@ + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, +- "node_modules/read-pkg": { +- "version": "6.0.0", +- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", +- "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", +- "dev": true, ++ "node_modules/readable-stream": { ++ "version": "2.3.8", ++ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", ++ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { +- "@types/normalize-package-data": "^2.4.0", +- "normalize-package-data": "^3.0.2", +- "parse-json": "^5.2.0", +- "type-fest": "^1.0.1" +- }, +- "engines": { +- "node": ">=12" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "core-util-is": "~1.0.0", ++ "inherits": "~2.0.3", ++ "isarray": "~1.0.0", ++ "process-nextick-args": "~2.0.0", ++ "safe-buffer": "~5.1.1", ++ "string_decoder": "~1.1.1", ++ "util-deprecate": "~1.0.1" + } + }, +- "node_modules/read-pkg-up": { +- "version": "8.0.0", +- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", +- "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", +- "dev": true, +- "dependencies": { +- "find-up": "^5.0.0", +- "read-pkg": "^6.0.0", +- "type-fest": "^1.0.1" +- }, +- "engines": { +- "node": ">=12" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" +- } ++ "node_modules/readable-stream/node_modules/isarray": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", ++ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" ++ }, ++ "node_modules/readable-stream/node_modules/safe-buffer": { ++ "version": "5.1.2", ++ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", ++ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdirp": { + "version": "3.6.0", +@@ -5224,31 +5758,40 @@ + "node": ">=8.10.0" + } + }, +- "node_modules/redent": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", +- "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", ++ "node_modules/reflect.getprototypeof": { ++ "version": "1.0.10", ++ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", ++ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "dependencies": { +- "indent-string": "^5.0.0", +- "strip-indent": "^4.0.0" ++ "call-bind": "^1.0.8", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.9", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", ++ "get-intrinsic": "^1.2.7", ++ "get-proto": "^1.0.1", ++ "which-builtin-type": "^1.2.1" + }, + "engines": { +- "node": ">=12" ++ "node": ">= 0.4" + }, + "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { +- "version": "1.5.0", +- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", +- "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", ++ "version": "1.5.4", ++ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", ++ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.2.0", +- "functions-have-names": "^1.2.3" ++ "call-bind": "^1.0.8", ++ "define-properties": "^1.2.1", ++ "es-errors": "^1.3.0", ++ "get-proto": "^1.0.1", ++ "gopd": "^1.2.0", ++ "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" +@@ -5269,6 +5812,29 @@ + "url": "https://github.com/sponsors/mysticatea" + } + }, ++ "node_modules/remarkable": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", ++ "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", ++ "dependencies": { ++ "argparse": "^1.0.10", ++ "autolinker": "^3.11.0" ++ }, ++ "bin": { ++ "remarkable": "bin/remarkable.js" ++ }, ++ "engines": { ++ "node": ">= 6.0.0" ++ } ++ }, ++ "node_modules/remarkable/node_modules/argparse": { ++ "version": "1.0.10", ++ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", ++ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", ++ "dependencies": { ++ "sprintf-js": "~1.0.2" ++ } ++ }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", +@@ -5279,18 +5845,21 @@ + } + }, + "node_modules/resolve": { +- "version": "1.22.2", +- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", +- "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", ++ "version": "1.22.10", ++ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", ++ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "dependencies": { +- "is-core-module": "^2.11.0", ++ "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, ++ "engines": { ++ "node": ">= 0.4" ++ }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } +@@ -5304,6 +5873,16 @@ + "node": ">=4" + } + }, ++ "node_modules/resolve-pkg-maps": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", ++ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", ++ "dev": true, ++ "peer": true, ++ "funding": { ++ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" ++ } ++ }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", +@@ -5318,6 +5897,7 @@ + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", ++ "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" +@@ -5329,6 +5909,49 @@ + "url": "https://github.com/sponsors/isaacs" + } + }, ++ "node_modules/rimraf/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "node_modules/rimraf/node_modules/glob": { ++ "version": "7.2.3", ++ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", ++ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", ++ "deprecated": "Glob versions prior to v9 are no longer supported", ++ "dev": true, ++ "dependencies": { ++ "fs.realpath": "^1.0.0", ++ "inflight": "^1.0.4", ++ "inherits": "2", ++ "minimatch": "^3.1.1", ++ "once": "^1.3.0", ++ "path-is-absolute": "^1.0.0" ++ }, ++ "engines": { ++ "node": "*" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" ++ } ++ }, ++ "node_modules/rimraf/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "dependencies": { ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", +@@ -5352,13 +5975,42 @@ + "queue-microtask": "^1.2.2" + } + }, +- "node_modules/safe-buffer": { +- "version": "5.2.1", +- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", +- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", +- "funding": [ +- { +- "type": "github", ++ "node_modules/rxjs": { ++ "version": "7.8.1", ++ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", ++ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", ++ "dev": true, ++ "peer": true, ++ "dependencies": { ++ "tslib": "^2.1.0" ++ } ++ }, ++ "node_modules/safe-array-concat": { ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", ++ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", ++ "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.2", ++ "get-intrinsic": "^1.2.6", ++ "has-symbols": "^1.1.0", ++ "isarray": "^2.0.5" ++ }, ++ "engines": { ++ "node": ">=0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/safe-buffer": { ++ "version": "5.2.1", ++ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", ++ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", ++ "funding": [ ++ { ++ "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { +@@ -5371,1104 +6023,7837 @@ + } + ] + }, +- "node_modules/safe-regex-test": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", +- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", ++ "node_modules/safe-identifier": { ++ "version": "0.4.2", ++ "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", ++ "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", ++ "dev": true ++ }, ++ "node_modules/safe-push-apply": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", ++ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", ++ "dev": true, ++ "dependencies": { ++ "es-errors": "^1.3.0", ++ "isarray": "^2.0.5" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/safe-regex-test": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", ++ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", ++ "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "is-regex": "^1.2.1" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/safer-buffer": { ++ "version": "2.1.2", ++ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", ++ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" ++ }, ++ "node_modules/sass": { ++ "version": "1.79.4", ++ "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", ++ "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", ++ "dev": true, ++ "dependencies": { ++ "chokidar": "^4.0.0", ++ "immutable": "^4.0.0", ++ "source-map-js": ">=0.6.2 <2.0.0" ++ }, ++ "bin": { ++ "sass": "sass.js" ++ }, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.83.4.tgz", ++ "integrity": "sha512-Hf2burRA/y5PGxsg6jB9UpoK/xZ6g/pgrkOcdl6j+rRg1Zj8XhGKZ1MTysZGtTPUUmiiErqzkP5+Kzp95yv9GQ==", ++ "dev": true, ++ "peer": true, ++ "dependencies": { ++ "@bufbuild/protobuf": "^2.0.0", ++ "buffer-builder": "^0.2.0", ++ "colorjs.io": "^0.5.0", ++ "immutable": "^5.0.2", ++ "rxjs": "^7.4.0", ++ "supports-color": "^8.1.1", ++ "sync-child-process": "^1.0.2", ++ "varint": "^6.0.0" ++ }, ++ "bin": { ++ "sass": "dist/bin/sass.js" ++ }, ++ "engines": { ++ "node": ">=16.0.0" ++ }, ++ "optionalDependencies": { ++ "sass-embedded-android-arm": "1.83.4", ++ "sass-embedded-android-arm64": "1.83.4", ++ "sass-embedded-android-ia32": "1.83.4", ++ "sass-embedded-android-riscv64": "1.83.4", ++ "sass-embedded-android-x64": "1.83.4", ++ "sass-embedded-darwin-arm64": "1.83.4", ++ "sass-embedded-darwin-x64": "1.83.4", ++ "sass-embedded-linux-arm": "1.83.4", ++ "sass-embedded-linux-arm64": "1.83.4", ++ "sass-embedded-linux-ia32": "1.83.4", ++ "sass-embedded-linux-musl-arm": "1.83.4", ++ "sass-embedded-linux-musl-arm64": "1.83.4", ++ "sass-embedded-linux-musl-ia32": "1.83.4", ++ "sass-embedded-linux-musl-riscv64": "1.83.4", ++ "sass-embedded-linux-musl-x64": "1.83.4", ++ "sass-embedded-linux-riscv64": "1.83.4", ++ "sass-embedded-linux-x64": "1.83.4", ++ "sass-embedded-win32-arm64": "1.83.4", ++ "sass-embedded-win32-ia32": "1.83.4", ++ "sass-embedded-win32-x64": "1.83.4" ++ } ++ }, ++ "node_modules/sass-embedded-android-arm": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.83.4.tgz", ++ "integrity": "sha512-9Z4pJAOgEkXa3VDY/o+U6l5XvV0mZTJcSl0l/mSPHihjAHSpLYnOW6+KOWeM8dxqrsqTYcd6COzhanI/a++5Gw==", ++ "cpu": [ ++ "arm" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "android" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-android-arm64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.83.4.tgz", ++ "integrity": "sha512-tgX4FzmbVqnQmD67ZxQDvI+qFNABrboOQgwsG05E5bA/US42zGajW9AxpECJYiMXVOHmg+d81ICbjb0fsVHskw==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "android" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-android-ia32": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.83.4.tgz", ++ "integrity": "sha512-RsFOziFqPcfZXdFRULC4Ayzy9aK6R6FwQ411broCjlOBX+b0gurjRadkue3cfUEUR5mmy0KeCbp7zVKPLTK+5Q==", ++ "cpu": [ ++ "ia32" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "android" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-android-riscv64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.83.4.tgz", ++ "integrity": "sha512-EHwh0nmQarBBrMRU928eTZkFGx19k/XW2YwbPR4gBVdWLkbTgCA5aGe8hTE6/1zStyx++3nDGvTZ78+b/VvvLg==", ++ "cpu": [ ++ "riscv64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "android" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-android-x64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.83.4.tgz", ++ "integrity": "sha512-0PgQNuPWYy1jEOEPDVsV89KfqOsMLIp9CSbjBY7jRcwRhyVAcigqrUG6bDeNtojHUYKA1kU+Eh/85WxOHUOgBw==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "android" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-darwin-arm64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.83.4.tgz", ++ "integrity": "sha512-rp2ywymWc3nymnSnAFG5R/8hvxWCsuhK3wOnD10IDlmNB7o4rzKby1c+2ZfpQGowlYGWsWWTgz8FW2qzmZsQRw==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-darwin-x64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.83.4.tgz", ++ "integrity": "sha512-kLkN2lXz9PCgGfDS8Ev5YVcl/V2173L6379en/CaFuJJi7WiyPgBymW7hOmfCt4uO4R1y7CP2Uc08DRtZsBlAA==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-linux-arm": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.83.4.tgz", ++ "integrity": "sha512-nL90ryxX2lNmFucr9jYUyHHx21AoAgdCL1O5Ltx2rKg2xTdytAGHYo2MT5S0LIeKLa/yKP/hjuSvrbICYNDvtA==", ++ "cpu": [ ++ "arm" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-linux-arm64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.83.4.tgz", ++ "integrity": "sha512-E0zjsZX2HgESwyqw31EHtI39DKa7RgK7nvIhIRco1d0QEw227WnoR9pjH3M/ZQy4gQj3GKilOFHM5Krs/omeIA==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-linux-ia32": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.83.4.tgz", ++ "integrity": "sha512-ew5HpchSzgAYbQoriRh8QhlWn5Kw2nQ2jHoV9YLwGKe3fwwOWA0KDedssvDv7FWnY/FCqXyymhLd6Bxae4Xquw==", ++ "cpu": [ ++ "ia32" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-linux-musl-arm": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.83.4.tgz", ++ "integrity": "sha512-0RrJRwMrmm+gG0VOB5b5Cjs7Sd+lhqpQJa6EJNEaZHljJokEfpE5GejZsGMRMIQLxEvVphZnnxl6sonCGFE/QQ==", ++ "cpu": [ ++ "arm" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-linux-musl-arm64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.83.4.tgz", ++ "integrity": "sha512-IzMgalf6MZOxgp4AVCgsaWAFDP/IVWOrgVXxkyhw29fyAEoSWBJH4k87wyPhEtxSuzVHLxKNbc8k3UzdWmlBFg==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-linux-musl-ia32": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.83.4.tgz", ++ "integrity": "sha512-LLb4lYbcxPzX4UaJymYXC+WwokxUlfTJEFUv5VF0OTuSsHAGNRs/rslPtzVBTvMeG9TtlOQDhku1F7G6iaDotA==", ++ "cpu": [ ++ "ia32" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-linux-musl-riscv64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.83.4.tgz", ++ "integrity": "sha512-zoKlPzD5Z13HKin1UGR74QkEy+kZEk2AkGX5RelRG494mi+IWwRuWCppXIovor9+BQb9eDWPYPoMVahwN5F7VA==", ++ "cpu": [ ++ "riscv64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-linux-musl-x64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.83.4.tgz", ++ "integrity": "sha512-hB8+/PYhfEf2zTIcidO5Bpof9trK6WJjZ4T8g2MrxQh8REVtdPcgIkoxczRynqybf9+fbqbUwzXtiUao2GV+vQ==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-linux-riscv64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.83.4.tgz", ++ "integrity": "sha512-83fL4n+oeDJ0Y4KjASmZ9jHS1Vl9ESVQYHMhJE0i4xDi/P3BNarm2rsKljq/QtrwGpbqwn8ujzOu7DsNCMDSHA==", ++ "cpu": [ ++ "riscv64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-linux-x64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.83.4.tgz", ++ "integrity": "sha512-NlnGdvCmTD5PK+LKXlK3sAuxOgbRIEoZfnHvxd157imCm/s2SYF/R28D0DAAjEViyI8DovIWghgbcqwuertXsA==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-win32-arm64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.83.4.tgz", ++ "integrity": "sha512-J2BFKrEaeSrVazU2qTjyQdAk+MvbzJeTuCET0uAJEXSKtvQ3AzxvzndS7LqkDPbF32eXAHLw8GVpwcBwKbB3Uw==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-win32-ia32": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.83.4.tgz", ++ "integrity": "sha512-uPAe9T/5sANFhJS5dcfAOhOJy8/l2TRYG4r+UO3Wp4yhqbN7bggPvY9c7zMYS0OC8tU/bCvfYUDFHYMCl91FgA==", ++ "cpu": [ ++ "ia32" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded-win32-x64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.83.4.tgz", ++ "integrity": "sha512-C9fkDY0jKITdJFij4UbfPFswxoXN9O/Dr79v17fJnstVwtUojzVJWKHUXvF0Zg2LIR7TCc4ju3adejKFxj7ueA==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "peer": true, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/sass-embedded/node_modules/immutable": { ++ "version": "5.0.3", ++ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", ++ "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", ++ "dev": true, ++ "peer": true ++ }, ++ "node_modules/sass-embedded/node_modules/supports-color": { ++ "version": "8.1.1", ++ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", ++ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", ++ "dev": true, ++ "peer": true, ++ "dependencies": { ++ "has-flag": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/supports-color?sponsor=1" ++ } ++ }, ++ "node_modules/sass/node_modules/chokidar": { ++ "version": "4.0.3", ++ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", ++ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", ++ "dev": true, ++ "dependencies": { ++ "readdirp": "^4.0.1" ++ }, ++ "engines": { ++ "node": ">= 14.16.0" ++ }, ++ "funding": { ++ "url": "https://paulmillr.com/funding/" ++ } ++ }, ++ "node_modules/sass/node_modules/readdirp": { ++ "version": "4.1.1", ++ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", ++ "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", ++ "dev": true, ++ "engines": { ++ "node": ">= 14.18.0" ++ }, ++ "funding": { ++ "type": "individual", ++ "url": "https://paulmillr.com/funding/" ++ } ++ }, ++ "node_modules/scheduler": { ++ "version": "0.23.2", ++ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", ++ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", ++ "dependencies": { ++ "loose-envify": "^1.1.0" ++ } ++ }, ++ "node_modules/semver": { ++ "version": "7.7.0", ++ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", ++ "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", ++ "dev": true, ++ "bin": { ++ "semver": "bin/semver.js" ++ }, ++ "engines": { ++ "node": ">=10" ++ } ++ }, ++ "node_modules/set-function-length": { ++ "version": "1.2.2", ++ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", ++ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", ++ "dev": true, ++ "dependencies": { ++ "define-data-property": "^1.1.4", ++ "es-errors": "^1.3.0", ++ "function-bind": "^1.1.2", ++ "get-intrinsic": "^1.2.4", ++ "gopd": "^1.0.1", ++ "has-property-descriptors": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/set-function-name": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", ++ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", ++ "dev": true, ++ "dependencies": { ++ "define-data-property": "^1.1.4", ++ "es-errors": "^1.3.0", ++ "functions-have-names": "^1.2.3", ++ "has-property-descriptors": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/set-proto": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", ++ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", ++ "dev": true, ++ "dependencies": { ++ "dunder-proto": "^1.0.1", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/shebang-command": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", ++ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", ++ "dev": true, ++ "dependencies": { ++ "shebang-regex": "^3.0.0" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/shebang-regex": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", ++ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", ++ "dev": true, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/side-channel": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", ++ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", ++ "dev": true, ++ "dependencies": { ++ "es-errors": "^1.3.0", ++ "object-inspect": "^1.13.3", ++ "side-channel-list": "^1.0.0", ++ "side-channel-map": "^1.0.1", ++ "side-channel-weakmap": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/side-channel-list": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", ++ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", ++ "dev": true, ++ "dependencies": { ++ "es-errors": "^1.3.0", ++ "object-inspect": "^1.13.3" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/side-channel-map": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", ++ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", ++ "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.5", ++ "object-inspect": "^1.13.3" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/side-channel-weakmap": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", ++ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", ++ "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.5", ++ "object-inspect": "^1.13.3", ++ "side-channel-map": "^1.0.1" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/signal-exit": { ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", ++ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", ++ "dev": true, ++ "engines": { ++ "node": ">=14" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" ++ } ++ }, ++ "node_modules/sizzle": { ++ "version": "2.3.10", ++ "resolved": "https://registry.npmjs.org/sizzle/-/sizzle-2.3.10.tgz", ++ "integrity": "sha512-kPGev+SiByuzi/YPDTqCwdKLWCaN9+14ve86yH0gP6Efue04xjLYWJrcLC6y1buFyIVXkwHNXPsOTEd1MYVPbQ==", ++ "dev": true ++ }, ++ "node_modules/slash": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", ++ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", ++ "dev": true, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/slice-ansi": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", ++ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", ++ "dev": true, ++ "dependencies": { ++ "ansi-styles": "^4.0.0", ++ "astral-regex": "^2.0.0", ++ "is-fullwidth-code-point": "^3.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/slice-ansi?sponsor=1" ++ } ++ }, ++ "node_modules/source-map-js": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", ++ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", ++ "dev": true, ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/sourcemap-codec": { ++ "version": "1.4.8", ++ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", ++ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", ++ "deprecated": "Please use @jridgewell/sourcemap-codec instead", ++ "dev": true ++ }, ++ "node_modules/sprintf-js": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", ++ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" ++ }, ++ "node_modules/stop-iteration-iterator": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", ++ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", ++ "dev": true, ++ "dependencies": { ++ "es-errors": "^1.3.0", ++ "internal-slot": "^1.1.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/string_decoder": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", ++ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", ++ "dependencies": { ++ "safe-buffer": "~5.1.0" ++ } ++ }, ++ "node_modules/string_decoder/node_modules/safe-buffer": { ++ "version": "5.1.2", ++ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", ++ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" ++ }, ++ "node_modules/string-width": { ++ "version": "5.1.2", ++ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", ++ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", ++ "dev": true, ++ "dependencies": { ++ "eastasianwidth": "^0.2.0", ++ "emoji-regex": "^9.2.2", ++ "strip-ansi": "^7.0.1" ++ }, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/string-width-cjs": { ++ "name": "string-width", ++ "version": "4.2.3", ++ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", ++ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", ++ "dev": true, ++ "dependencies": { ++ "emoji-regex": "^8.0.0", ++ "is-fullwidth-code-point": "^3.0.0", ++ "strip-ansi": "^6.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/string-width-cjs/node_modules/emoji-regex": { ++ "version": "8.0.0", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", ++ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", ++ "dev": true ++ }, ++ "node_modules/string-width/node_modules/ansi-regex": { ++ "version": "6.1.0", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", ++ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", ++ "dev": true, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/ansi-regex?sponsor=1" ++ } ++ }, ++ "node_modules/string-width/node_modules/strip-ansi": { ++ "version": "7.1.0", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", ++ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", ++ "dev": true, ++ "dependencies": { ++ "ansi-regex": "^6.0.1" ++ }, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/strip-ansi?sponsor=1" ++ } ++ }, ++ "node_modules/string.prototype.includes": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", ++ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", ++ "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.3" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/string.prototype.matchall": { ++ "version": "4.0.12", ++ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", ++ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", ++ "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.6", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", ++ "get-intrinsic": "^1.2.6", ++ "gopd": "^1.2.0", ++ "has-symbols": "^1.1.0", ++ "internal-slot": "^1.1.0", ++ "regexp.prototype.flags": "^1.5.3", ++ "set-function-name": "^2.0.2", ++ "side-channel": "^1.1.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/string.prototype.repeat": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", ++ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", ++ "dev": true, ++ "dependencies": { ++ "define-properties": "^1.1.3", ++ "es-abstract": "^1.17.5" ++ } ++ }, ++ "node_modules/string.prototype.trim": { ++ "version": "1.2.10", ++ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", ++ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", ++ "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.2", ++ "define-data-property": "^1.1.4", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.5", ++ "es-object-atoms": "^1.0.0", ++ "has-property-descriptors": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/string.prototype.trimend": { ++ "version": "1.0.9", ++ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", ++ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", ++ "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.2", ++ "define-properties": "^1.2.1", ++ "es-object-atoms": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/string.prototype.trimstart": { ++ "version": "1.0.8", ++ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", ++ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", ++ "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-object-atoms": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/strip-ansi": { ++ "version": "6.0.1", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", ++ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", ++ "dev": true, ++ "dependencies": { ++ "ansi-regex": "^5.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/strip-ansi-cjs": { ++ "name": "strip-ansi", ++ "version": "6.0.1", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", ++ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", ++ "dev": true, ++ "dependencies": { ++ "ansi-regex": "^5.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/strip-bom": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", ++ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", ++ "dev": true, ++ "engines": { ++ "node": ">=4" ++ } ++ }, ++ "node_modules/strip-json-comments": { ++ "version": "3.1.1", ++ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", ++ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", ++ "dev": true, ++ "engines": { ++ "node": ">=8" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/stylelint": { ++ "version": "16.9.0", ++ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", ++ "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", ++ "dev": true, ++ "funding": [ ++ { ++ "type": "opencollective", ++ "url": "https://opencollective.com/stylelint" ++ }, ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/stylelint" ++ } ++ ], ++ "dependencies": { ++ "@csstools/css-parser-algorithms": "^3.0.1", ++ "@csstools/css-tokenizer": "^3.0.1", ++ "@csstools/media-query-list-parser": "^3.0.1", ++ "@csstools/selector-specificity": "^4.0.0", ++ "@dual-bundle/import-meta-resolve": "^4.1.0", ++ "balanced-match": "^2.0.0", ++ "colord": "^2.9.3", ++ "cosmiconfig": "^9.0.0", ++ "css-functions-list": "^3.2.2", ++ "css-tree": "^2.3.1", ++ "debug": "^4.3.6", ++ "fast-glob": "^3.3.2", ++ "fastest-levenshtein": "^1.0.16", ++ "file-entry-cache": "^9.0.0", ++ "global-modules": "^2.0.0", ++ "globby": "^11.1.0", ++ "globjoin": "^0.1.4", ++ "html-tags": "^3.3.1", ++ "ignore": "^5.3.2", ++ "imurmurhash": "^0.1.4", ++ "is-plain-object": "^5.0.0", ++ "known-css-properties": "^0.34.0", ++ "mathml-tag-names": "^2.1.3", ++ "meow": "^13.2.0", ++ "micromatch": "^4.0.8", ++ "normalize-path": "^3.0.0", ++ "picocolors": "^1.0.1", ++ "postcss": "^8.4.41", ++ "postcss-resolve-nested-selector": "^0.1.6", ++ "postcss-safe-parser": "^7.0.0", ++ "postcss-selector-parser": "^6.1.2", ++ "postcss-value-parser": "^4.2.0", ++ "resolve-from": "^5.0.0", ++ "string-width": "^4.2.3", ++ "strip-ansi": "^7.1.0", ++ "supports-hyperlinks": "^3.1.0", ++ "svg-tags": "^1.0.0", ++ "table": "^6.8.2", ++ "write-file-atomic": "^5.0.1" ++ }, ++ "bin": { ++ "stylelint": "bin/stylelint.mjs" ++ }, ++ "engines": { ++ "node": ">=18.12.0" ++ } ++ }, ++ "node_modules/stylelint-config-recommended": { ++ "version": "14.0.1", ++ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", ++ "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", ++ "dev": true, ++ "funding": [ ++ { ++ "type": "opencollective", ++ "url": "https://opencollective.com/stylelint" ++ }, ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/stylelint" ++ } ++ ], ++ "engines": { ++ "node": ">=18.12.0" ++ }, ++ "peerDependencies": { ++ "stylelint": "^16.1.0" ++ } ++ }, ++ "node_modules/stylelint-config-recommended-scss": { ++ "version": "14.0.0", ++ "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.0.0.tgz", ++ "integrity": "sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==", ++ "dev": true, ++ "dependencies": { ++ "postcss-scss": "^4.0.9", ++ "stylelint-config-recommended": "^14.0.0", ++ "stylelint-scss": "^6.0.0" ++ }, ++ "engines": { ++ "node": ">=18.12.0" ++ }, ++ "peerDependencies": { ++ "postcss": "^8.3.3", ++ "stylelint": "^16.0.2" ++ }, ++ "peerDependenciesMeta": { ++ "postcss": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/stylelint-config-standard": { ++ "version": "36.0.1", ++ "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz", ++ "integrity": "sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==", ++ "dev": true, ++ "funding": [ ++ { ++ "type": "opencollective", ++ "url": "https://opencollective.com/stylelint" ++ }, ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/stylelint" ++ } ++ ], ++ "dependencies": { ++ "stylelint-config-recommended": "^14.0.1" ++ }, ++ "engines": { ++ "node": ">=18.12.0" ++ }, ++ "peerDependencies": { ++ "stylelint": "^16.1.0" ++ } ++ }, ++ "node_modules/stylelint-config-standard-scss": { ++ "version": "13.1.0", ++ "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-13.1.0.tgz", ++ "integrity": "sha512-Eo5w7/XvwGHWkeGLtdm2FZLOMYoZl1omP2/jgFCXyl2x5yNz7/8vv4Tj6slHvMSSUNTaGoam/GAZ0ZhukvalfA==", ++ "dev": true, ++ "dependencies": { ++ "stylelint-config-recommended-scss": "^14.0.0", ++ "stylelint-config-standard": "^36.0.0" ++ }, ++ "engines": { ++ "node": ">=18.12.0" ++ }, ++ "peerDependencies": { ++ "postcss": "^8.3.3", ++ "stylelint": "^16.3.1" ++ }, ++ "peerDependenciesMeta": { ++ "postcss": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/stylelint-formatter-pretty": { ++ "version": "4.0.1", ++ "resolved": "https://registry.npmjs.org/stylelint-formatter-pretty/-/stylelint-formatter-pretty-4.0.1.tgz", ++ "integrity": "sha512-39nasPN8QNdMBq2eghI/SwpyVKx8kJGtmE/KJ5oFvCg0ZvZ5qjJbQgEulzC0gT70XZ+iRk7p1W5tE9IBQhFjPw==", ++ "dev": true, ++ "funding": [ ++ { ++ "type": "kofi", ++ "url": "https://ko-fi.com/mrcgrtz" ++ }, ++ { ++ "type": "liberapay", ++ "url": "https://liberapay.com/mrcgrtz/" ++ } ++ ], ++ "dependencies": { ++ "ansi-escapes": "^7.0.0", ++ "log-symbols": "^7.0.0", ++ "picocolors": "^1.0.0", ++ "plur": "^5.1.0", ++ "string-width": "^7.0.0", ++ "supports-hyperlinks": "^3.0.0" ++ }, ++ "engines": { ++ "node": ">=18.12.0" ++ }, ++ "peerDependencies": { ++ "stylelint": ">=16.0.0" ++ } ++ }, ++ "node_modules/stylelint-formatter-pretty/node_modules/ansi-regex": { ++ "version": "6.1.0", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", ++ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", ++ "dev": true, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/ansi-regex?sponsor=1" ++ } ++ }, ++ "node_modules/stylelint-formatter-pretty/node_modules/emoji-regex": { ++ "version": "10.4.0", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", ++ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", ++ "dev": true ++ }, ++ "node_modules/stylelint-formatter-pretty/node_modules/string-width": { ++ "version": "7.2.0", ++ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", ++ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", ++ "dev": true, ++ "dependencies": { ++ "emoji-regex": "^10.3.0", ++ "get-east-asian-width": "^1.0.0", ++ "strip-ansi": "^7.1.0" ++ }, ++ "engines": { ++ "node": ">=18" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/stylelint-formatter-pretty/node_modules/strip-ansi": { ++ "version": "7.1.0", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", ++ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", ++ "dev": true, ++ "dependencies": { ++ "ansi-regex": "^6.0.1" ++ }, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/strip-ansi?sponsor=1" ++ } ++ }, ++ "node_modules/stylelint-scss": { ++ "version": "6.11.0", ++ "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.11.0.tgz", ++ "integrity": "sha512-AvJ6LVzz2iXHxPlPTR9WVy73FC/vmohH54VySNlCKX1NIXNAeuzy/VbIkMJLMyw/xKYqkgY4kAgB+qy5BfCaCg==", ++ "dev": true, ++ "dependencies": { ++ "css-tree": "^3.0.1", ++ "is-plain-object": "^5.0.0", ++ "known-css-properties": "^0.35.0", ++ "mdn-data": "^2.15.0", ++ "postcss-media-query-parser": "^0.2.3", ++ "postcss-resolve-nested-selector": "^0.1.6", ++ "postcss-selector-parser": "^7.0.0", ++ "postcss-value-parser": "^4.2.0" ++ }, ++ "engines": { ++ "node": ">=18.12.0" ++ }, ++ "peerDependencies": { ++ "stylelint": "^16.0.2" ++ } ++ }, ++ "node_modules/stylelint-scss/node_modules/css-tree": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", ++ "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", ++ "dev": true, ++ "dependencies": { ++ "mdn-data": "2.12.2", ++ "source-map-js": "^1.0.1" ++ }, ++ "engines": { ++ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" ++ } ++ }, ++ "node_modules/stylelint-scss/node_modules/css-tree/node_modules/mdn-data": { ++ "version": "2.12.2", ++ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", ++ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", ++ "dev": true ++ }, ++ "node_modules/stylelint-scss/node_modules/known-css-properties": { ++ "version": "0.35.0", ++ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", ++ "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", ++ "dev": true ++ }, ++ "node_modules/stylelint-scss/node_modules/mdn-data": { ++ "version": "2.15.0", ++ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.15.0.tgz", ++ "integrity": "sha512-KIrS0lFPOqA4DgeO16vI5fkAsy8p++WBlbXtB5P1EQs8ubBgguAInNd1DnrCeTRfGchY0kgThgDOOIPyOLH2dQ==", ++ "dev": true ++ }, ++ "node_modules/stylelint-scss/node_modules/postcss-selector-parser": { ++ "version": "7.0.0", ++ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", ++ "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", ++ "dev": true, ++ "dependencies": { ++ "cssesc": "^3.0.0", ++ "util-deprecate": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">=4" ++ } ++ }, ++ "node_modules/stylelint-use-logical-spec": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/stylelint-use-logical-spec/-/stylelint-use-logical-spec-5.0.1.tgz", ++ "integrity": "sha512-UfLB4LW6iG4r3cXxjxkiHQrFyhWFqt8FpNNngD+TyvgMWSokk5TYwTvBHS3atUvZhOogllTOe/PUrGE+4z84AA==", ++ "dev": true, ++ "engines": { ++ "node": ">=8.0.0" ++ }, ++ "peerDependencies": { ++ "stylelint": ">=11 < 17" ++ } ++ }, ++ "node_modules/stylelint/node_modules/balanced-match": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", ++ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", ++ "dev": true ++ }, ++ "node_modules/stylelint/node_modules/emoji-regex": { ++ "version": "8.0.0", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", ++ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", ++ "dev": true ++ }, ++ "node_modules/stylelint/node_modules/file-entry-cache": { ++ "version": "9.1.0", ++ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", ++ "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", ++ "dev": true, ++ "dependencies": { ++ "flat-cache": "^5.0.0" ++ }, ++ "engines": { ++ "node": ">=18" ++ } ++ }, ++ "node_modules/stylelint/node_modules/flat-cache": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", ++ "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", ++ "dev": true, ++ "dependencies": { ++ "flatted": "^3.3.1", ++ "keyv": "^4.5.4" ++ }, ++ "engines": { ++ "node": ">=18" ++ } ++ }, ++ "node_modules/stylelint/node_modules/resolve-from": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", ++ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", ++ "dev": true, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/stylelint/node_modules/string-width": { ++ "version": "4.2.3", ++ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", ++ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", ++ "dev": true, ++ "dependencies": { ++ "emoji-regex": "^8.0.0", ++ "is-fullwidth-code-point": "^3.0.0", ++ "strip-ansi": "^6.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/stylelint/node_modules/string-width/node_modules/strip-ansi": { ++ "version": "6.0.1", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", ++ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", ++ "dev": true, ++ "dependencies": { ++ "ansi-regex": "^5.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/stylelint/node_modules/strip-ansi": { ++ "version": "7.1.0", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", ++ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", ++ "dev": true, ++ "dependencies": { ++ "ansi-regex": "^6.0.1" ++ }, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/strip-ansi?sponsor=1" ++ } ++ }, ++ "node_modules/stylelint/node_modules/strip-ansi/node_modules/ansi-regex": { ++ "version": "6.1.0", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", ++ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", ++ "dev": true, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/ansi-regex?sponsor=1" ++ } ++ }, ++ "node_modules/supports-color": { ++ "version": "7.2.0", ++ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", ++ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", ++ "dev": true, ++ "dependencies": { ++ "has-flag": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/supports-hyperlinks": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", ++ "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", ++ "dev": true, ++ "dependencies": { ++ "has-flag": "^4.0.0", ++ "supports-color": "^7.0.0" ++ }, ++ "engines": { ++ "node": ">=14.18" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/supports-preserve-symlinks-flag": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", ++ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", ++ "dev": true, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/svg-tags": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", ++ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", ++ "dev": true ++ }, ++ "node_modules/sync-child-process": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", ++ "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", ++ "dev": true, ++ "peer": true, ++ "dependencies": { ++ "sync-message-port": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">=16.0.0" ++ } ++ }, ++ "node_modules/sync-message-port": { ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", ++ "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", ++ "dev": true, ++ "peer": true, ++ "engines": { ++ "node": ">=16.0.0" ++ } ++ }, ++ "node_modules/tabbable": { ++ "version": "6.2.0", ++ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", ++ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" ++ }, ++ "node_modules/table": { ++ "version": "6.9.0", ++ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", ++ "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", ++ "dev": true, ++ "dependencies": { ++ "ajv": "^8.0.1", ++ "lodash.truncate": "^4.4.2", ++ "slice-ansi": "^4.0.0", ++ "string-width": "^4.2.3", ++ "strip-ansi": "^6.0.1" ++ }, ++ "engines": { ++ "node": ">=10.0.0" ++ } ++ }, ++ "node_modules/table/node_modules/ajv": { ++ "version": "8.17.1", ++ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", ++ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", ++ "dev": true, ++ "dependencies": { ++ "fast-deep-equal": "^3.1.3", ++ "fast-uri": "^3.0.1", ++ "json-schema-traverse": "^1.0.0", ++ "require-from-string": "^2.0.2" ++ }, ++ "funding": { ++ "type": "github", ++ "url": "https://github.com/sponsors/epoberezkin" ++ } ++ }, ++ "node_modules/table/node_modules/emoji-regex": { ++ "version": "8.0.0", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", ++ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", ++ "dev": true ++ }, ++ "node_modules/table/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/table/node_modules/string-width": { ++ "version": "4.2.3", ++ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", ++ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", ++ "dev": true, ++ "dependencies": { ++ "emoji-regex": "^8.0.0", ++ "is-fullwidth-code-point": "^3.0.0", ++ "strip-ansi": "^6.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/text-table": { ++ "version": "0.2.0", ++ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", ++ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", ++ "dev": true ++ }, ++ "node_modules/throttle-debounce": { ++ "version": "5.0.2", ++ "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", ++ "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", ++ "engines": { ++ "node": ">=12.22" ++ } ++ }, ++ "node_modules/tiny-glob": { ++ "version": "0.2.9", ++ "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", ++ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", ++ "dev": true, ++ "dependencies": { ++ "globalyzer": "0.1.0", ++ "globrex": "^0.1.2" ++ } ++ }, ++ "node_modules/to-regex-range": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", ++ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", ++ "dev": true, ++ "dependencies": { ++ "is-number": "^7.0.0" ++ }, ++ "engines": { ++ "node": ">=8.0" ++ } ++ }, ++ "node_modules/ts-api-utils": { ++ "version": "1.4.3", ++ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", ++ "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", ++ "dev": true, ++ "engines": { ++ "node": ">=16" ++ }, ++ "peerDependencies": { ++ "typescript": ">=4.2.0" ++ } ++ }, ++ "node_modules/tsconfig-paths": { ++ "version": "3.15.0", ++ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", ++ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", ++ "dev": true, ++ "dependencies": { ++ "@types/json5": "^0.0.29", ++ "json5": "^1.0.2", ++ "minimist": "^1.2.6", ++ "strip-bom": "^3.0.0" ++ } ++ }, ++ "node_modules/tslib": { ++ "version": "2.8.1", ++ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", ++ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" ++ }, ++ "node_modules/type-check": { ++ "version": "0.4.0", ++ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", ++ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", ++ "dev": true, ++ "dependencies": { ++ "prelude-ls": "^1.2.1" ++ }, ++ "engines": { ++ "node": ">= 0.8.0" ++ } ++ }, ++ "node_modules/type-fest": { ++ "version": "0.20.2", ++ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", ++ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", ++ "dev": true, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/typed-array-buffer": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", ++ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", ++ "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.3", ++ "es-errors": "^1.3.0", ++ "is-typed-array": "^1.1.14" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/typed-array-byte-length": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", ++ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", ++ "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.8", ++ "for-each": "^0.3.3", ++ "gopd": "^1.2.0", ++ "has-proto": "^1.2.0", ++ "is-typed-array": "^1.1.14" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/typed-array-byte-offset": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", ++ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", ++ "dev": true, ++ "dependencies": { ++ "available-typed-arrays": "^1.0.7", ++ "call-bind": "^1.0.8", ++ "for-each": "^0.3.3", ++ "gopd": "^1.2.0", ++ "has-proto": "^1.2.0", ++ "is-typed-array": "^1.1.15", ++ "reflect.getprototypeof": "^1.0.9" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/typed-array-length": { ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", ++ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", ++ "dev": true, ++ "dependencies": { ++ "call-bind": "^1.0.7", ++ "for-each": "^0.3.3", ++ "gopd": "^1.0.1", ++ "is-typed-array": "^1.1.13", ++ "possible-typed-array-names": "^1.0.0", ++ "reflect.getprototypeof": "^1.0.6" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/typescript": { ++ "version": "5.7.3", ++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", ++ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", ++ "dev": true, ++ "bin": { ++ "tsc": "bin/tsc", ++ "tsserver": "bin/tsserver" ++ }, ++ "engines": { ++ "node": ">=14.17" ++ } ++ }, ++ "node_modules/unbox-primitive": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", ++ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", ++ "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.3", ++ "has-bigints": "^1.0.2", ++ "has-symbols": "^1.1.0", ++ "which-boxed-primitive": "^1.1.1" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/universalify": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", ++ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", ++ "dev": true, ++ "engines": { ++ "node": ">= 10.0.0" ++ } ++ }, ++ "node_modules/uri-js": { ++ "version": "4.4.1", ++ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", ++ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", ++ "dev": true, ++ "dependencies": { ++ "punycode": "^2.1.0" ++ } ++ }, ++ "node_modules/util-deprecate": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", ++ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" ++ }, ++ "node_modules/uuid": { ++ "version": "10.0.0", ++ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", ++ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", ++ "funding": [ ++ "https://github.com/sponsors/broofa", ++ "https://github.com/sponsors/ctavan" ++ ], ++ "bin": { ++ "uuid": "dist/bin/uuid" ++ } ++ }, ++ "node_modules/varint": { ++ "version": "6.0.0", ++ "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", ++ "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", ++ "dev": true, ++ "peer": true ++ }, ++ "node_modules/victory-area": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-37.3.6.tgz", ++ "integrity": "sha512-wVC8LKrZJLiSySNuJLRCB449qZTsPiRyzLlNoJwe21y+XA/a2HJbmJSeywmo8P153aX8viKe1H8ygDsTFXQhHw==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6", ++ "victory-vendor": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-axis": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-37.3.6.tgz", ++ "integrity": "sha512-Vi0dZvgmXmnCdoqc49WckeG5cMXnl7FTtqVhXu9JweA9cgCnkZabBd5mRvAjblb3Lo4j0HZCSPKHYWUPW70qZg==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-bar": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-37.3.6.tgz", ++ "integrity": "sha512-jdATFRWL1LUW/yEpKWx/aId2BiU2o1pPF9+Kh1TFISBduJoI4ZqvZD90H1QK4f/z50PikqiqiDECaKoKM1jfOQ==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6", ++ "victory-vendor": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-box-plot": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-37.3.6.tgz", ++ "integrity": "sha512-GOucnD63h14ScBuISC/nd1GBTEx6gIZfLE+0P0gyeH1poBKq0trTTvpQDvAMuGR8zICfEETG3ltmUMCwRrFyUg==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6", ++ "victory-vendor": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-brush-container": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-37.3.6.tgz", ++ "integrity": "sha512-LfZ2CgX1cYAqCtYxcSB68OfZS2v0T2VLXoEArd0lCXfRBY1Gya7GacCUcuo7GoK9XOXeslx7S/U95aVutt1VLg==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "react-fast-compare": "^3.2.0", ++ "victory-core": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-chart": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-37.3.6.tgz", ++ "integrity": "sha512-IkPo/W4AJ7bPu902TGER09OseR9ODm+FQAKfOBw4JsdEhZZ7BiG9zgd/25+x0r5EsTLu81CYGQVkBa+ZazcOlA==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "react-fast-compare": "^3.2.0", ++ "victory-axis": "37.3.6", ++ "victory-core": "37.3.6", ++ "victory-polar-axis": "37.3.6", ++ "victory-shared-events": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-core": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.3.6.tgz", ++ "integrity": "sha512-aFgO6KokxPbUCPznZP5UPhOdI22pMuwDXKDt6eoQOnkVim66Ia+K95TQar2nwVKGYV5j26aKVf/n9blwphGJRw==", ++ "dependencies": { ++ "lodash": "^4.17.21", ++ "react-fast-compare": "^3.2.0", ++ "victory-vendor": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-create-container": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-37.3.6.tgz", ++ "integrity": "sha512-Uf5bFQvqUsXCjqpvBW4LhrdrHkM6dBqxYgub6FCsBb86f84xZQ3vY7jFkg/JfvF0oGKMoWXYYrYLC1sk+fcWVA==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-brush-container": "37.3.6", ++ "victory-core": "37.3.6", ++ "victory-cursor-container": "37.3.6", ++ "victory-selection-container": "37.3.6", ++ "victory-voronoi-container": "37.3.6", ++ "victory-zoom-container": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-cursor-container": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-37.3.6.tgz", ++ "integrity": "sha512-+Oiw57d5nE+iq8As8RvepknzmNtKq1Gsc50u1X3IRd4jXtX8zqZrgXGlVZ+BP/tkLsWnGYVjKulwKBf2oaEUuw==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-group": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-37.3.6.tgz", ++ "integrity": "sha512-kgy/Azl5BxwlJAV0KDPGypv35TMrOD1J2ZxnJW2Wyyq+e8i0GGBIv5MoBzou64BRsDlS9V0CYRIjnkHgrBpB5w==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "react-fast-compare": "^3.2.0", ++ "victory-core": "37.3.6", ++ "victory-shared-events": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-legend": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-37.3.6.tgz", ++ "integrity": "sha512-vRRrhj3/ENqKVLdaBMzEmR83N6BOjox1bthYT1eJjN2H5SIK35bxn30IkiV/Pz3y627EqZe4TAWaxc0jiJlCiA==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-line": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-37.3.6.tgz", ++ "integrity": "sha512-Ke817uf/qFbN9jU7Dba7CrcHXYO5wAZuKKnyeHJmLDeQeFST0773xejnIuC+dBgZipjFr4KIbSd+VcUafFNE1g==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6", ++ "victory-vendor": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-pie": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-37.3.6.tgz", ++ "integrity": "sha512-tvdgAZ/HQWlo3KDDe0XAVbizHuaNMbgkkiF7zfA7Ww+3bHSs+0P9dsDtK2xP365D8gBCOv8pWmuzvKRhzNbqeA==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6", ++ "victory-vendor": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-polar-axis": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-37.3.6.tgz", ++ "integrity": "sha512-RpFsCkzHezJq5P+C/wtVdjEHX25JIFsSgs6qYSnfr/hayaFbWgK5HhRFpriQm5hg61cx47WxAOLyHvzf0nasvw==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-scatter": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-37.3.6.tgz", ++ "integrity": "sha512-fp95zMTPXgW1cmTowzDXhn+KxePMVDrzU0lotsHQMdBV7eB+ioXdu9hORlx4VHmMYg2ihsGwRTF+VAZ7rGxphA==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-selection-container": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-37.3.6.tgz", ++ "integrity": "sha512-gd3qODDlBtLEJM7+2jCXk2YcLBUmIpYEEHswytMhwc6zihxXipGBUHRulhLj/I05mKay2gaOAg5ewiJHd4Awgw==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-shared-events": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-37.3.6.tgz", ++ "integrity": "sha512-ygrbOtzLUTbtKebacZKyQRekhSAROnAvMkVI/PKsAGsz0ClY9P7qDEJG7eTUUygjO6ax0tI6WNE6JogQzeD1gw==", ++ "dependencies": { ++ "json-stringify-safe": "^5.0.1", ++ "lodash": "^4.17.19", ++ "react-fast-compare": "^3.2.0", ++ "victory-core": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-stack": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-37.3.6.tgz", ++ "integrity": "sha512-ldod04RdqGJGH5p5eWXCofdTkbhZqIp3iwW7NpxSbMDLs8zPQIVvDFVtuJgMwQiC5vnIpbhMmxVeFbr8m64ZKA==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "react-fast-compare": "^3.2.0", ++ "victory-core": "37.3.6", ++ "victory-shared-events": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-tooltip": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-37.3.6.tgz", ++ "integrity": "sha512-vqaJS9noauOqDDBBAV9Ln9duOY/i17h1DCfCPAqhwPFyvFbwKvAub9zPTeYWAm/14VvWX5O/0yekFCVbcC7hjg==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-vendor": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", ++ "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", ++ "dependencies": { ++ "@types/d3-array": "^3.0.3", ++ "@types/d3-ease": "^3.0.0", ++ "@types/d3-interpolate": "^3.0.1", ++ "@types/d3-scale": "^4.0.2", ++ "@types/d3-shape": "^3.1.0", ++ "@types/d3-time": "^3.0.0", ++ "@types/d3-timer": "^3.0.0", ++ "d3-array": "^3.1.6", ++ "d3-ease": "^3.0.1", ++ "d3-interpolate": "^3.0.1", ++ "d3-scale": "^4.0.2", ++ "d3-shape": "^3.1.0", ++ "d3-time": "^3.0.0", ++ "d3-timer": "^3.0.1" ++ } ++ }, ++ "node_modules/victory-voronoi-container": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-37.3.6.tgz", ++ "integrity": "sha512-qAAG0rMuK7A4EoJ4cyUk5wNdOW+HuCXNKPOko+hYK6wWOYXJvFhiglYyA85a695YyAXECc6JyJS/crm4IOEFag==", ++ "dependencies": { ++ "delaunay-find": "0.0.6", ++ "lodash": "^4.17.19", ++ "react-fast-compare": "^3.2.0", ++ "victory-core": "37.3.6", ++ "victory-tooltip": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/victory-zoom-container": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-37.3.6.tgz", ++ "integrity": "sha512-AGL+k20mI44OL5b0VgIxlmnNSefIoFmbbim5NraPmIxbtns9qQW/56ivIncJcYomBungIx99gUpsEpcQaMNHgQ==", ++ "dependencies": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "peerDependencies": { ++ "react": ">=16.6.0" ++ } ++ }, ++ "node_modules/which": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", ++ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", ++ "dev": true, ++ "dependencies": { ++ "isexe": "^2.0.0" ++ }, ++ "bin": { ++ "node-which": "bin/node-which" ++ }, ++ "engines": { ++ "node": ">= 8" ++ } ++ }, ++ "node_modules/which-boxed-primitive": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", ++ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", ++ "dev": true, ++ "dependencies": { ++ "is-bigint": "^1.1.0", ++ "is-boolean-object": "^1.2.1", ++ "is-number-object": "^1.1.1", ++ "is-string": "^1.1.1", ++ "is-symbol": "^1.1.1" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/which-builtin-type": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", ++ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", ++ "dev": true, ++ "dependencies": { ++ "call-bound": "^1.0.2", ++ "function.prototype.name": "^1.1.6", ++ "has-tostringtag": "^1.0.2", ++ "is-async-function": "^2.0.0", ++ "is-date-object": "^1.1.0", ++ "is-finalizationregistry": "^1.1.0", ++ "is-generator-function": "^1.0.10", ++ "is-regex": "^1.2.1", ++ "is-weakref": "^1.0.2", ++ "isarray": "^2.0.5", ++ "which-boxed-primitive": "^1.1.0", ++ "which-collection": "^1.0.2", ++ "which-typed-array": "^1.1.16" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/which-collection": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", ++ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", ++ "dev": true, ++ "dependencies": { ++ "is-map": "^2.0.3", ++ "is-set": "^2.0.3", ++ "is-weakmap": "^2.0.2", ++ "is-weakset": "^2.0.3" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/which-typed-array": { ++ "version": "1.1.18", ++ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", ++ "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", ++ "dev": true, ++ "dependencies": { ++ "available-typed-arrays": "^1.0.7", ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "for-each": "^0.3.3", ++ "gopd": "^1.2.0", ++ "has-tostringtag": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/word-wrap": { ++ "version": "1.2.5", ++ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", ++ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", ++ "dev": true, ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/wrap-ansi": { ++ "version": "8.1.0", ++ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", ++ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", ++ "dev": true, ++ "dependencies": { ++ "ansi-styles": "^6.1.0", ++ "string-width": "^5.0.1", ++ "strip-ansi": "^7.0.1" ++ }, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" ++ } ++ }, ++ "node_modules/wrap-ansi-cjs": { ++ "name": "wrap-ansi", ++ "version": "7.0.0", ++ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", ++ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", ++ "dev": true, ++ "dependencies": { ++ "ansi-styles": "^4.0.0", ++ "string-width": "^4.1.0", ++ "strip-ansi": "^6.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" ++ } ++ }, ++ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { ++ "version": "8.0.0", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", ++ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", ++ "dev": true ++ }, ++ "node_modules/wrap-ansi-cjs/node_modules/string-width": { ++ "version": "4.2.3", ++ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", ++ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", ++ "dev": true, ++ "dependencies": { ++ "emoji-regex": "^8.0.0", ++ "is-fullwidth-code-point": "^3.0.0", ++ "strip-ansi": "^6.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/wrap-ansi/node_modules/ansi-regex": { ++ "version": "6.1.0", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", ++ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", ++ "dev": true, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/ansi-regex?sponsor=1" ++ } ++ }, ++ "node_modules/wrap-ansi/node_modules/ansi-styles": { ++ "version": "6.2.1", ++ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", ++ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", ++ "dev": true, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/ansi-styles?sponsor=1" ++ } ++ }, ++ "node_modules/wrap-ansi/node_modules/strip-ansi": { ++ "version": "7.1.0", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", ++ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", ++ "dev": true, ++ "dependencies": { ++ "ansi-regex": "^6.0.1" ++ }, ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/strip-ansi?sponsor=1" ++ } ++ }, ++ "node_modules/wrappy": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", ++ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", ++ "dev": true ++ }, ++ "node_modules/write-file-atomic": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", ++ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", ++ "dev": true, ++ "dependencies": { ++ "imurmurhash": "^0.1.4", ++ "signal-exit": "^4.0.1" ++ }, ++ "engines": { ++ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" ++ } ++ }, ++ "node_modules/ws": { ++ "version": "7.5.10", ++ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", ++ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", ++ "dev": true, ++ "engines": { ++ "node": ">=8.3.0" ++ }, ++ "peerDependencies": { ++ "bufferutil": "^4.0.1", ++ "utf-8-validate": "^5.0.2" ++ }, ++ "peerDependenciesMeta": { ++ "bufferutil": { ++ "optional": true ++ }, ++ "utf-8-validate": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/yocto-queue": { ++ "version": "0.1.0", ++ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", ++ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", ++ "dev": true, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/yoctocolors": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", ++ "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", ++ "dev": true, ++ "engines": { ++ "node": ">=18" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ } ++ }, ++ "dependencies": { ++ "@babel/code-frame": { ++ "version": "7.26.2", ++ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", ++ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", ++ "dev": true, ++ "requires": { ++ "@babel/helper-validator-identifier": "^7.25.9", ++ "js-tokens": "^4.0.0", ++ "picocolors": "^1.0.0" ++ } ++ }, ++ "@babel/helper-validator-identifier": { ++ "version": "7.25.9", ++ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", ++ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", ++ "dev": true ++ }, ++ "@bufbuild/protobuf": { ++ "version": "2.2.3", ++ "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.3.tgz", ++ "integrity": "sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==", ++ "dev": true, ++ "peer": true ++ }, ++ "@csstools/css-parser-algorithms": { ++ "version": "3.0.4", ++ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", ++ "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", ++ "dev": true, ++ "requires": {} ++ }, ++ "@csstools/css-tokenizer": { ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", ++ "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", ++ "dev": true ++ }, ++ "@csstools/media-query-list-parser": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", ++ "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", ++ "dev": true, ++ "requires": {} ++ }, ++ "@csstools/selector-specificity": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", ++ "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", ++ "dev": true, ++ "requires": {} ++ }, ++ "@dual-bundle/import-meta-resolve": { ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", ++ "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", ++ "dev": true ++ }, ++ "@esbuild/aix-ppc64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", ++ "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/android-arm": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", ++ "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/android-arm64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", ++ "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/android-x64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", ++ "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/darwin-arm64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", ++ "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/darwin-x64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", ++ "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/freebsd-arm64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", ++ "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/freebsd-x64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", ++ "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/linux-arm": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", ++ "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/linux-arm64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", ++ "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/linux-ia32": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", ++ "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/linux-loong64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", ++ "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/linux-mips64el": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", ++ "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/linux-ppc64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", ++ "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/linux-riscv64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", ++ "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/linux-s390x": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", ++ "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/linux-x64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", ++ "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/netbsd-x64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", ++ "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/openbsd-arm64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", ++ "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/openbsd-x64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", ++ "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/sunos-x64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", ++ "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/win32-arm64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", ++ "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/win32-ia32": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", ++ "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", ++ "dev": true, ++ "optional": true ++ }, ++ "@esbuild/win32-x64": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", ++ "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", ++ "dev": true, ++ "optional": true ++ }, ++ "@eslint-community/eslint-utils": { ++ "version": "4.4.1", ++ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", ++ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", ++ "dev": true, ++ "requires": { ++ "eslint-visitor-keys": "^3.4.3" ++ } ++ }, ++ "@eslint-community/regexpp": { ++ "version": "4.12.1", ++ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", ++ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", ++ "dev": true ++ }, ++ "@eslint/eslintrc": { ++ "version": "2.1.4", ++ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", ++ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", ++ "dev": true, ++ "requires": { ++ "ajv": "^6.12.4", ++ "debug": "^4.3.2", ++ "espree": "^9.6.0", ++ "globals": "^13.19.0", ++ "ignore": "^5.2.0", ++ "import-fresh": "^3.2.1", ++ "js-yaml": "^4.1.0", ++ "minimatch": "^3.1.2", ++ "strip-json-comments": "^3.1.1" ++ }, ++ "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ } ++ } ++ }, ++ "@eslint/js": { ++ "version": "8.57.1", ++ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", ++ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", ++ "dev": true ++ }, ++ "@fortawesome/fontawesome-common-types": { ++ "version": "0.2.36", ++ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", ++ "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" ++ }, ++ "@fortawesome/fontawesome-svg-core": { ++ "version": "1.2.36", ++ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", ++ "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", ++ "requires": { ++ "@fortawesome/fontawesome-common-types": "^0.2.36" ++ } ++ }, ++ "@fortawesome/free-solid-svg-icons": { ++ "version": "5.15.4", ++ "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", ++ "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", ++ "requires": { ++ "@fortawesome/fontawesome-common-types": "^0.2.36" ++ } ++ }, ++ "@fortawesome/react-fontawesome": { ++ "version": "0.1.19", ++ "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", ++ "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", ++ "requires": { ++ "prop-types": "^15.8.1" ++ } ++ }, ++ "@humanwhocodes/config-array": { ++ "version": "0.13.0", ++ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", ++ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", ++ "dev": true, ++ "requires": { ++ "@humanwhocodes/object-schema": "^2.0.3", ++ "debug": "^4.3.1", ++ "minimatch": "^3.0.5" ++ }, ++ "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ } ++ } ++ }, ++ "@humanwhocodes/module-importer": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", ++ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", ++ "dev": true ++ }, ++ "@humanwhocodes/object-schema": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", ++ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", ++ "dev": true ++ }, ++ "@isaacs/cliui": { ++ "version": "8.0.2", ++ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", ++ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", ++ "dev": true, ++ "requires": { ++ "string-width": "^5.1.2", ++ "string-width-cjs": "npm:string-width@^4.2.0", ++ "strip-ansi": "^7.0.1", ++ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", ++ "wrap-ansi": "^8.1.0", ++ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" ++ }, ++ "dependencies": { ++ "ansi-regex": { ++ "version": "6.1.0", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", ++ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", ++ "dev": true ++ }, ++ "strip-ansi": { ++ "version": "7.1.0", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", ++ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", ++ "dev": true, ++ "requires": { ++ "ansi-regex": "^6.0.1" ++ } ++ } ++ } ++ }, ++ "@nodelib/fs.scandir": { ++ "version": "2.1.5", ++ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", ++ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", ++ "dev": true, ++ "requires": { ++ "@nodelib/fs.stat": "2.0.5", ++ "run-parallel": "^1.1.9" ++ } ++ }, ++ "@nodelib/fs.stat": { ++ "version": "2.0.5", ++ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", ++ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", ++ "dev": true ++ }, ++ "@nodelib/fs.walk": { ++ "version": "1.2.8", ++ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", ++ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", ++ "dev": true, ++ "requires": { ++ "@nodelib/fs.scandir": "2.1.5", ++ "fastq": "^1.6.0" ++ } ++ }, ++ "@patternfly/patternfly": { ++ "version": "5.4.1", ++ "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.4.1.tgz", ++ "integrity": "sha512-0+KxsQJrFzOMANALW82BHAO7bSm9tEbG1RrOlGT23ME1CaBoetGSMRLymutvojn/b/EKfJIr5rLzQa+14Lvg2g==" ++ }, ++ "@patternfly/react-charts": { ++ "version": "7.4.3", ++ "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-7.4.3.tgz", ++ "integrity": "sha512-HW55rc7UtuiUSk5kUEdCsbfU+/lVPXDruebQKxzImseiyjeLL3e3Tb8L778ga6Kt0YKaUTaqETuprR9ucRA0+w==", ++ "requires": { ++ "@patternfly/react-styles": "^5.4.0", ++ "@patternfly/react-tokens": "^5.4.0", ++ "hoist-non-react-statics": "^3.3.2", ++ "lodash": "^4.17.21", ++ "tslib": "^2.6.3", ++ "victory-area": "^37.1.1", ++ "victory-axis": "^37.1.1", ++ "victory-bar": "^37.1.1", ++ "victory-box-plot": "^37.1.1", ++ "victory-chart": "^37.1.1", ++ "victory-core": "^37.1.1", ++ "victory-create-container": "^37.1.1", ++ "victory-cursor-container": "^37.1.1", ++ "victory-group": "^37.1.1", ++ "victory-legend": "^37.1.1", ++ "victory-line": "^37.1.1", ++ "victory-pie": "^37.1.1", ++ "victory-scatter": "^37.1.1", ++ "victory-stack": "^37.1.1", ++ "victory-tooltip": "^37.1.1", ++ "victory-voronoi-container": "^37.1.1", ++ "victory-zoom-container": "^37.1.1" ++ } ++ }, ++ "@patternfly/react-core": { ++ "version": "5.4.1", ++ "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.4.1.tgz", ++ "integrity": "sha512-PJjwN4OCR7jTdWKi0RzuFdtlSQ8gBR+0REczuDHHPW8ky0bs1cIcqGsn5p/b6OgPlztl3UaXqRYLsroiEMasOw==", ++ "requires": { ++ "@patternfly/react-icons": "^5.4.0", ++ "@patternfly/react-styles": "^5.4.0", ++ "@patternfly/react-tokens": "^5.4.0", ++ "focus-trap": "7.5.4", ++ "react-dropzone": "^14.2.3", ++ "tslib": "^2.6.3" ++ } ++ }, ++ "@patternfly/react-icons": { ++ "version": "5.4.0", ++ "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.4.0.tgz", ++ "integrity": "sha512-2M3qN/naultvRHeG2laJMmoIroFCGAyfwTVrnCjSkG6/KnRoXV0+dqd+Xrh7xzpzvIJB1klvifC0oX42cEkDrA==", ++ "requires": {} ++ }, ++ "@patternfly/react-styles": { ++ "version": "5.4.0", ++ "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.4.0.tgz", ++ "integrity": "sha512-4ZE0s6LkX/0KsN0FOeogrDoj18m+BPA73YKnabZGB4SDRzrBNeBh2a6bSt546ZseEjkoJ+S81kOG0G8YckPQYg==" ++ }, ++ "@patternfly/react-table": { ++ "version": "5.4.1", ++ "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.4.1.tgz", ++ "integrity": "sha512-T05djy6YPqjbGWjpnwUs9oqup8oqqIOBnDOcThnHukgzlwnZvLNywgdoMR5XAKxTcIx/iBE1cu8ieETlITOGLw==", ++ "requires": { ++ "@patternfly/react-core": "^5.4.1", ++ "@patternfly/react-icons": "^5.4.0", ++ "@patternfly/react-styles": "^5.4.0", ++ "@patternfly/react-tokens": "^5.4.0", ++ "lodash": "^4.17.21", ++ "tslib": "^2.6.3" ++ } ++ }, ++ "@patternfly/react-tokens": { ++ "version": "5.4.0", ++ "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.4.0.tgz", ++ "integrity": "sha512-KONkwCVOMyklhuuaYeYgcAsGtCBQXnsBGZeolhOdSzr2Mj0RVSW0oMrQPgZuPVzhhC/kbqgClHJJl6xuG9xheA==" ++ }, ++ "@rtsao/scc": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", ++ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", ++ "dev": true ++ }, ++ "@types/d3-array": { ++ "version": "3.2.1", ++ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", ++ "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" ++ }, ++ "@types/d3-color": { ++ "version": "3.1.3", ++ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", ++ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" ++ }, ++ "@types/d3-ease": { ++ "version": "3.0.2", ++ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", ++ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" ++ }, ++ "@types/d3-interpolate": { ++ "version": "3.0.4", ++ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", ++ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", ++ "requires": { ++ "@types/d3-color": "*" ++ } ++ }, ++ "@types/d3-path": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", ++ "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" ++ }, ++ "@types/d3-scale": { ++ "version": "4.0.8", ++ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", ++ "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", ++ "requires": { ++ "@types/d3-time": "*" ++ } ++ }, ++ "@types/d3-shape": { ++ "version": "3.1.7", ++ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", ++ "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", ++ "requires": { ++ "@types/d3-path": "*" ++ } ++ }, ++ "@types/d3-time": { ++ "version": "3.0.4", ++ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", ++ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==" ++ }, ++ "@types/d3-timer": { ++ "version": "3.0.2", ++ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", ++ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" ++ }, ++ "@types/json5": { ++ "version": "0.0.29", ++ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", ++ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", ++ "dev": true ++ }, ++ "@types/prop-types": { ++ "version": "15.7.14", ++ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", ++ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", ++ "dev": true ++ }, ++ "@types/qunit": { ++ "version": "2.19.12", ++ "resolved": "https://registry.npmjs.org/@types/qunit/-/qunit-2.19.12.tgz", ++ "integrity": "sha512-II+C1wgzUia0g+tGAH+PBb4XiTm8/C/i6sN23r21NNskBYOYrv+qnW0tFQ/IxZzKVwrK4CTglf8YO3poJUclQA==", ++ "dev": true ++ }, ++ "@types/react": { ++ "version": "18.3.11", ++ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", ++ "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", ++ "dev": true, ++ "requires": { ++ "@types/prop-types": "*", ++ "csstype": "^3.0.2" ++ } ++ }, ++ "@types/react-dom": { ++ "version": "18.3.0", ++ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", ++ "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", ++ "dev": true, ++ "requires": { ++ "@types/react": "*" ++ } ++ }, ++ "@typescript-eslint/eslint-plugin": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz", ++ "integrity": "sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==", ++ "dev": true, ++ "requires": { ++ "@eslint-community/regexpp": "^4.10.0", ++ "@typescript-eslint/scope-manager": "8.8.0", ++ "@typescript-eslint/type-utils": "8.8.0", ++ "@typescript-eslint/utils": "8.8.0", ++ "@typescript-eslint/visitor-keys": "8.8.0", ++ "graphemer": "^1.4.0", ++ "ignore": "^5.3.1", ++ "natural-compare": "^1.4.0", ++ "ts-api-utils": "^1.3.0" ++ } ++ }, ++ "@typescript-eslint/parser": { ++ "version": "8.22.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.22.0.tgz", ++ "integrity": "sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "@typescript-eslint/scope-manager": "8.22.0", ++ "@typescript-eslint/types": "8.22.0", ++ "@typescript-eslint/typescript-estree": "8.22.0", ++ "@typescript-eslint/visitor-keys": "8.22.0", ++ "debug": "^4.3.4" ++ }, ++ "dependencies": { ++ "@typescript-eslint/scope-manager": { ++ "version": "8.22.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz", ++ "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "@typescript-eslint/types": "8.22.0", ++ "@typescript-eslint/visitor-keys": "8.22.0" ++ } ++ }, ++ "@typescript-eslint/visitor-keys": { ++ "version": "8.22.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz", ++ "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "@typescript-eslint/types": "8.22.0", ++ "eslint-visitor-keys": "^4.2.0" ++ } ++ }, ++ "eslint-visitor-keys": { ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", ++ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", ++ "dev": true, ++ "peer": true ++ } ++ } ++ }, ++ "@typescript-eslint/scope-manager": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz", ++ "integrity": "sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==", ++ "dev": true, ++ "requires": { ++ "@typescript-eslint/types": "8.8.0", ++ "@typescript-eslint/visitor-keys": "8.8.0" ++ }, ++ "dependencies": { ++ "@typescript-eslint/types": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", ++ "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", ++ "dev": true ++ } ++ } ++ }, ++ "@typescript-eslint/type-utils": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz", ++ "integrity": "sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==", ++ "dev": true, ++ "requires": { ++ "@typescript-eslint/typescript-estree": "8.8.0", ++ "@typescript-eslint/utils": "8.8.0", ++ "debug": "^4.3.4", ++ "ts-api-utils": "^1.3.0" ++ }, ++ "dependencies": { ++ "@typescript-eslint/types": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", ++ "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", ++ "dev": true ++ }, ++ "@typescript-eslint/typescript-estree": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", ++ "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", ++ "dev": true, ++ "requires": { ++ "@typescript-eslint/types": "8.8.0", ++ "@typescript-eslint/visitor-keys": "8.8.0", ++ "debug": "^4.3.4", ++ "fast-glob": "^3.3.2", ++ "is-glob": "^4.0.3", ++ "minimatch": "^9.0.4", ++ "semver": "^7.6.0", ++ "ts-api-utils": "^1.3.0" ++ } ++ } ++ } ++ }, ++ "@typescript-eslint/types": { ++ "version": "8.22.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz", ++ "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==", ++ "dev": true, ++ "peer": true ++ }, ++ "@typescript-eslint/typescript-estree": { ++ "version": "8.22.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz", ++ "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "@typescript-eslint/types": "8.22.0", ++ "@typescript-eslint/visitor-keys": "8.22.0", ++ "debug": "^4.3.4", ++ "fast-glob": "^3.3.2", ++ "is-glob": "^4.0.3", ++ "minimatch": "^9.0.4", ++ "semver": "^7.6.0", ++ "ts-api-utils": "^2.0.0" ++ }, ++ "dependencies": { ++ "@typescript-eslint/visitor-keys": { ++ "version": "8.22.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz", ++ "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "@typescript-eslint/types": "8.22.0", ++ "eslint-visitor-keys": "^4.2.0" ++ } ++ }, ++ "eslint-visitor-keys": { ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", ++ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", ++ "dev": true, ++ "peer": true ++ }, ++ "ts-api-utils": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", ++ "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", ++ "dev": true, ++ "peer": true, ++ "requires": {} ++ } ++ } ++ }, ++ "@typescript-eslint/utils": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.0.tgz", ++ "integrity": "sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==", ++ "dev": true, ++ "requires": { ++ "@eslint-community/eslint-utils": "^4.4.0", ++ "@typescript-eslint/scope-manager": "8.8.0", ++ "@typescript-eslint/types": "8.8.0", ++ "@typescript-eslint/typescript-estree": "8.8.0" ++ }, ++ "dependencies": { ++ "@typescript-eslint/types": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", ++ "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", ++ "dev": true ++ }, ++ "@typescript-eslint/typescript-estree": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", ++ "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", ++ "dev": true, ++ "requires": { ++ "@typescript-eslint/types": "8.8.0", ++ "@typescript-eslint/visitor-keys": "8.8.0", ++ "debug": "^4.3.4", ++ "fast-glob": "^3.3.2", ++ "is-glob": "^4.0.3", ++ "minimatch": "^9.0.4", ++ "semver": "^7.6.0", ++ "ts-api-utils": "^1.3.0" ++ } ++ } ++ } ++ }, ++ "@typescript-eslint/visitor-keys": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz", ++ "integrity": "sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==", ++ "dev": true, ++ "requires": { ++ "@typescript-eslint/types": "8.8.0", ++ "eslint-visitor-keys": "^3.4.3" ++ }, ++ "dependencies": { ++ "@typescript-eslint/types": { ++ "version": "8.8.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", ++ "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", ++ "dev": true ++ } ++ } ++ }, ++ "@ungap/structured-clone": { ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", ++ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", ++ "dev": true ++ }, ++ "@xterm/addon-canvas": { ++ "version": "0.7.0", ++ "resolved": "https://registry.npmjs.org/@xterm/addon-canvas/-/addon-canvas-0.7.0.tgz", ++ "integrity": "sha512-LF5LYcfvefJuJ7QotNRdRSPc9YASAVDeoT5uyXS/nZshZXjYplGXRECBGiznwvhNL2I8bq1Lf5MzRwstsYQ2Iw==", ++ "requires": {} ++ }, ++ "@xterm/xterm": { ++ "version": "5.5.0", ++ "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz", ++ "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==" ++ }, ++ "acorn": { ++ "version": "8.14.0", ++ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", ++ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", ++ "dev": true ++ }, ++ "acorn-jsx": { ++ "version": "5.3.2", ++ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", ++ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", ++ "dev": true, ++ "requires": {} ++ }, ++ "ajv": { ++ "version": "6.12.6", ++ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", ++ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", ++ "dev": true, ++ "requires": { ++ "fast-deep-equal": "^3.1.1", ++ "fast-json-stable-stringify": "^2.0.0", ++ "json-schema-traverse": "^0.4.1", ++ "uri-js": "^4.2.2" ++ } ++ }, ++ "ansi-escapes": { ++ "version": "7.0.0", ++ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", ++ "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", ++ "dev": true, ++ "requires": { ++ "environment": "^1.0.0" ++ } ++ }, ++ "ansi-regex": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", ++ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", ++ "dev": true ++ }, ++ "ansi-styles": { ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", ++ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", ++ "dev": true, ++ "requires": { ++ "color-convert": "^2.0.1" ++ } ++ }, ++ "anymatch": { ++ "version": "3.1.3", ++ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", ++ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", ++ "dev": true, ++ "requires": { ++ "normalize-path": "^3.0.0", ++ "picomatch": "^2.0.4" ++ } ++ }, ++ "argparse": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", ++ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", ++ "dev": true ++ }, ++ "aria-query": { ++ "version": "5.1.3", ++ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", ++ "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", ++ "dev": true, ++ "requires": { ++ "deep-equal": "^2.0.5" ++ } ++ }, ++ "array-buffer-byte-length": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", ++ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.3", ++ "is-array-buffer": "^3.0.5" ++ } ++ }, ++ "array-includes": { ++ "version": "3.1.8", ++ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", ++ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.2", ++ "es-object-atoms": "^1.0.0", ++ "get-intrinsic": "^1.2.4", ++ "is-string": "^1.0.7" ++ } ++ }, ++ "array-union": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", ++ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", ++ "dev": true ++ }, ++ "array.prototype.findlast": { ++ "version": "1.2.5", ++ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", ++ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.2", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", ++ "es-shim-unscopables": "^1.0.2" ++ } ++ }, ++ "array.prototype.findlastindex": { ++ "version": "1.2.5", ++ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", ++ "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.2", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", ++ "es-shim-unscopables": "^1.0.2" ++ } ++ }, ++ "array.prototype.flat": { ++ "version": "1.3.3", ++ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", ++ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.8", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.5", ++ "es-shim-unscopables": "^1.0.2" ++ } ++ }, ++ "array.prototype.flatmap": { ++ "version": "1.3.3", ++ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", ++ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.8", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.5", ++ "es-shim-unscopables": "^1.0.2" ++ } ++ }, ++ "array.prototype.tosorted": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", ++ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.3", ++ "es-errors": "^1.3.0", ++ "es-shim-unscopables": "^1.0.2" ++ } ++ }, ++ "arraybuffer.prototype.slice": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", ++ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", ++ "dev": true, ++ "requires": { ++ "array-buffer-byte-length": "^1.0.1", ++ "call-bind": "^1.0.8", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.5", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.6", ++ "is-array-buffer": "^3.0.4" ++ } ++ }, ++ "ast-types-flow": { ++ "version": "0.0.8", ++ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", ++ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", ++ "dev": true ++ }, ++ "astral-regex": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", ++ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", ++ "dev": true ++ }, ++ "async-function": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", ++ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", ++ "dev": true ++ }, ++ "attr-accept": { ++ "version": "2.2.5", ++ "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", ++ "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==" ++ }, ++ "autolinker": { ++ "version": "3.16.2", ++ "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.16.2.tgz", ++ "integrity": "sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==", ++ "requires": { ++ "tslib": "^2.3.0" ++ } ++ }, ++ "available-typed-arrays": { ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", ++ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", ++ "dev": true, ++ "requires": { ++ "possible-typed-array-names": "^1.0.0" ++ } ++ }, ++ "axe-core": { ++ "version": "4.10.2", ++ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", ++ "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", ++ "dev": true ++ }, ++ "axobject-query": { ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", ++ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", ++ "dev": true ++ }, ++ "balanced-match": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", ++ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", ++ "dev": true ++ }, ++ "binary-extensions": { ++ "version": "2.3.0", ++ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", ++ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", ++ "dev": true ++ }, ++ "brace-expansion": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", ++ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", ++ "dev": true, ++ "requires": { ++ "balanced-match": "^1.0.0" ++ } ++ }, ++ "braces": { ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", ++ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", ++ "dev": true, ++ "requires": { ++ "fill-range": "^7.1.1" ++ } ++ }, ++ "buffer-builder": { ++ "version": "0.2.0", ++ "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", ++ "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", ++ "dev": true, ++ "peer": true ++ }, ++ "builtin-modules": { ++ "version": "3.3.0", ++ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", ++ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", ++ "dev": true, ++ "peer": true ++ }, ++ "builtins": { ++ "version": "5.1.0", ++ "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", ++ "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "semver": "^7.0.0" ++ } ++ }, ++ "call-bind": { ++ "version": "1.0.8", ++ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", ++ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", ++ "dev": true, ++ "requires": { ++ "call-bind-apply-helpers": "^1.0.0", ++ "es-define-property": "^1.0.0", ++ "get-intrinsic": "^1.2.4", ++ "set-function-length": "^1.2.2" ++ } ++ }, ++ "call-bind-apply-helpers": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", ++ "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", ++ "dev": true, ++ "requires": { ++ "es-errors": "^1.3.0", ++ "function-bind": "^1.1.2" ++ } ++ }, ++ "call-bound": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", ++ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", ++ "dev": true, ++ "requires": { ++ "call-bind-apply-helpers": "^1.0.1", ++ "get-intrinsic": "^1.2.6" ++ } ++ }, ++ "callsites": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", ++ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", ++ "dev": true ++ }, ++ "chalk": { ++ "version": "4.1.2", ++ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", ++ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", ++ "dev": true, ++ "requires": { ++ "ansi-styles": "^4.1.0", ++ "supports-color": "^7.1.0" ++ } ++ }, ++ "chokidar": { ++ "version": "3.6.0", ++ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", ++ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", ++ "dev": true, ++ "requires": { ++ "anymatch": "~3.1.2", ++ "braces": "~3.0.2", ++ "fsevents": "~2.3.2", ++ "glob-parent": "~5.1.2", ++ "is-binary-path": "~2.1.0", ++ "is-glob": "~4.0.1", ++ "normalize-path": "~3.0.0", ++ "readdirp": "~3.6.0" ++ } ++ }, ++ "chrome-remote-interface": { ++ "version": "0.32.2", ++ "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.32.2.tgz", ++ "integrity": "sha512-3UbFKtEmqApehPQnqdblcggx7KveQphEMKQmdJZsOguE9ylw2N2/9Z7arO7xS55+DBJ/hyP8RrayLt4MMdJvQg==", ++ "dev": true, ++ "requires": { ++ "commander": "2.11.x", ++ "ws": "^7.2.0" ++ } ++ }, ++ "color-convert": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", ++ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", ++ "dev": true, ++ "requires": { ++ "color-name": "~1.1.4" ++ } ++ }, ++ "color-name": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", ++ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", ++ "dev": true ++ }, ++ "colord": { ++ "version": "2.9.3", ++ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", ++ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", ++ "dev": true ++ }, ++ "colorjs.io": { ++ "version": "0.5.2", ++ "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", ++ "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", ++ "dev": true, ++ "peer": true ++ }, ++ "commander": { ++ "version": "2.11.0", ++ "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", ++ "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", ++ "dev": true ++ }, ++ "concat-map": { ++ "version": "0.0.1", ++ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", ++ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", ++ "dev": true ++ }, ++ "core-util-is": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", ++ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" ++ }, ++ "cosmiconfig": { ++ "version": "9.0.0", ++ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", ++ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", ++ "dev": true, ++ "requires": { ++ "env-paths": "^2.2.1", ++ "import-fresh": "^3.3.0", ++ "js-yaml": "^4.1.0", ++ "parse-json": "^5.2.0" ++ } ++ }, ++ "cross-spawn": { ++ "version": "7.0.6", ++ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", ++ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", ++ "dev": true, ++ "requires": { ++ "path-key": "^3.1.0", ++ "shebang-command": "^2.0.0", ++ "which": "^2.0.1" ++ } ++ }, ++ "css-functions-list": { ++ "version": "3.2.3", ++ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", ++ "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", ++ "dev": true ++ }, ++ "css-tree": { ++ "version": "2.3.1", ++ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", ++ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", ++ "dev": true, ++ "requires": { ++ "mdn-data": "2.0.30", ++ "source-map-js": "^1.0.1" ++ } ++ }, ++ "cssesc": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", ++ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", ++ "dev": true ++ }, ++ "csstype": { ++ "version": "3.1.3", ++ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", ++ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", ++ "dev": true ++ }, ++ "d3-array": { ++ "version": "3.2.4", ++ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", ++ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", ++ "requires": { ++ "internmap": "1 - 2" ++ } ++ }, ++ "d3-color": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", ++ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" ++ }, ++ "d3-ease": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", ++ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" ++ }, ++ "d3-format": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", ++ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" ++ }, ++ "d3-interpolate": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", ++ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", ++ "requires": { ++ "d3-color": "1 - 3" ++ } ++ }, ++ "d3-path": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", ++ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==" ++ }, ++ "d3-scale": { ++ "version": "4.0.2", ++ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", ++ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", ++ "requires": { ++ "d3-array": "2.10.0 - 3", ++ "d3-format": "1 - 3", ++ "d3-interpolate": "1.2.0 - 3", ++ "d3-time": "2.1.1 - 3", ++ "d3-time-format": "2 - 4" ++ } ++ }, ++ "d3-shape": { ++ "version": "3.2.0", ++ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", ++ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", ++ "requires": { ++ "d3-path": "^3.1.0" ++ } ++ }, ++ "d3-time": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", ++ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", ++ "requires": { ++ "d3-array": "2 - 3" ++ } ++ }, ++ "d3-time-format": { ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", ++ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", ++ "requires": { ++ "d3-time": "1 - 3" ++ } ++ }, ++ "d3-timer": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", ++ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" ++ }, ++ "damerau-levenshtein": { ++ "version": "1.0.8", ++ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", ++ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", ++ "dev": true ++ }, ++ "data-view-buffer": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", ++ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.3", ++ "es-errors": "^1.3.0", ++ "is-data-view": "^1.0.2" ++ } ++ }, ++ "data-view-byte-length": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", ++ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.3", ++ "es-errors": "^1.3.0", ++ "is-data-view": "^1.0.2" ++ } ++ }, ++ "data-view-byte-offset": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", ++ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "is-data-view": "^1.0.1" ++ } ++ }, ++ "debug": { ++ "version": "4.4.0", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", ++ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", ++ "dev": true, ++ "requires": { ++ "ms": "^2.1.3" ++ } ++ }, ++ "deep-equal": { ++ "version": "2.2.3", ++ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", ++ "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", ++ "dev": true, ++ "requires": { ++ "array-buffer-byte-length": "^1.0.0", ++ "call-bind": "^1.0.5", ++ "es-get-iterator": "^1.1.3", ++ "get-intrinsic": "^1.2.2", ++ "is-arguments": "^1.1.1", ++ "is-array-buffer": "^3.0.2", ++ "is-date-object": "^1.0.5", ++ "is-regex": "^1.1.4", ++ "is-shared-array-buffer": "^1.0.2", ++ "isarray": "^2.0.5", ++ "object-is": "^1.1.5", ++ "object-keys": "^1.1.1", ++ "object.assign": "^4.1.4", ++ "regexp.prototype.flags": "^1.5.1", ++ "side-channel": "^1.0.4", ++ "which-boxed-primitive": "^1.0.2", ++ "which-collection": "^1.0.1", ++ "which-typed-array": "^1.1.13" ++ } ++ }, ++ "deep-is": { ++ "version": "0.1.4", ++ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", ++ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", ++ "dev": true ++ }, ++ "define-data-property": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", ++ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", ++ "dev": true, ++ "requires": { ++ "es-define-property": "^1.0.0", ++ "es-errors": "^1.3.0", ++ "gopd": "^1.0.1" ++ } ++ }, ++ "define-properties": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", ++ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", ++ "dev": true, ++ "requires": { ++ "define-data-property": "^1.0.1", ++ "has-property-descriptors": "^1.0.0", ++ "object-keys": "^1.1.1" ++ } ++ }, ++ "delaunator": { ++ "version": "4.0.1", ++ "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", ++ "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" ++ }, ++ "delaunay-find": { ++ "version": "0.0.6", ++ "resolved": "https://registry.npmjs.org/delaunay-find/-/delaunay-find-0.0.6.tgz", ++ "integrity": "sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==", ++ "requires": { ++ "delaunator": "^4.0.0" ++ } ++ }, ++ "dequal": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", ++ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" ++ }, ++ "dir-glob": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", ++ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", ++ "dev": true, ++ "requires": { ++ "path-type": "^4.0.0" ++ } ++ }, ++ "doctrine": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", ++ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", ++ "dev": true, ++ "requires": { ++ "esutils": "^2.0.2" ++ } ++ }, ++ "dunder-proto": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", ++ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", ++ "dev": true, ++ "requires": { ++ "call-bind-apply-helpers": "^1.0.1", ++ "es-errors": "^1.3.0", ++ "gopd": "^1.2.0" ++ } ++ }, ++ "eastasianwidth": { ++ "version": "0.2.0", ++ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", ++ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", ++ "dev": true ++ }, ++ "emoji-regex": { ++ "version": "9.2.2", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", ++ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", ++ "dev": true ++ }, ++ "encoding": { ++ "version": "0.1.13", ++ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", ++ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", ++ "requires": { ++ "iconv-lite": "^0.6.2" ++ } ++ }, ++ "env-paths": { ++ "version": "2.2.1", ++ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", ++ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", ++ "dev": true ++ }, ++ "environment": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", ++ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", ++ "dev": true ++ }, ++ "error-ex": { ++ "version": "1.3.2", ++ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", ++ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", ++ "dev": true, ++ "requires": { ++ "is-arrayish": "^0.2.1" ++ } ++ }, ++ "es-abstract": { ++ "version": "1.23.9", ++ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", ++ "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", ++ "dev": true, ++ "requires": { ++ "array-buffer-byte-length": "^1.0.2", ++ "arraybuffer.prototype.slice": "^1.0.4", ++ "available-typed-arrays": "^1.0.7", ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "data-view-buffer": "^1.0.2", ++ "data-view-byte-length": "^1.0.2", ++ "data-view-byte-offset": "^1.0.1", ++ "es-define-property": "^1.0.1", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", ++ "es-set-tostringtag": "^2.1.0", ++ "es-to-primitive": "^1.3.0", ++ "function.prototype.name": "^1.1.8", ++ "get-intrinsic": "^1.2.7", ++ "get-proto": "^1.0.0", ++ "get-symbol-description": "^1.1.0", ++ "globalthis": "^1.0.4", ++ "gopd": "^1.2.0", ++ "has-property-descriptors": "^1.0.2", ++ "has-proto": "^1.2.0", ++ "has-symbols": "^1.1.0", ++ "hasown": "^2.0.2", ++ "internal-slot": "^1.1.0", ++ "is-array-buffer": "^3.0.5", ++ "is-callable": "^1.2.7", ++ "is-data-view": "^1.0.2", ++ "is-regex": "^1.2.1", ++ "is-shared-array-buffer": "^1.0.4", ++ "is-string": "^1.1.1", ++ "is-typed-array": "^1.1.15", ++ "is-weakref": "^1.1.0", ++ "math-intrinsics": "^1.1.0", ++ "object-inspect": "^1.13.3", ++ "object-keys": "^1.1.1", ++ "object.assign": "^4.1.7", ++ "own-keys": "^1.0.1", ++ "regexp.prototype.flags": "^1.5.3", ++ "safe-array-concat": "^1.1.3", ++ "safe-push-apply": "^1.0.0", ++ "safe-regex-test": "^1.1.0", ++ "set-proto": "^1.0.0", ++ "string.prototype.trim": "^1.2.10", ++ "string.prototype.trimend": "^1.0.9", ++ "string.prototype.trimstart": "^1.0.8", ++ "typed-array-buffer": "^1.0.3", ++ "typed-array-byte-length": "^1.0.3", ++ "typed-array-byte-offset": "^1.0.4", ++ "typed-array-length": "^1.0.7", ++ "unbox-primitive": "^1.1.0", ++ "which-typed-array": "^1.1.18" ++ } ++ }, ++ "es-define-property": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", ++ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", ++ "dev": true ++ }, ++ "es-errors": { ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", ++ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", ++ "dev": true ++ }, ++ "es-get-iterator": { ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", ++ "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.2", ++ "get-intrinsic": "^1.1.3", ++ "has-symbols": "^1.0.3", ++ "is-arguments": "^1.1.1", ++ "is-map": "^2.0.2", ++ "is-set": "^2.0.2", ++ "is-string": "^1.0.7", ++ "isarray": "^2.0.5", ++ "stop-iteration-iterator": "^1.0.0" ++ } ++ }, ++ "es-iterator-helpers": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", ++ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.6", ++ "es-errors": "^1.3.0", ++ "es-set-tostringtag": "^2.0.3", ++ "function-bind": "^1.1.2", ++ "get-intrinsic": "^1.2.6", ++ "globalthis": "^1.0.4", ++ "gopd": "^1.2.0", ++ "has-property-descriptors": "^1.0.2", ++ "has-proto": "^1.2.0", ++ "has-symbols": "^1.1.0", ++ "internal-slot": "^1.1.0", ++ "iterator.prototype": "^1.1.4", ++ "safe-array-concat": "^1.1.3" ++ } ++ }, ++ "es-object-atoms": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", ++ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", ++ "dev": true, ++ "requires": { ++ "es-errors": "^1.3.0" ++ } ++ }, ++ "es-set-tostringtag": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", ++ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", ++ "dev": true, ++ "requires": { ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.6", ++ "has-tostringtag": "^1.0.2", ++ "hasown": "^2.0.2" ++ } ++ }, ++ "es-shim-unscopables": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", ++ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", ++ "dev": true, ++ "requires": { ++ "hasown": "^2.0.0" ++ } ++ }, ++ "es-to-primitive": { ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", ++ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", ++ "dev": true, ++ "requires": { ++ "is-callable": "^1.2.7", ++ "is-date-object": "^1.0.5", ++ "is-symbol": "^1.0.4" ++ } ++ }, ++ "esbuild": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", ++ "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", ++ "dev": true, ++ "requires": { ++ "@esbuild/aix-ppc64": "0.24.0", ++ "@esbuild/android-arm": "0.24.0", ++ "@esbuild/android-arm64": "0.24.0", ++ "@esbuild/android-x64": "0.24.0", ++ "@esbuild/darwin-arm64": "0.24.0", ++ "@esbuild/darwin-x64": "0.24.0", ++ "@esbuild/freebsd-arm64": "0.24.0", ++ "@esbuild/freebsd-x64": "0.24.0", ++ "@esbuild/linux-arm": "0.24.0", ++ "@esbuild/linux-arm64": "0.24.0", ++ "@esbuild/linux-ia32": "0.24.0", ++ "@esbuild/linux-loong64": "0.24.0", ++ "@esbuild/linux-mips64el": "0.24.0", ++ "@esbuild/linux-ppc64": "0.24.0", ++ "@esbuild/linux-riscv64": "0.24.0", ++ "@esbuild/linux-s390x": "0.24.0", ++ "@esbuild/linux-x64": "0.24.0", ++ "@esbuild/netbsd-x64": "0.24.0", ++ "@esbuild/openbsd-arm64": "0.24.0", ++ "@esbuild/openbsd-x64": "0.24.0", ++ "@esbuild/sunos-x64": "0.24.0", ++ "@esbuild/win32-arm64": "0.24.0", ++ "@esbuild/win32-ia32": "0.24.0", ++ "@esbuild/win32-x64": "0.24.0" ++ } ++ }, ++ "esbuild-plugin-copy": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/esbuild-plugin-copy/-/esbuild-plugin-copy-2.1.1.tgz", ++ "integrity": "sha512-Bk66jpevTcV8KMFzZI1P7MZKZ+uDcrZm2G2egZ2jNIvVnivDpodZI+/KnpL3Jnap0PBdIHU7HwFGB8r+vV5CVw==", ++ "dev": true, ++ "requires": { ++ "chalk": "^4.1.2", ++ "chokidar": "^3.5.3", ++ "fs-extra": "^10.0.1", ++ "globby": "^11.0.3" ++ } ++ }, ++ "esbuild-plugin-replace": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/esbuild-plugin-replace/-/esbuild-plugin-replace-1.4.0.tgz", ++ "integrity": "sha512-lP3ZAyzyRa5JXoOd59lJbRKNObtK8pJ/RO7o6vdjwLi71GfbL32NR22ZuS7/cLZkr10/L1lutoLma8E4DLngYg==", ++ "dev": true, ++ "requires": { ++ "magic-string": "^0.25.7" ++ } ++ }, ++ "esbuild-sass-plugin": { ++ "version": "3.3.1", ++ "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-3.3.1.tgz", ++ "integrity": "sha512-SnO1ls+d52n6j8gRRpjexXI8MsHEaumS0IdDHaYM29Y6gakzZYMls6i9ql9+AWMSQk/eryndmUpXEgT34QrX1A==", ++ "dev": true, ++ "requires": { ++ "resolve": "^1.22.8", ++ "safe-identifier": "^0.4.2", ++ "sass": "^1.71.1" ++ } ++ }, ++ "esbuild-wasm": { ++ "version": "0.24.0", ++ "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.24.0.tgz", ++ "integrity": "sha512-xhNn5tL1AhkPg4ft59yXT6FkwKXiPSYyz1IeinJHUJpjvOHOIPvdmFQc0pGdjxlKSbzZc2mNmtVOWAR1EF/JAg==", ++ "dev": true ++ }, ++ "escape-string-regexp": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", ++ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", ++ "dev": true ++ }, ++ "eslint": { ++ "version": "8.57.1", ++ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", ++ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", ++ "dev": true, ++ "requires": { ++ "@eslint-community/eslint-utils": "^4.2.0", ++ "@eslint-community/regexpp": "^4.6.1", ++ "@eslint/eslintrc": "^2.1.4", ++ "@eslint/js": "8.57.1", ++ "@humanwhocodes/config-array": "^0.13.0", ++ "@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" ++ }, ++ "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "glob-parent": { ++ "version": "6.0.2", ++ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", ++ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", ++ "dev": true, ++ "requires": { ++ "is-glob": "^4.0.3" ++ } ++ }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ } ++ } ++ }, ++ "eslint-compat-utils": { ++ "version": "0.5.1", ++ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", ++ "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "semver": "^7.5.4" ++ } ++ }, ++ "eslint-config-standard": { ++ "version": "17.1.0", ++ "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", ++ "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", ++ "dev": true, ++ "requires": {} ++ }, ++ "eslint-config-standard-jsx": { ++ "version": "11.0.0", ++ "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", ++ "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", ++ "dev": true, ++ "requires": {} ++ }, ++ "eslint-config-standard-react": { ++ "version": "13.0.0", ++ "resolved": "https://registry.npmjs.org/eslint-config-standard-react/-/eslint-config-standard-react-13.0.0.tgz", ++ "integrity": "sha512-HrVPGj8UncHfV+BsdJTuJpVsomn6AIrke3Af2Fh4XFvQQDU+iO6N2ZL+UsC+scExft4fU3uf7fJwj7PKWnXJDA==", ++ "dev": true, ++ "requires": {} ++ }, ++ "eslint-import-resolver-node": { ++ "version": "0.3.9", ++ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", ++ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", ++ "dev": true, ++ "requires": { ++ "debug": "^3.2.7", ++ "is-core-module": "^2.13.0", ++ "resolve": "^1.22.4" ++ }, ++ "dependencies": { ++ "debug": { ++ "version": "3.2.7", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", ++ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", ++ "dev": true, ++ "requires": { ++ "ms": "^2.1.1" ++ } ++ } ++ } ++ }, ++ "eslint-module-utils": { ++ "version": "2.12.0", ++ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", ++ "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", ++ "dev": true, ++ "requires": { ++ "debug": "^3.2.7" ++ }, ++ "dependencies": { ++ "debug": { ++ "version": "3.2.7", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", ++ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", ++ "dev": true, ++ "requires": { ++ "ms": "^2.1.1" ++ } ++ } ++ } ++ }, ++ "eslint-plugin-es": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", ++ "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", ++ "dev": true, ++ "requires": { ++ "eslint-utils": "^2.0.0", ++ "regexpp": "^3.0.0" ++ } ++ }, ++ "eslint-plugin-es-x": { ++ "version": "7.8.0", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", ++ "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "@eslint-community/eslint-utils": "^4.1.2", ++ "@eslint-community/regexpp": "^4.11.0", ++ "eslint-compat-utils": "^0.5.1" ++ } ++ }, ++ "eslint-plugin-import": { ++ "version": "2.31.0", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", ++ "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", ++ "dev": true, ++ "requires": { ++ "@rtsao/scc": "^1.1.0", ++ "array-includes": "^3.1.8", ++ "array.prototype.findlastindex": "^1.2.5", ++ "array.prototype.flat": "^1.3.2", ++ "array.prototype.flatmap": "^1.3.2", ++ "debug": "^3.2.7", ++ "doctrine": "^2.1.0", ++ "eslint-import-resolver-node": "^0.3.9", ++ "eslint-module-utils": "^2.12.0", ++ "hasown": "^2.0.2", ++ "is-core-module": "^2.15.1", ++ "is-glob": "^4.0.3", ++ "minimatch": "^3.1.2", ++ "object.fromentries": "^2.0.8", ++ "object.groupby": "^1.0.3", ++ "object.values": "^1.2.0", ++ "semver": "^6.3.1", ++ "string.prototype.trimend": "^1.0.8", ++ "tsconfig-paths": "^3.15.0" ++ }, ++ "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "debug": { ++ "version": "3.2.7", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", ++ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", ++ "dev": true, ++ "requires": { ++ "ms": "^2.1.1" ++ } ++ }, ++ "doctrine": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", ++ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", ++ "dev": true, ++ "requires": { ++ "esutils": "^2.0.2" ++ } ++ }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ }, ++ "semver": { ++ "version": "6.3.1", ++ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", ++ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", ++ "dev": true ++ } ++ } ++ }, ++ "eslint-plugin-jsx-a11y": { ++ "version": "6.10.0", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", ++ "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", ++ "dev": true, ++ "requires": { ++ "aria-query": "~5.1.3", ++ "array-includes": "^3.1.8", ++ "array.prototype.flatmap": "^1.3.2", ++ "ast-types-flow": "^0.0.8", ++ "axe-core": "^4.10.0", ++ "axobject-query": "^4.1.0", ++ "damerau-levenshtein": "^1.0.8", ++ "emoji-regex": "^9.2.2", ++ "es-iterator-helpers": "^1.0.19", ++ "hasown": "^2.0.2", ++ "jsx-ast-utils": "^3.3.5", ++ "language-tags": "^1.0.9", ++ "minimatch": "^3.1.2", ++ "object.fromentries": "^2.0.8", ++ "safe-regex-test": "^1.0.3", ++ "string.prototype.includes": "^2.0.0" ++ }, ++ "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ } ++ } ++ }, ++ "eslint-plugin-n": { ++ "version": "16.6.2", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", ++ "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "@eslint-community/eslint-utils": "^4.4.0", ++ "builtins": "^5.0.1", ++ "eslint-plugin-es-x": "^7.5.0", ++ "get-tsconfig": "^4.7.0", ++ "globals": "^13.24.0", ++ "ignore": "^5.2.4", ++ "is-builtin-module": "^3.2.1", ++ "is-core-module": "^2.12.1", ++ "minimatch": "^3.1.2", ++ "resolve": "^1.22.2", ++ "semver": "^7.5.3" ++ }, ++ "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ } ++ } ++ }, ++ "eslint-plugin-node": { ++ "version": "11.1.0", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", ++ "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", ++ "dev": true, ++ "requires": { ++ "eslint-plugin-es": "^3.0.0", ++ "eslint-utils": "^2.0.0", ++ "ignore": "^5.1.1", ++ "minimatch": "^3.0.4", ++ "resolve": "^1.10.1", ++ "semver": "^6.1.0" ++ }, ++ "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ }, ++ "semver": { ++ "version": "6.3.1", ++ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", ++ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", ++ "dev": true ++ } ++ } ++ }, ++ "eslint-plugin-promise": { ++ "version": "6.6.0", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", ++ "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", ++ "dev": true, ++ "requires": {} ++ }, ++ "eslint-plugin-react": { ++ "version": "7.37.1", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz", ++ "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==", ++ "dev": true, ++ "requires": { ++ "array-includes": "^3.1.8", ++ "array.prototype.findlast": "^1.2.5", ++ "array.prototype.flatmap": "^1.3.2", ++ "array.prototype.tosorted": "^1.1.4", ++ "doctrine": "^2.1.0", ++ "es-iterator-helpers": "^1.0.19", ++ "estraverse": "^5.3.0", ++ "hasown": "^2.0.2", ++ "jsx-ast-utils": "^2.4.1 || ^3.0.0", ++ "minimatch": "^3.1.2", ++ "object.entries": "^1.1.8", ++ "object.fromentries": "^2.0.8", ++ "object.values": "^1.2.0", ++ "prop-types": "^15.8.1", ++ "resolve": "^2.0.0-next.5", ++ "semver": "^6.3.1", ++ "string.prototype.matchall": "^4.0.11", ++ "string.prototype.repeat": "^1.0.0" ++ }, ++ "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "doctrine": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", ++ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", ++ "dev": true, ++ "requires": { ++ "esutils": "^2.0.2" ++ } ++ }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ }, ++ "resolve": { ++ "version": "2.0.0-next.5", ++ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", ++ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", ++ "dev": true, ++ "requires": { ++ "is-core-module": "^2.13.0", ++ "path-parse": "^1.0.7", ++ "supports-preserve-symlinks-flag": "^1.0.0" ++ } ++ }, ++ "semver": { ++ "version": "6.3.1", ++ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", ++ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", ++ "dev": true ++ } ++ } ++ }, ++ "eslint-plugin-react-hooks": { ++ "version": "4.6.2", ++ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", ++ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", ++ "dev": true, ++ "requires": {} ++ }, ++ "eslint-scope": { ++ "version": "7.2.2", ++ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", ++ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", ++ "dev": true, ++ "requires": { ++ "esrecurse": "^4.3.0", ++ "estraverse": "^5.2.0" ++ } ++ }, ++ "eslint-utils": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", ++ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", ++ "dev": true, ++ "requires": { ++ "eslint-visitor-keys": "^1.1.0" ++ }, ++ "dependencies": { ++ "eslint-visitor-keys": { ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", ++ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", ++ "dev": true ++ } ++ } ++ }, ++ "eslint-visitor-keys": { ++ "version": "3.4.3", ++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", ++ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", ++ "dev": true ++ }, ++ "espree": { ++ "version": "9.6.1", ++ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", ++ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", ++ "dev": true, ++ "requires": { ++ "acorn": "^8.9.0", ++ "acorn-jsx": "^5.3.2", ++ "eslint-visitor-keys": "^3.4.1" ++ } ++ }, ++ "esquery": { ++ "version": "1.6.0", ++ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", ++ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", ++ "dev": true, ++ "requires": { ++ "estraverse": "^5.1.0" ++ } ++ }, ++ "esrecurse": { ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", ++ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", ++ "dev": true, ++ "requires": { ++ "estraverse": "^5.2.0" ++ } ++ }, ++ "estraverse": { ++ "version": "5.3.0", ++ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", ++ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", ++ "dev": true ++ }, ++ "esutils": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", ++ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", ++ "dev": true ++ }, ++ "fast-deep-equal": { ++ "version": "3.1.3", ++ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", ++ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", ++ "dev": true ++ }, ++ "fast-glob": { ++ "version": "3.3.3", ++ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", ++ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", ++ "dev": true, ++ "requires": { ++ "@nodelib/fs.stat": "^2.0.2", ++ "@nodelib/fs.walk": "^1.2.3", ++ "glob-parent": "^5.1.2", ++ "merge2": "^1.3.0", ++ "micromatch": "^4.0.8" ++ } ++ }, ++ "fast-json-stable-stringify": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", ++ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", ++ "dev": true ++ }, ++ "fast-levenshtein": { ++ "version": "2.0.6", ++ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", ++ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", ++ "dev": true ++ }, ++ "fast-uri": { ++ "version": "3.0.6", ++ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", ++ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", ++ "dev": true ++ }, ++ "fastest-levenshtein": { ++ "version": "1.0.16", ++ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", ++ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", ++ "dev": true ++ }, ++ "fastq": { ++ "version": "1.18.0", ++ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", ++ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", ++ "dev": true, ++ "requires": { ++ "reusify": "^1.0.4" ++ } ++ }, ++ "file-entry-cache": { ++ "version": "6.0.1", ++ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", ++ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", ++ "dev": true, ++ "requires": { ++ "flat-cache": "^3.0.4" ++ } ++ }, ++ "file-selector": { ++ "version": "2.1.2", ++ "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", ++ "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", ++ "requires": { ++ "tslib": "^2.7.0" ++ } ++ }, ++ "fill-range": { ++ "version": "7.1.1", ++ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", ++ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", ++ "dev": true, ++ "requires": { ++ "to-regex-range": "^5.0.1" ++ } ++ }, ++ "find-up": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", ++ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", ++ "dev": true, ++ "requires": { ++ "locate-path": "^6.0.0", ++ "path-exists": "^4.0.0" ++ } ++ }, ++ "flat-cache": { ++ "version": "3.2.0", ++ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", ++ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", ++ "dev": true, ++ "requires": { ++ "flatted": "^3.2.9", ++ "keyv": "^4.5.3", ++ "rimraf": "^3.0.2" ++ } ++ }, ++ "flatted": { ++ "version": "3.3.2", ++ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", ++ "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", ++ "dev": true ++ }, ++ "focus-trap": { ++ "version": "7.5.4", ++ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", ++ "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", ++ "requires": { ++ "tabbable": "^6.2.0" ++ } ++ }, ++ "for-each": { ++ "version": "0.3.4", ++ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz", ++ "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==", ++ "dev": true, ++ "requires": { ++ "is-callable": "^1.2.7" ++ } ++ }, ++ "foreground-child": { ++ "version": "3.3.0", ++ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", ++ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", ++ "dev": true, ++ "requires": { ++ "cross-spawn": "^7.0.0", ++ "signal-exit": "^4.0.1" ++ } ++ }, ++ "fs-extra": { ++ "version": "10.1.0", ++ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", ++ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", ++ "dev": true, ++ "requires": { ++ "graceful-fs": "^4.2.0", ++ "jsonfile": "^6.0.1", ++ "universalify": "^2.0.0" ++ } ++ }, ++ "fs.realpath": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", ++ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", ++ "dev": true ++ }, ++ "fsevents": { ++ "version": "2.3.3", ++ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", ++ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", ++ "dev": true, ++ "optional": true ++ }, ++ "function-bind": { ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", ++ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", ++ "dev": true ++ }, ++ "function.prototype.name": { ++ "version": "1.1.8", ++ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", ++ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "define-properties": "^1.2.1", ++ "functions-have-names": "^1.2.3", ++ "hasown": "^2.0.2", ++ "is-callable": "^1.2.7" ++ } ++ }, ++ "functions-have-names": { ++ "version": "1.2.3", ++ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", ++ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", ++ "dev": true ++ }, ++ "get-east-asian-width": { ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", ++ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", ++ "dev": true ++ }, ++ "get-intrinsic": { ++ "version": "1.2.7", ++ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", ++ "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", ++ "dev": true, ++ "requires": { ++ "call-bind-apply-helpers": "^1.0.1", ++ "es-define-property": "^1.0.1", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", ++ "function-bind": "^1.1.2", ++ "get-proto": "^1.0.0", ++ "gopd": "^1.2.0", ++ "has-symbols": "^1.1.0", ++ "hasown": "^2.0.2", ++ "math-intrinsics": "^1.1.0" ++ } ++ }, ++ "get-proto": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", ++ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", ++ "dev": true, ++ "requires": { ++ "dunder-proto": "^1.0.1", ++ "es-object-atoms": "^1.0.0" ++ } ++ }, ++ "get-symbol-description": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", ++ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.3", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.6" ++ } ++ }, ++ "get-tsconfig": { ++ "version": "4.10.0", ++ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", ++ "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "resolve-pkg-maps": "^1.0.0" ++ } ++ }, ++ "gettext-parser": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-2.1.0.tgz", ++ "integrity": "sha512-YGmu8DSm7PBnwItT+aOiqejOogqctHFzn+wBKUzjDFQP00psAtn/W2paWQxqE5eA5Ijrqaf7xuTKqyCHpuxnrg==", ++ "requires": { ++ "encoding": "^0.1.12", ++ "readable-stream": "^2.0.0", ++ "safe-buffer": "^5.1.2" ++ } ++ }, ++ "gettext-to-messageformat": { ++ "version": "0.3.1", ++ "resolved": "https://registry.npmjs.org/gettext-to-messageformat/-/gettext-to-messageformat-0.3.1.tgz", ++ "integrity": "sha512-UyqIL3Ul4NryU95Wome/qtlcuVIqgEWVIFw0zi7Lv14ACLXfaVDCbrjZ7o+3BZ7u+4NS1mP/2O1eXZoHCoas8g==", ++ "dev": true, ++ "requires": { ++ "gettext-parser": "^1.4.0" ++ }, ++ "dependencies": { ++ "gettext-parser": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz", ++ "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==", ++ "dev": true, ++ "requires": { ++ "encoding": "^0.1.12", ++ "safe-buffer": "^5.1.1" ++ } ++ } ++ } ++ }, ++ "glob": { ++ "version": "11.0.0", ++ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", ++ "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", ++ "dev": true, ++ "requires": { ++ "foreground-child": "^3.1.0", ++ "jackspeak": "^4.0.1", ++ "minimatch": "^10.0.0", ++ "minipass": "^7.1.2", ++ "package-json-from-dist": "^1.0.0", ++ "path-scurry": "^2.0.0" ++ }, ++ "dependencies": { ++ "minimatch": { ++ "version": "10.0.1", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", ++ "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", ++ "dev": true, ++ "requires": { ++ "brace-expansion": "^2.0.1" ++ } ++ } ++ } ++ }, ++ "glob-parent": { ++ "version": "5.1.2", ++ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", ++ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", ++ "dev": true, ++ "requires": { ++ "is-glob": "^4.0.1" ++ } ++ }, ++ "global-modules": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", ++ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", ++ "dev": true, ++ "requires": { ++ "global-prefix": "^3.0.0" ++ } ++ }, ++ "global-prefix": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", ++ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", ++ "dev": true, ++ "requires": { ++ "ini": "^1.3.5", ++ "kind-of": "^6.0.2", ++ "which": "^1.3.1" ++ }, ++ "dependencies": { ++ "which": { ++ "version": "1.3.1", ++ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", ++ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", ++ "dev": true, ++ "requires": { ++ "isexe": "^2.0.0" ++ } ++ } ++ } ++ }, ++ "globals": { ++ "version": "13.24.0", ++ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", ++ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", ++ "dev": true, ++ "requires": { ++ "type-fest": "^0.20.2" ++ } ++ }, ++ "globalthis": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", ++ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", ++ "dev": true, ++ "requires": { ++ "define-properties": "^1.2.1", ++ "gopd": "^1.0.1" ++ } ++ }, ++ "globalyzer": { ++ "version": "0.1.0", ++ "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", ++ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", ++ "dev": true ++ }, ++ "globby": { ++ "version": "11.1.0", ++ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", ++ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", ++ "dev": true, ++ "requires": { ++ "array-union": "^2.1.0", ++ "dir-glob": "^3.0.1", ++ "fast-glob": "^3.2.9", ++ "ignore": "^5.2.0", ++ "merge2": "^1.4.1", ++ "slash": "^3.0.0" ++ } ++ }, ++ "globjoin": { ++ "version": "0.1.4", ++ "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", ++ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", ++ "dev": true ++ }, ++ "globrex": { ++ "version": "0.1.2", ++ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", ++ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", ++ "dev": true ++ }, ++ "gopd": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", ++ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", ++ "dev": true ++ }, ++ "graceful-fs": { ++ "version": "4.2.11", ++ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", ++ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", ++ "dev": true ++ }, ++ "graphemer": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", ++ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", ++ "dev": true ++ }, ++ "has-bigints": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", ++ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", ++ "dev": true ++ }, ++ "has-flag": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", ++ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", ++ "dev": true ++ }, ++ "has-property-descriptors": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", ++ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", ++ "dev": true, ++ "requires": { ++ "es-define-property": "^1.0.0" ++ } ++ }, ++ "has-proto": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", ++ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", ++ "dev": true, ++ "requires": { ++ "dunder-proto": "^1.0.0" ++ } ++ }, ++ "has-symbols": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", ++ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", ++ "dev": true ++ }, ++ "has-tostringtag": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", ++ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", ++ "dev": true, ++ "requires": { ++ "has-symbols": "^1.0.3" ++ } ++ }, ++ "hasown": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", ++ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", ++ "dev": true, ++ "requires": { ++ "function-bind": "^1.1.2" ++ } ++ }, ++ "hoist-non-react-statics": { ++ "version": "3.3.2", ++ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", ++ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", ++ "requires": { ++ "react-is": "^16.7.0" ++ } ++ }, ++ "html-tags": { ++ "version": "3.3.1", ++ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", ++ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", ++ "dev": true ++ }, ++ "htmlparser": { ++ "version": "1.7.7", ++ "resolved": "https://registry.npmjs.org/htmlparser/-/htmlparser-1.7.7.tgz", ++ "integrity": "sha512-zpK66ifkT0fauyFh2Mulrq4AqGTucxGtOhZ8OjkbSfcCpkqQEI8qRkY0tSQSJNAQ4HUZkgWaU4fK4EH6SVH9PQ==", ++ "dev": true ++ }, ++ "iconv-lite": { ++ "version": "0.6.3", ++ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", ++ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", ++ "requires": { ++ "safer-buffer": ">= 2.1.2 < 3.0.0" ++ } ++ }, ++ "ignore": { ++ "version": "5.3.2", ++ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", ++ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", ++ "dev": true ++ }, ++ "immutable": { ++ "version": "4.3.7", ++ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", ++ "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", ++ "dev": true ++ }, ++ "import-fresh": { ++ "version": "3.3.0", ++ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", ++ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", ++ "dev": true, ++ "requires": { ++ "parent-module": "^1.0.0", ++ "resolve-from": "^4.0.0" ++ } ++ }, ++ "imurmurhash": { ++ "version": "0.1.4", ++ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", ++ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", ++ "dev": true ++ }, ++ "inflight": { ++ "version": "1.0.6", ++ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", ++ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", ++ "dev": true, ++ "requires": { ++ "once": "^1.3.0", ++ "wrappy": "1" ++ } ++ }, ++ "inherits": { ++ "version": "2.0.4", ++ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", ++ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" ++ }, ++ "ini": { ++ "version": "1.3.8", ++ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", ++ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", ++ "dev": true ++ }, ++ "internal-slot": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", ++ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", ++ "dev": true, ++ "requires": { ++ "es-errors": "^1.3.0", ++ "hasown": "^2.0.2", ++ "side-channel": "^1.1.0" ++ } ++ }, ++ "internmap": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", ++ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" ++ }, ++ "irregular-plurals": { ++ "version": "3.5.0", ++ "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", ++ "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", ++ "dev": true ++ }, ++ "is-arguments": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", ++ "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.2", ++ "has-tostringtag": "^1.0.2" ++ } ++ }, ++ "is-array-buffer": { ++ "version": "3.0.5", ++ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", ++ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "get-intrinsic": "^1.2.6" ++ } ++ }, ++ "is-arrayish": { ++ "version": "0.2.1", ++ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", ++ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", ++ "dev": true ++ }, ++ "is-async-function": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", ++ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", ++ "dev": true, ++ "requires": { ++ "async-function": "^1.0.0", ++ "call-bound": "^1.0.3", ++ "get-proto": "^1.0.1", ++ "has-tostringtag": "^1.0.2", ++ "safe-regex-test": "^1.1.0" ++ } ++ }, ++ "is-bigint": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", ++ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", ++ "dev": true, ++ "requires": { ++ "has-bigints": "^1.0.2" ++ } ++ }, ++ "is-binary-path": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", ++ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", ++ "dev": true, ++ "requires": { ++ "binary-extensions": "^2.0.0" ++ } ++ }, ++ "is-boolean-object": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", ++ "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.2", ++ "has-tostringtag": "^1.0.2" ++ } ++ }, ++ "is-builtin-module": { ++ "version": "3.2.1", ++ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", ++ "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "builtin-modules": "^3.3.0" ++ } ++ }, ++ "is-callable": { ++ "version": "1.2.7", ++ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", ++ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", ++ "dev": true ++ }, ++ "is-core-module": { ++ "version": "2.16.1", ++ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", ++ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", ++ "dev": true, ++ "requires": { ++ "hasown": "^2.0.2" ++ } ++ }, ++ "is-data-view": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", ++ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.2", ++ "get-intrinsic": "^1.2.6", ++ "is-typed-array": "^1.1.13" ++ } ++ }, ++ "is-date-object": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", ++ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.2", ++ "has-tostringtag": "^1.0.2" ++ } ++ }, ++ "is-extglob": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", ++ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", ++ "dev": true ++ }, ++ "is-finalizationregistry": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", ++ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.3" ++ } ++ }, ++ "is-fullwidth-code-point": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", ++ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", ++ "dev": true ++ }, ++ "is-generator-function": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", ++ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.3", ++ "get-proto": "^1.0.0", ++ "has-tostringtag": "^1.0.2", ++ "safe-regex-test": "^1.1.0" ++ } ++ }, ++ "is-glob": { ++ "version": "4.0.3", ++ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", ++ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", ++ "dev": true, ++ "requires": { ++ "is-extglob": "^2.1.1" ++ } ++ }, ++ "is-map": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", ++ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", ++ "dev": true ++ }, ++ "is-number": { ++ "version": "7.0.0", ++ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", ++ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", ++ "dev": true ++ }, ++ "is-number-object": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", ++ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.3", ++ "has-tostringtag": "^1.0.2" ++ } ++ }, ++ "is-path-inside": { ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", ++ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", ++ "dev": true ++ }, ++ "is-plain-object": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", ++ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", ++ "dev": true ++ }, ++ "is-regex": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", ++ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.2", ++ "gopd": "^1.2.0", ++ "has-tostringtag": "^1.0.2", ++ "hasown": "^2.0.2" ++ } ++ }, ++ "is-set": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", ++ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", ++ "dev": true ++ }, ++ "is-shared-array-buffer": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", ++ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.3" ++ } ++ }, ++ "is-string": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", ++ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.3", ++ "has-tostringtag": "^1.0.2" ++ } ++ }, ++ "is-symbol": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", ++ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.2", ++ "has-symbols": "^1.1.0", ++ "safe-regex-test": "^1.1.0" ++ } ++ }, ++ "is-typed-array": { ++ "version": "1.1.15", ++ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", ++ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", ++ "dev": true, ++ "requires": { ++ "which-typed-array": "^1.1.16" ++ } ++ }, ++ "is-unicode-supported": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", ++ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", ++ "dev": true ++ }, ++ "is-weakmap": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", ++ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", ++ "dev": true ++ }, ++ "is-weakref": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", ++ "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.2" ++ } ++ }, ++ "is-weakset": { ++ "version": "2.0.4", ++ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", ++ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.3", ++ "get-intrinsic": "^1.2.6" ++ } ++ }, ++ "isarray": { ++ "version": "2.0.5", ++ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", ++ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", ++ "dev": true ++ }, ++ "isexe": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", ++ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", ++ "dev": true ++ }, ++ "iterator.prototype": { ++ "version": "1.1.5", ++ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", ++ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", ++ "dev": true, ++ "requires": { ++ "define-data-property": "^1.1.4", ++ "es-object-atoms": "^1.0.0", ++ "get-intrinsic": "^1.2.6", ++ "get-proto": "^1.0.0", ++ "has-symbols": "^1.1.0", ++ "set-function-name": "^2.0.2" ++ } ++ }, ++ "jackspeak": { ++ "version": "4.0.2", ++ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", ++ "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", ++ "dev": true, ++ "requires": { ++ "@isaacs/cliui": "^8.0.2" ++ } ++ }, ++ "jed": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz", ++ "integrity": "sha512-z35ZSEcXHxLW4yumw0dF6L464NT36vmx3wxJw8MDpraBcWuNVgUPZgPJKcu1HekNgwlMFNqol7i/IpSbjhqwqA==", ++ "dev": true ++ }, ++ "js-sha1": { ++ "version": "0.7.0", ++ "resolved": "https://registry.npmjs.org/js-sha1/-/js-sha1-0.7.0.tgz", ++ "integrity": "sha512-oQZ1Mo7440BfLSv9TX87VNEyU52pXPVG19F9PL3gTgNt0tVxlZ8F4O6yze3CLuLx28TxotxvlyepCNaaV0ZjMw==" ++ }, ++ "js-sha256": { ++ "version": "0.11.0", ++ "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.11.0.tgz", ++ "integrity": "sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q==" ++ }, ++ "js-tokens": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", ++ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" ++ }, ++ "js-yaml": { ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", ++ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", ++ "dev": true, ++ "requires": { ++ "argparse": "^2.0.1" ++ } ++ }, ++ "json-buffer": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", ++ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", ++ "dev": true ++ }, ++ "json-parse-even-better-errors": { ++ "version": "2.3.1", ++ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", ++ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", ++ "dev": true ++ }, ++ "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 ++ }, ++ "json-stable-stringify-without-jsonify": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", ++ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" ++ }, ++ "json-stringify-safe": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", ++ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" ++ }, ++ "json5": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", ++ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", ++ "dev": true, ++ "requires": { ++ "minimist": "^1.2.0" ++ } ++ }, ++ "jsonfile": { ++ "version": "6.1.0", ++ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", ++ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", ++ "dev": true, ++ "requires": { ++ "graceful-fs": "^4.1.6", ++ "universalify": "^2.0.0" ++ } ++ }, ++ "jsx-ast-utils": { ++ "version": "3.3.5", ++ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", ++ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", ++ "dev": true, ++ "requires": { ++ "array-includes": "^3.1.6", ++ "array.prototype.flat": "^1.3.1", ++ "object.assign": "^4.1.4", ++ "object.values": "^1.1.6" ++ } ++ }, ++ "keyv": { ++ "version": "4.5.4", ++ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", ++ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", ++ "dev": true, ++ "requires": { ++ "json-buffer": "3.0.1" ++ } ++ }, ++ "kind-of": { ++ "version": "6.0.3", ++ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", ++ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", ++ "dev": true ++ }, ++ "known-css-properties": { ++ "version": "0.34.0", ++ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", ++ "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", ++ "dev": true ++ }, ++ "language-subtag-registry": { ++ "version": "0.3.23", ++ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", ++ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", ++ "dev": true ++ }, ++ "language-tags": { ++ "version": "1.0.9", ++ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", ++ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", ++ "dev": true, ++ "requires": { ++ "language-subtag-registry": "^0.3.20" ++ } ++ }, ++ "levn": { ++ "version": "0.4.1", ++ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", ++ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", ++ "dev": true, ++ "requires": { ++ "prelude-ls": "^1.2.1", ++ "type-check": "~0.4.0" ++ } ++ }, ++ "lines-and-columns": { ++ "version": "1.2.4", ++ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", ++ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", ++ "dev": true ++ }, ++ "locate-path": { ++ "version": "6.0.0", ++ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", ++ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", ++ "dev": true, ++ "requires": { ++ "p-locate": "^5.0.0" ++ } ++ }, ++ "lodash": { ++ "version": "4.17.21", ++ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", ++ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" ++ }, ++ "lodash.merge": { ++ "version": "4.6.2", ++ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", ++ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", ++ "dev": true ++ }, ++ "lodash.truncate": { ++ "version": "4.4.2", ++ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", ++ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", ++ "dev": true ++ }, ++ "log-symbols": { ++ "version": "7.0.0", ++ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.0.tgz", ++ "integrity": "sha512-zrc91EDk2M+2AXo/9BTvK91pqb7qrPg2nX/Hy+u8a5qQlbaOflCKO+6SqgZ+M+xUFxGdKTgwnGiL96b1W3ikRA==", ++ "dev": true, ++ "requires": { ++ "is-unicode-supported": "^2.0.0", ++ "yoctocolors": "^2.1.1" ++ } ++ }, ++ "loose-envify": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", ++ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", ++ "requires": { ++ "js-tokens": "^3.0.0 || ^4.0.0" ++ } ++ }, ++ "lru-cache": { ++ "version": "11.0.2", ++ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", ++ "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", ++ "dev": true ++ }, ++ "magic-string": { ++ "version": "0.25.9", ++ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", ++ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", ++ "dev": true, ++ "requires": { ++ "sourcemap-codec": "^1.4.8" ++ } ++ }, ++ "math-intrinsics": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", ++ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", ++ "dev": true ++ }, ++ "mathml-tag-names": { ++ "version": "2.1.3", ++ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", ++ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", ++ "dev": true ++ }, ++ "mdn-data": { ++ "version": "2.0.30", ++ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", ++ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", ++ "dev": true ++ }, ++ "meow": { ++ "version": "13.2.0", ++ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", ++ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", ++ "dev": true ++ }, ++ "merge2": { ++ "version": "1.4.1", ++ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", ++ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", ++ "dev": true ++ }, ++ "micromatch": { ++ "version": "4.0.8", ++ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", ++ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", ++ "dev": true, ++ "requires": { ++ "braces": "^3.0.3", ++ "picomatch": "^2.3.1" ++ } ++ }, ++ "minimatch": { ++ "version": "9.0.5", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", ++ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", ++ "dev": true, ++ "requires": { ++ "brace-expansion": "^2.0.1" ++ } ++ }, ++ "minimist": { ++ "version": "1.2.8", ++ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", ++ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", ++ "dev": true ++ }, ++ "minipass": { ++ "version": "7.1.2", ++ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", ++ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", ++ "dev": true ++ }, ++ "ms": { ++ "version": "2.1.3", ++ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", ++ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", ++ "dev": true ++ }, ++ "nanoid": { ++ "version": "3.3.8", ++ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", ++ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", ++ "dev": true ++ }, ++ "natural-compare": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", ++ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", ++ "dev": true ++ }, ++ "node-watch": { ++ "version": "0.7.3", ++ "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.3.tgz", ++ "integrity": "sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==", ++ "dev": true ++ }, ++ "normalize-path": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", ++ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", ++ "dev": true ++ }, ++ "object-assign": { ++ "version": "4.1.1", ++ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", ++ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" ++ }, ++ "object-inspect": { ++ "version": "1.13.3", ++ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", ++ "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", ++ "dev": true ++ }, ++ "object-is": { ++ "version": "1.1.6", ++ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", ++ "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1" ++ } ++ }, ++ "object-keys": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", ++ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", ++ "dev": true ++ }, ++ "object.assign": { ++ "version": "4.1.7", ++ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", ++ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "define-properties": "^1.2.1", ++ "es-object-atoms": "^1.0.0", ++ "has-symbols": "^1.1.0", ++ "object-keys": "^1.1.1" ++ } ++ }, ++ "object.entries": { ++ "version": "1.1.8", ++ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", ++ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-object-atoms": "^1.0.0" ++ } ++ }, ++ "object.fromentries": { ++ "version": "2.0.8", ++ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", ++ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.2", ++ "es-object-atoms": "^1.0.0" ++ } ++ }, ++ "object.groupby": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", ++ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.2" ++ } ++ }, ++ "object.values": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", ++ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "define-properties": "^1.2.1", ++ "es-object-atoms": "^1.0.0" ++ } ++ }, ++ "once": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", ++ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", ++ "dev": true, ++ "requires": { ++ "wrappy": "1" ++ } ++ }, ++ "optionator": { ++ "version": "0.9.4", ++ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", ++ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", ++ "dev": true, ++ "requires": { ++ "deep-is": "^0.1.3", ++ "fast-levenshtein": "^2.0.6", ++ "levn": "^0.4.1", ++ "prelude-ls": "^1.2.1", ++ "type-check": "^0.4.0", ++ "word-wrap": "^1.2.5" ++ } ++ }, ++ "own-keys": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", ++ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", ++ "dev": true, ++ "requires": { ++ "get-intrinsic": "^1.2.6", ++ "object-keys": "^1.1.1", ++ "safe-push-apply": "^1.0.0" ++ } ++ }, ++ "p-limit": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", ++ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", ++ "dev": true, ++ "requires": { ++ "yocto-queue": "^0.1.0" ++ } ++ }, ++ "p-locate": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", ++ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", ++ "dev": true, ++ "requires": { ++ "p-limit": "^3.0.2" ++ } ++ }, ++ "package-json-from-dist": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", ++ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", ++ "dev": true ++ }, ++ "parent-module": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", ++ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", ++ "dev": true, ++ "requires": { ++ "callsites": "^3.0.0" ++ } ++ }, ++ "parse-json": { ++ "version": "5.2.0", ++ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", ++ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", ++ "dev": true, ++ "requires": { ++ "@babel/code-frame": "^7.0.0", ++ "error-ex": "^1.3.1", ++ "json-parse-even-better-errors": "^2.3.0", ++ "lines-and-columns": "^1.1.6" ++ } ++ }, ++ "path-exists": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", ++ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", ++ "dev": true ++ }, ++ "path-is-absolute": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", ++ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", ++ "dev": true ++ }, ++ "path-key": { ++ "version": "3.1.1", ++ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", ++ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", ++ "dev": true ++ }, ++ "path-parse": { ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", ++ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", ++ "dev": true ++ }, ++ "path-scurry": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", ++ "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", ++ "dev": true, ++ "requires": { ++ "lru-cache": "^11.0.0", ++ "minipass": "^7.1.2" ++ } ++ }, ++ "path-type": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", ++ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", ++ "dev": true ++ }, ++ "picocolors": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", ++ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", ++ "dev": true ++ }, ++ "picomatch": { ++ "version": "2.3.1", ++ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", ++ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", ++ "dev": true ++ }, ++ "plur": { ++ "version": "5.1.0", ++ "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", ++ "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", ++ "dev": true, ++ "requires": { ++ "irregular-plurals": "^3.3.0" ++ } ++ }, ++ "po2json": { ++ "version": "1.0.0-beta-3", ++ "resolved": "https://registry.npmjs.org/po2json/-/po2json-1.0.0-beta-3.tgz", ++ "integrity": "sha512-taS8y6ZEGzPAs0rygW9CuUPY8C3Zgx6cBy31QXxG2JlWS3fLxj/kuD3cbIfXBg30PuYN7J5oyBa/TIRjyqFFtg==", ++ "dev": true, ++ "requires": { ++ "commander": "^6.0.0", ++ "gettext-parser": "2.0.0", ++ "gettext-to-messageformat": "0.3.1" ++ }, ++ "dependencies": { ++ "commander": { ++ "version": "6.2.1", ++ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", ++ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", ++ "dev": true ++ }, ++ "gettext-parser": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-2.0.0.tgz", ++ "integrity": "sha512-FDs/7XjNw58ToQwJFO7avZZbPecSYgw8PBYhd0An+4JtZSrSzKhEvTsVV2uqdO7VziWTOGSgLGD5YRPdsCjF7Q==", ++ "dev": true, ++ "requires": { ++ "encoding": "^0.1.12", ++ "safe-buffer": "^5.1.2" ++ } ++ } ++ } ++ }, ++ "possible-typed-array-names": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", ++ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", ++ "dev": true ++ }, ++ "postcss": { ++ "version": "8.5.1", ++ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", ++ "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", ++ "dev": true, ++ "requires": { ++ "nanoid": "^3.3.8", ++ "picocolors": "^1.1.1", ++ "source-map-js": "^1.2.1" ++ } ++ }, ++ "postcss-media-query-parser": { ++ "version": "0.2.3", ++ "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", ++ "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", ++ "dev": true ++ }, ++ "postcss-resolve-nested-selector": { ++ "version": "0.1.6", ++ "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", ++ "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", ++ "dev": true ++ }, ++ "postcss-safe-parser": { ++ "version": "7.0.1", ++ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", ++ "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", ++ "dev": true, ++ "requires": {} ++ }, ++ "postcss-scss": { ++ "version": "4.0.9", ++ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", ++ "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", ++ "dev": true, ++ "requires": {} ++ }, ++ "postcss-selector-parser": { ++ "version": "6.1.2", ++ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", ++ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", ++ "dev": true, ++ "requires": { ++ "cssesc": "^3.0.0", ++ "util-deprecate": "^1.0.2" ++ } ++ }, ++ "postcss-value-parser": { ++ "version": "4.2.0", ++ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", ++ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", ++ "dev": true ++ }, ++ "prelude-ls": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", ++ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", ++ "dev": true ++ }, ++ "process-nextick-args": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", ++ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" ++ }, ++ "prop-types": { ++ "version": "15.8.1", ++ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", ++ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", ++ "requires": { ++ "loose-envify": "^1.4.0", ++ "object-assign": "^4.1.1", ++ "react-is": "^16.13.1" ++ } ++ }, ++ "punycode": { ++ "version": "2.3.1", ++ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", ++ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", ++ "dev": true ++ }, ++ "queue-microtask": { ++ "version": "1.2.3", ++ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", ++ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", ++ "dev": true ++ }, ++ "qunit": { ++ "version": "2.22.0", ++ "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.22.0.tgz", ++ "integrity": "sha512-wPYvAvpjTL3zlUeyCX75T8gfZfdVXZa8y1EVkGe/XZNORIsCH/WI2X8R2KlemT921X9EKSZUL6CLGSPC7Ks08g==", ++ "dev": true, ++ "requires": { ++ "commander": "7.2.0", ++ "node-watch": "0.7.3", ++ "tiny-glob": "0.2.9" ++ }, ++ "dependencies": { ++ "commander": { ++ "version": "7.2.0", ++ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", ++ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", ++ "dev": true ++ } ++ } ++ }, ++ "qunit-tap": { ++ "version": "1.5.1", ++ "resolved": "https://registry.npmjs.org/qunit-tap/-/qunit-tap-1.5.1.tgz", ++ "integrity": "sha512-ZEgx3kF/DN5WYX3qkR7Kgq/+vtnttaHkX69GFqZ3EEKyXsQ3mYDReWjyetN3jtBEl3ZvQ7DhW6rLq/9sJzoUHQ==", ++ "dev": true ++ }, ++ "react": { ++ "version": "18.3.1", ++ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", ++ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", ++ "requires": { ++ "loose-envify": "^1.1.0" ++ } ++ }, ++ "react-dom": { ++ "version": "18.3.1", ++ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", ++ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", ++ "requires": { ++ "loose-envify": "^1.1.0", ++ "scheduler": "^0.23.2" ++ } ++ }, ++ "react-dropzone": { ++ "version": "14.3.5", ++ "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz", ++ "integrity": "sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==", ++ "requires": { ++ "attr-accept": "^2.2.4", ++ "file-selector": "^2.1.0", ++ "prop-types": "^15.8.1" ++ } ++ }, ++ "react-fast-compare": { ++ "version": "3.2.2", ++ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", ++ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" ++ }, ++ "react-is": { ++ "version": "16.13.1", ++ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", ++ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" ++ }, ++ "readable-stream": { ++ "version": "2.3.8", ++ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", ++ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", ++ "requires": { ++ "core-util-is": "~1.0.0", ++ "inherits": "~2.0.3", ++ "isarray": "~1.0.0", ++ "process-nextick-args": "~2.0.0", ++ "safe-buffer": "~5.1.1", ++ "string_decoder": "~1.1.1", ++ "util-deprecate": "~1.0.1" ++ }, ++ "dependencies": { ++ "isarray": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", ++ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" ++ }, ++ "safe-buffer": { ++ "version": "5.1.2", ++ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", ++ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" ++ } ++ } ++ }, ++ "readdirp": { ++ "version": "3.6.0", ++ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", ++ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", ++ "dev": true, ++ "requires": { ++ "picomatch": "^2.2.1" ++ } ++ }, ++ "reflect.getprototypeof": { ++ "version": "1.0.10", ++ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", ++ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.8", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.9", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", ++ "get-intrinsic": "^1.2.7", ++ "get-proto": "^1.0.1", ++ "which-builtin-type": "^1.2.1" ++ } ++ }, ++ "regexp.prototype.flags": { ++ "version": "1.5.4", ++ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", ++ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.8", ++ "define-properties": "^1.2.1", ++ "es-errors": "^1.3.0", ++ "get-proto": "^1.0.1", ++ "gopd": "^1.2.0", ++ "set-function-name": "^2.0.2" ++ } ++ }, ++ "regexpp": { ++ "version": "3.2.0", ++ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", ++ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", ++ "dev": true ++ }, ++ "remarkable": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", ++ "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", ++ "requires": { ++ "argparse": "^1.0.10", ++ "autolinker": "^3.11.0" ++ }, ++ "dependencies": { ++ "argparse": { ++ "version": "1.0.10", ++ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", ++ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", ++ "requires": { ++ "sprintf-js": "~1.0.2" ++ } ++ } ++ } ++ }, ++ "require-from-string": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", ++ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", ++ "dev": true ++ }, ++ "resolve": { ++ "version": "1.22.10", ++ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", ++ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", ++ "dev": true, ++ "requires": { ++ "is-core-module": "^2.16.0", ++ "path-parse": "^1.0.7", ++ "supports-preserve-symlinks-flag": "^1.0.0" ++ } ++ }, ++ "resolve-from": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", ++ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", ++ "dev": true ++ }, ++ "resolve-pkg-maps": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", ++ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", ++ "dev": true, ++ "peer": true ++ }, ++ "reusify": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", ++ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", ++ "dev": true ++ }, ++ "rimraf": { ++ "version": "3.0.2", ++ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", ++ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", ++ "dev": true, ++ "requires": { ++ "glob": "^7.1.3" ++ }, ++ "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dev": true, ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "glob": { ++ "version": "7.2.3", ++ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", ++ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", ++ "dev": true, ++ "requires": { ++ "fs.realpath": "^1.0.0", ++ "inflight": "^1.0.4", ++ "inherits": "2", ++ "minimatch": "^3.1.1", ++ "once": "^1.3.0", ++ "path-is-absolute": "^1.0.0" ++ } ++ }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dev": true, ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ } ++ } ++ }, ++ "run-parallel": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", ++ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", ++ "dev": true, ++ "requires": { ++ "queue-microtask": "^1.2.2" ++ } ++ }, ++ "rxjs": { ++ "version": "7.8.1", ++ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", ++ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "tslib": "^2.1.0" ++ } ++ }, ++ "safe-array-concat": { ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", ++ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.2", ++ "get-intrinsic": "^1.2.6", ++ "has-symbols": "^1.1.0", ++ "isarray": "^2.0.5" ++ } ++ }, ++ "safe-buffer": { ++ "version": "5.2.1", ++ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", ++ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" ++ }, ++ "safe-identifier": { ++ "version": "0.4.2", ++ "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", ++ "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", ++ "dev": true ++ }, ++ "safe-push-apply": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", ++ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", ++ "dev": true, ++ "requires": { ++ "es-errors": "^1.3.0", ++ "isarray": "^2.0.5" ++ } ++ }, ++ "safe-regex-test": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", ++ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "is-regex": "^1.2.1" ++ } ++ }, ++ "safer-buffer": { ++ "version": "2.1.2", ++ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", ++ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" ++ }, ++ "sass": { ++ "version": "1.79.4", ++ "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", ++ "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", ++ "dev": true, ++ "requires": { ++ "chokidar": "^4.0.0", ++ "immutable": "^4.0.0", ++ "source-map-js": ">=0.6.2 <2.0.0" ++ }, ++ "dependencies": { ++ "chokidar": { ++ "version": "4.0.3", ++ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", ++ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", ++ "dev": true, ++ "requires": { ++ "readdirp": "^4.0.1" ++ } ++ }, ++ "readdirp": { ++ "version": "4.1.1", ++ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", ++ "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", ++ "dev": true ++ } ++ } ++ }, ++ "sass-embedded": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.83.4.tgz", ++ "integrity": "sha512-Hf2burRA/y5PGxsg6jB9UpoK/xZ6g/pgrkOcdl6j+rRg1Zj8XhGKZ1MTysZGtTPUUmiiErqzkP5+Kzp95yv9GQ==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "@bufbuild/protobuf": "^2.0.0", ++ "buffer-builder": "^0.2.0", ++ "colorjs.io": "^0.5.0", ++ "immutable": "^5.0.2", ++ "rxjs": "^7.4.0", ++ "sass-embedded-android-arm": "1.83.4", ++ "sass-embedded-android-arm64": "1.83.4", ++ "sass-embedded-android-ia32": "1.83.4", ++ "sass-embedded-android-riscv64": "1.83.4", ++ "sass-embedded-android-x64": "1.83.4", ++ "sass-embedded-darwin-arm64": "1.83.4", ++ "sass-embedded-darwin-x64": "1.83.4", ++ "sass-embedded-linux-arm": "1.83.4", ++ "sass-embedded-linux-arm64": "1.83.4", ++ "sass-embedded-linux-ia32": "1.83.4", ++ "sass-embedded-linux-musl-arm": "1.83.4", ++ "sass-embedded-linux-musl-arm64": "1.83.4", ++ "sass-embedded-linux-musl-ia32": "1.83.4", ++ "sass-embedded-linux-musl-riscv64": "1.83.4", ++ "sass-embedded-linux-musl-x64": "1.83.4", ++ "sass-embedded-linux-riscv64": "1.83.4", ++ "sass-embedded-linux-x64": "1.83.4", ++ "sass-embedded-win32-arm64": "1.83.4", ++ "sass-embedded-win32-ia32": "1.83.4", ++ "sass-embedded-win32-x64": "1.83.4", ++ "supports-color": "^8.1.1", ++ "sync-child-process": "^1.0.2", ++ "varint": "^6.0.0" ++ }, ++ "dependencies": { ++ "immutable": { ++ "version": "5.0.3", ++ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", ++ "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", ++ "dev": true, ++ "peer": true ++ }, ++ "supports-color": { ++ "version": "8.1.1", ++ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", ++ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "has-flag": "^4.0.0" ++ } ++ } ++ } ++ }, ++ "sass-embedded-android-arm": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.83.4.tgz", ++ "integrity": "sha512-9Z4pJAOgEkXa3VDY/o+U6l5XvV0mZTJcSl0l/mSPHihjAHSpLYnOW6+KOWeM8dxqrsqTYcd6COzhanI/a++5Gw==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-android-arm64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.83.4.tgz", ++ "integrity": "sha512-tgX4FzmbVqnQmD67ZxQDvI+qFNABrboOQgwsG05E5bA/US42zGajW9AxpECJYiMXVOHmg+d81ICbjb0fsVHskw==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-android-ia32": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.83.4.tgz", ++ "integrity": "sha512-RsFOziFqPcfZXdFRULC4Ayzy9aK6R6FwQ411broCjlOBX+b0gurjRadkue3cfUEUR5mmy0KeCbp7zVKPLTK+5Q==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-android-riscv64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.83.4.tgz", ++ "integrity": "sha512-EHwh0nmQarBBrMRU928eTZkFGx19k/XW2YwbPR4gBVdWLkbTgCA5aGe8hTE6/1zStyx++3nDGvTZ78+b/VvvLg==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-android-x64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.83.4.tgz", ++ "integrity": "sha512-0PgQNuPWYy1jEOEPDVsV89KfqOsMLIp9CSbjBY7jRcwRhyVAcigqrUG6bDeNtojHUYKA1kU+Eh/85WxOHUOgBw==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-darwin-arm64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.83.4.tgz", ++ "integrity": "sha512-rp2ywymWc3nymnSnAFG5R/8hvxWCsuhK3wOnD10IDlmNB7o4rzKby1c+2ZfpQGowlYGWsWWTgz8FW2qzmZsQRw==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-darwin-x64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.83.4.tgz", ++ "integrity": "sha512-kLkN2lXz9PCgGfDS8Ev5YVcl/V2173L6379en/CaFuJJi7WiyPgBymW7hOmfCt4uO4R1y7CP2Uc08DRtZsBlAA==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-linux-arm": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.83.4.tgz", ++ "integrity": "sha512-nL90ryxX2lNmFucr9jYUyHHx21AoAgdCL1O5Ltx2rKg2xTdytAGHYo2MT5S0LIeKLa/yKP/hjuSvrbICYNDvtA==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-linux-arm64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.83.4.tgz", ++ "integrity": "sha512-E0zjsZX2HgESwyqw31EHtI39DKa7RgK7nvIhIRco1d0QEw227WnoR9pjH3M/ZQy4gQj3GKilOFHM5Krs/omeIA==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-linux-ia32": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.83.4.tgz", ++ "integrity": "sha512-ew5HpchSzgAYbQoriRh8QhlWn5Kw2nQ2jHoV9YLwGKe3fwwOWA0KDedssvDv7FWnY/FCqXyymhLd6Bxae4Xquw==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-linux-musl-arm": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.83.4.tgz", ++ "integrity": "sha512-0RrJRwMrmm+gG0VOB5b5Cjs7Sd+lhqpQJa6EJNEaZHljJokEfpE5GejZsGMRMIQLxEvVphZnnxl6sonCGFE/QQ==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-linux-musl-arm64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.83.4.tgz", ++ "integrity": "sha512-IzMgalf6MZOxgp4AVCgsaWAFDP/IVWOrgVXxkyhw29fyAEoSWBJH4k87wyPhEtxSuzVHLxKNbc8k3UzdWmlBFg==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-linux-musl-ia32": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.83.4.tgz", ++ "integrity": "sha512-LLb4lYbcxPzX4UaJymYXC+WwokxUlfTJEFUv5VF0OTuSsHAGNRs/rslPtzVBTvMeG9TtlOQDhku1F7G6iaDotA==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-linux-musl-riscv64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.83.4.tgz", ++ "integrity": "sha512-zoKlPzD5Z13HKin1UGR74QkEy+kZEk2AkGX5RelRG494mi+IWwRuWCppXIovor9+BQb9eDWPYPoMVahwN5F7VA==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-linux-musl-x64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.83.4.tgz", ++ "integrity": "sha512-hB8+/PYhfEf2zTIcidO5Bpof9trK6WJjZ4T8g2MrxQh8REVtdPcgIkoxczRynqybf9+fbqbUwzXtiUao2GV+vQ==", + "dev": true, +- "dependencies": { +- "call-bind": "^1.0.2", +- "get-intrinsic": "^1.1.3", +- "is-regex": "^1.1.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" +- } ++ "optional": true, ++ "peer": true + }, +- "node_modules/safer-buffer": { +- "version": "2.1.2", +- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", +- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" ++ "sass-embedded-linux-riscv64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.83.4.tgz", ++ "integrity": "sha512-83fL4n+oeDJ0Y4KjASmZ9jHS1Vl9ESVQYHMhJE0i4xDi/P3BNarm2rsKljq/QtrwGpbqwn8ujzOu7DsNCMDSHA==", ++ "dev": true, ++ "optional": true, ++ "peer": true + }, +- "node_modules/sass": { +- "version": "1.63.2", +- "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.2.tgz", +- "integrity": "sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==", ++ "sass-embedded-linux-x64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.83.4.tgz", ++ "integrity": "sha512-NlnGdvCmTD5PK+LKXlK3sAuxOgbRIEoZfnHvxd157imCm/s2SYF/R28D0DAAjEViyI8DovIWghgbcqwuertXsA==", + "dev": true, +- "dependencies": { +- "chokidar": ">=3.0.0 <4.0.0", +- "immutable": "^4.0.0", +- "source-map-js": ">=0.6.2 <2.0.0" +- }, +- "bin": { +- "sass": "sass.js" +- }, +- "engines": { +- "node": ">=14.0.0" ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-win32-arm64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.83.4.tgz", ++ "integrity": "sha512-J2BFKrEaeSrVazU2qTjyQdAk+MvbzJeTuCET0uAJEXSKtvQ3AzxvzndS7LqkDPbF32eXAHLw8GVpwcBwKbB3Uw==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-win32-ia32": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.83.4.tgz", ++ "integrity": "sha512-uPAe9T/5sANFhJS5dcfAOhOJy8/l2TRYG4r+UO3Wp4yhqbN7bggPvY9c7zMYS0OC8tU/bCvfYUDFHYMCl91FgA==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "sass-embedded-win32-x64": { ++ "version": "1.83.4", ++ "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.83.4.tgz", ++ "integrity": "sha512-C9fkDY0jKITdJFij4UbfPFswxoXN9O/Dr79v17fJnstVwtUojzVJWKHUXvF0Zg2LIR7TCc4ju3adejKFxj7ueA==", ++ "dev": true, ++ "optional": true, ++ "peer": true ++ }, ++ "scheduler": { ++ "version": "0.23.2", ++ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", ++ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", ++ "requires": { ++ "loose-envify": "^1.1.0" + } + }, +- "node_modules/scheduler": { +- "version": "0.20.2", +- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", +- "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", +- "dependencies": { +- "loose-envify": "^1.1.0", +- "object-assign": "^4.1.1" ++ "semver": { ++ "version": "7.7.0", ++ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", ++ "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", ++ "dev": true ++ }, ++ "set-function-length": { ++ "version": "1.2.2", ++ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", ++ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", ++ "dev": true, ++ "requires": { ++ "define-data-property": "^1.1.4", ++ "es-errors": "^1.3.0", ++ "function-bind": "^1.1.2", ++ "get-intrinsic": "^1.2.4", ++ "gopd": "^1.0.1", ++ "has-property-descriptors": "^1.0.2" + } + }, +- "node_modules/semver": { +- "version": "6.3.1", +- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", +- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", ++ "set-function-name": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", ++ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, +- "bin": { +- "semver": "bin/semver.js" ++ "requires": { ++ "define-data-property": "^1.1.4", ++ "es-errors": "^1.3.0", ++ "functions-have-names": "^1.2.3", ++ "has-property-descriptors": "^1.0.2" + } + }, +- "node_modules/shebang-command": { ++ "set-proto": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", ++ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", ++ "dev": true, ++ "requires": { ++ "dunder-proto": "^1.0.1", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0" ++ } ++ }, ++ "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, +- "dependencies": { ++ "requires": { + "shebang-regex": "^3.0.0" +- }, +- "engines": { +- "node": ">=8" + } + }, +- "node_modules/shebang-regex": { ++ "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", ++ "dev": true ++ }, ++ "side-channel": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", ++ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, +- "engines": { +- "node": ">=8" ++ "requires": { ++ "es-errors": "^1.3.0", ++ "object-inspect": "^1.13.3", ++ "side-channel-list": "^1.0.0", ++ "side-channel-map": "^1.0.1", ++ "side-channel-weakmap": "^1.0.2" + } + }, +- "node_modules/side-channel": { +- "version": "1.0.4", +- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", +- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", ++ "side-channel-list": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", ++ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, +- "dependencies": { +- "call-bind": "^1.0.0", +- "get-intrinsic": "^1.0.2", +- "object-inspect": "^1.9.0" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "requires": { ++ "es-errors": "^1.3.0", ++ "object-inspect": "^1.13.3" + } + }, +- "node_modules/signal-exit": { +- "version": "4.0.2", +- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", +- "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", ++ "side-channel-map": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", ++ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, +- "engines": { +- "node": ">=14" +- }, +- "funding": { +- "url": "https://github.com/sponsors/isaacs" ++ "requires": { ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.5", ++ "object-inspect": "^1.13.3" + } + }, +- "node_modules/sizzle": { ++ "side-channel-weakmap": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", ++ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.5", ++ "object-inspect": "^1.13.3", ++ "side-channel-map": "^1.0.1" ++ } ++ }, ++ "signal-exit": { ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", ++ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", ++ "dev": true ++ }, ++ "sizzle": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/sizzle/-/sizzle-2.3.10.tgz", + "integrity": "sha512-kPGev+SiByuzi/YPDTqCwdKLWCaN9+14ve86yH0gP6Efue04xjLYWJrcLC6y1buFyIVXkwHNXPsOTEd1MYVPbQ==", + "dev": true + }, +- "node_modules/slash": { ++ "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", +- "dev": true, +- "engines": { +- "node": ">=8" +- } ++ "dev": true + }, +- "node_modules/slice-ansi": { ++ "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, +- "dependencies": { ++ "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" +- }, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/chalk/slice-ansi?sponsor=1" +- } +- }, +- "node_modules/slice-ansi/node_modules/ansi-styles": { +- "version": "4.3.0", +- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", +- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", +- "dev": true, +- "dependencies": { +- "color-convert": "^2.0.1" +- }, +- "engines": { +- "node": ">=8" +- }, +- "funding": { +- "url": "https://github.com/chalk/ansi-styles?sponsor=1" +- } +- }, +- "node_modules/slice-ansi/node_modules/color-convert": { +- "version": "2.0.1", +- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", +- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", +- "dev": true, +- "dependencies": { +- "color-name": "~1.1.4" +- }, +- "engines": { +- "node": ">=7.0.0" + } + }, +- "node_modules/slice-ansi/node_modules/color-name": { +- "version": "1.1.4", +- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", +- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", ++ "source-map-js": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", ++ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true + }, +- "node_modules/source-map-js": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", +- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", +- "dev": true, +- "engines": { +- "node": ">=0.10.0" +- } +- }, +- "node_modules/sourcemap-codec": { ++ "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", +- "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, +- "node_modules/spdx-correct": { +- "version": "3.2.0", +- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", +- "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", ++ "sprintf-js": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", ++ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" ++ }, ++ "stop-iteration-iterator": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", ++ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, +- "dependencies": { +- "spdx-expression-parse": "^3.0.0", +- "spdx-license-ids": "^3.0.0" ++ "requires": { ++ "es-errors": "^1.3.0", ++ "internal-slot": "^1.1.0" + } + }, +- "node_modules/spdx-exceptions": { +- "version": "2.3.0", +- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", +- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", +- "dev": true ++ "string_decoder": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", ++ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", ++ "requires": { ++ "safe-buffer": "~5.1.0" ++ }, ++ "dependencies": { ++ "safe-buffer": { ++ "version": "5.1.2", ++ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", ++ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" ++ } ++ } + }, +- "node_modules/spdx-expression-parse": { +- "version": "3.0.1", +- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", +- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", ++ "string-width": { ++ "version": "5.1.2", ++ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", ++ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, ++ "requires": { ++ "eastasianwidth": "^0.2.0", ++ "emoji-regex": "^9.2.2", ++ "strip-ansi": "^7.0.1" ++ }, + "dependencies": { +- "spdx-exceptions": "^2.1.0", +- "spdx-license-ids": "^3.0.0" ++ "ansi-regex": { ++ "version": "6.1.0", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", ++ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", ++ "dev": true ++ }, ++ "strip-ansi": { ++ "version": "7.1.0", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", ++ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", ++ "dev": true, ++ "requires": { ++ "ansi-regex": "^6.0.1" ++ } ++ } + } + }, +- "node_modules/spdx-license-ids": { +- "version": "3.0.13", +- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", +- "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", +- "dev": true +- }, +- "node_modules/string-natural-compare": { +- "version": "3.0.1", +- "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", +- "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", +- "dev": true +- }, +- "node_modules/string-width": { +- "version": "4.2.3", ++ "string-width-cjs": { ++ "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, +- "dependencies": { ++ "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, +- "engines": { +- "node": ">=8" ++ "dependencies": { ++ "emoji-regex": { ++ "version": "8.0.0", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", ++ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", ++ "dev": true ++ } + } + }, +- "node_modules/string.prototype.matchall": { +- "version": "4.0.8", +- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", +- "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", ++ "string.prototype.includes": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", ++ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.3" ++ } ++ }, ++ "string.prototype.matchall": { ++ "version": "4.0.12", ++ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", ++ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.6", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", ++ "get-intrinsic": "^1.2.6", ++ "gopd": "^1.2.0", ++ "has-symbols": "^1.1.0", ++ "internal-slot": "^1.1.0", ++ "regexp.prototype.flags": "^1.5.3", ++ "set-function-name": "^2.0.2", ++ "side-channel": "^1.1.0" ++ } ++ }, ++ "string.prototype.repeat": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", ++ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, +- "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.4", +- "es-abstract": "^1.20.4", +- "get-intrinsic": "^1.1.3", +- "has-symbols": "^1.0.3", +- "internal-slot": "^1.0.3", +- "regexp.prototype.flags": "^1.4.3", +- "side-channel": "^1.0.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "requires": { ++ "define-properties": "^1.1.3", ++ "es-abstract": "^1.17.5" + } + }, +- "node_modules/string.prototype.trim": { +- "version": "1.2.7", +- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", +- "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", ++ "string.prototype.trim": { ++ "version": "1.2.10", ++ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", ++ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, +- "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.4", +- "es-abstract": "^1.20.4" +- }, +- "engines": { +- "node": ">= 0.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "requires": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.2", ++ "define-data-property": "^1.1.4", ++ "define-properties": "^1.2.1", ++ "es-abstract": "^1.23.5", ++ "es-object-atoms": "^1.0.0", ++ "has-property-descriptors": "^1.0.2" + } + }, +- "node_modules/string.prototype.trimend": { +- "version": "1.0.6", +- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", +- "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", ++ "string.prototype.trimend": { ++ "version": "1.0.9", ++ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", ++ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, +- "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.4", +- "es-abstract": "^1.20.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "requires": { ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.2", ++ "define-properties": "^1.2.1", ++ "es-object-atoms": "^1.0.0" + } + }, +- "node_modules/string.prototype.trimstart": { +- "version": "1.0.6", +- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", +- "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", ++ "string.prototype.trimstart": { ++ "version": "1.0.8", ++ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", ++ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, +- "dependencies": { +- "call-bind": "^1.0.2", +- "define-properties": "^1.1.4", +- "es-abstract": "^1.20.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "requires": { ++ "call-bind": "^1.0.7", ++ "define-properties": "^1.2.1", ++ "es-object-atoms": "^1.0.0" + } + }, +- "node_modules/strip-ansi": { ++ "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, +- "dependencies": { ++ "requires": { + "ansi-regex": "^5.0.1" +- }, +- "engines": { +- "node": ">=8" + } + }, +- "node_modules/strip-bom": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", +- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", ++ "strip-ansi-cjs": { ++ "version": "npm:strip-ansi@6.0.1", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", ++ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, +- "engines": { +- "node": ">=4" ++ "requires": { ++ "ansi-regex": "^5.0.1" + } + }, +- "node_modules/strip-indent": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", +- "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", +- "dev": true, +- "dependencies": { +- "min-indent": "^1.0.1" +- }, +- "engines": { +- "node": ">=12" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" +- } ++ "strip-bom": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", ++ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", ++ "dev": true + }, +- "node_modules/strip-json-comments": { ++ "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", +- "dev": true, +- "engines": { +- "node": ">=8" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" +- } +- }, +- "node_modules/style-search": { +- "version": "0.1.0", +- "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", +- "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", + "dev": true + }, +- "node_modules/stylelint": { +- "version": "15.10.1", +- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.1.tgz", +- "integrity": "sha512-CYkzYrCFfA/gnOR+u9kJ1PpzwG10WLVnoxHDuBA/JiwGqdM9+yx9+ou6SE/y9YHtfv1mcLo06fdadHTOx4gBZQ==", +- "dev": true, +- "dependencies": { +- "@csstools/css-parser-algorithms": "^2.3.0", +- "@csstools/css-tokenizer": "^2.1.1", +- "@csstools/media-query-list-parser": "^2.1.2", +- "@csstools/selector-specificity": "^3.0.0", ++ "stylelint": { ++ "version": "16.9.0", ++ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", ++ "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", ++ "dev": true, ++ "requires": { ++ "@csstools/css-parser-algorithms": "^3.0.1", ++ "@csstools/css-tokenizer": "^3.0.1", ++ "@csstools/media-query-list-parser": "^3.0.1", ++ "@csstools/selector-specificity": "^4.0.0", ++ "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", +- "cosmiconfig": "^8.2.0", +- "css-functions-list": "^3.1.0", ++ "cosmiconfig": "^9.0.0", ++ "css-functions-list": "^3.2.2", + "css-tree": "^2.3.1", +- "debug": "^4.3.4", +- "fast-glob": "^3.3.0", ++ "debug": "^4.3.6", ++ "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.16", +- "file-entry-cache": "^6.0.1", ++ "file-entry-cache": "^9.0.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", +- "ignore": "^5.2.4", +- "import-lazy": "^4.0.0", ++ "ignore": "^5.3.2", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", +- "known-css-properties": "^0.27.0", ++ "known-css-properties": "^0.34.0", + "mathml-tag-names": "^2.1.3", +- "meow": "^10.1.5", +- "micromatch": "^4.0.5", ++ "meow": "^13.2.0", ++ "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", +- "picocolors": "^1.0.0", +- "postcss": "^8.4.24", +- "postcss-resolve-nested-selector": "^0.1.1", +- "postcss-safe-parser": "^6.0.0", +- "postcss-selector-parser": "^6.0.13", ++ "picocolors": "^1.0.1", ++ "postcss": "^8.4.41", ++ "postcss-resolve-nested-selector": "^0.1.6", ++ "postcss-safe-parser": "^7.0.0", ++ "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", +- "strip-ansi": "^6.0.1", +- "style-search": "^0.1.0", +- "supports-hyperlinks": "^3.0.0", ++ "strip-ansi": "^7.1.0", ++ "supports-hyperlinks": "^3.1.0", + "svg-tags": "^1.0.0", +- "table": "^6.8.1", ++ "table": "^6.8.2", + "write-file-atomic": "^5.0.1" + }, +- "bin": { +- "stylelint": "bin/stylelint.mjs" +- }, +- "engines": { +- "node": "^14.13.1 || >=16.0.0" +- }, +- "funding": { +- "type": "opencollective", +- "url": "https://opencollective.com/stylelint" ++ "dependencies": { ++ "balanced-match": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", ++ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", ++ "dev": true ++ }, ++ "emoji-regex": { ++ "version": "8.0.0", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", ++ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", ++ "dev": true ++ }, ++ "file-entry-cache": { ++ "version": "9.1.0", ++ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", ++ "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", ++ "dev": true, ++ "requires": { ++ "flat-cache": "^5.0.0" ++ } ++ }, ++ "flat-cache": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", ++ "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", ++ "dev": true, ++ "requires": { ++ "flatted": "^3.3.1", ++ "keyv": "^4.5.4" ++ } ++ }, ++ "resolve-from": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", ++ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", ++ "dev": true ++ }, ++ "string-width": { ++ "version": "4.2.3", ++ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", ++ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", ++ "dev": true, ++ "requires": { ++ "emoji-regex": "^8.0.0", ++ "is-fullwidth-code-point": "^3.0.0", ++ "strip-ansi": "^6.0.1" ++ }, ++ "dependencies": { ++ "strip-ansi": { ++ "version": "6.0.1", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", ++ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", ++ "dev": true, ++ "requires": { ++ "ansi-regex": "^5.0.1" ++ } ++ } ++ } ++ }, ++ "strip-ansi": { ++ "version": "7.1.0", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", ++ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", ++ "dev": true, ++ "requires": { ++ "ansi-regex": "^6.0.1" ++ }, ++ "dependencies": { ++ "ansi-regex": { ++ "version": "6.1.0", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", ++ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", ++ "dev": true ++ } ++ } ++ } + } + }, +- "node_modules/stylelint-config-recommended": { +- "version": "12.0.0", +- "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-12.0.0.tgz", +- "integrity": "sha512-x6x8QNARrGO2sG6iURkzqL+Dp+4bJorPMMRNPScdvaUK8PsynriOcMW7AFDKqkWAS5wbue/u8fUT/4ynzcmqdQ==", ++ "stylelint-config-recommended": { ++ "version": "14.0.1", ++ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", ++ "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", + "dev": true, +- "peerDependencies": { +- "stylelint": "^15.5.0" +- } ++ "requires": {} + }, +- "node_modules/stylelint-config-recommended-scss": { +- "version": "12.0.0", +- "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-12.0.0.tgz", +- "integrity": "sha512-5Bb2mlGy6WLa30oNeKpZvavv2lowJUsUJO25+OA68GFTemlwd1zbFsL7q0bReKipOSU3sG47hKneZ6Nd+ctrFA==", ++ "stylelint-config-recommended-scss": { ++ "version": "14.0.0", ++ "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.0.0.tgz", ++ "integrity": "sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==", + "dev": true, +- "dependencies": { +- "postcss-scss": "^4.0.6", +- "stylelint-config-recommended": "^12.0.0", +- "stylelint-scss": "^5.0.0" +- }, +- "peerDependencies": { +- "postcss": "^8.3.3", +- "stylelint": "^15.5.0" +- }, +- "peerDependenciesMeta": { +- "postcss": { +- "optional": true +- } ++ "requires": { ++ "postcss-scss": "^4.0.9", ++ "stylelint-config-recommended": "^14.0.0", ++ "stylelint-scss": "^6.0.0" + } + }, +- "node_modules/stylelint-config-standard": { +- "version": "33.0.0", +- "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-33.0.0.tgz", +- "integrity": "sha512-eyxnLWoXImUn77+ODIuW9qXBDNM+ALN68L3wT1lN2oNspZ7D9NVGlNHb2QCUn4xDug6VZLsh0tF8NyoYzkgTzg==", ++ "stylelint-config-standard": { ++ "version": "36.0.1", ++ "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz", ++ "integrity": "sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==", + "dev": true, +- "dependencies": { +- "stylelint-config-recommended": "^12.0.0" +- }, +- "peerDependencies": { +- "stylelint": "^15.5.0" ++ "requires": { ++ "stylelint-config-recommended": "^14.0.1" + } + }, +- "node_modules/stylelint-config-standard-scss": { +- "version": "10.0.0", +- "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-10.0.0.tgz", +- "integrity": "sha512-bChBEo1p3xUVWh/wenJI+josoMk21f2yuLDGzGjmKYcALfl2u3DFltY+n4UHswYiXghqXaA8mRh+bFy/q1hQlg==", ++ "stylelint-config-standard-scss": { ++ "version": "13.1.0", ++ "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-13.1.0.tgz", ++ "integrity": "sha512-Eo5w7/XvwGHWkeGLtdm2FZLOMYoZl1omP2/jgFCXyl2x5yNz7/8vv4Tj6slHvMSSUNTaGoam/GAZ0ZhukvalfA==", + "dev": true, +- "dependencies": { +- "stylelint-config-recommended-scss": "^12.0.0", +- "stylelint-config-standard": "^33.0.0" +- }, +- "peerDependencies": { +- "postcss": "^8.3.3", +- "stylelint": "^15.5.0" +- }, +- "peerDependenciesMeta": { +- "postcss": { +- "optional": true +- } ++ "requires": { ++ "stylelint-config-recommended-scss": "^14.0.0", ++ "stylelint-config-standard": "^36.0.0" + } + }, +- "node_modules/stylelint-formatter-pretty": { +- "version": "3.2.0", +- "resolved": "https://registry.npmjs.org/stylelint-formatter-pretty/-/stylelint-formatter-pretty-3.2.0.tgz", +- "integrity": "sha512-qUGdmJIKFcNamAgkf/I0NraOxlLqclSoAmBameWNR5EsOvm0Kwy2iMYi5z9hbQhFaCZ+TWSbwHmkB6XNbJWrQw==", ++ "stylelint-formatter-pretty": { ++ "version": "4.0.1", ++ "resolved": "https://registry.npmjs.org/stylelint-formatter-pretty/-/stylelint-formatter-pretty-4.0.1.tgz", ++ "integrity": "sha512-39nasPN8QNdMBq2eghI/SwpyVKx8kJGtmE/KJ5oFvCg0ZvZ5qjJbQgEulzC0gT70XZ+iRk7p1W5tE9IBQhFjPw==", + "dev": true, +- "funding": [ +- { +- "type": "kofi", +- "url": "https://ko-fi.com/mrcgrtz" +- }, +- { +- "type": "liberapay", +- "url": "https://liberapay.com/mrcgrtz/" +- } +- ], +- "dependencies": { +- "ansi-escapes": "~4.3.2", +- "log-symbols": "~4.1.0", ++ "requires": { ++ "ansi-escapes": "^7.0.0", ++ "log-symbols": "^7.0.0", + "picocolors": "^1.0.0", +- "plur": "~4.0.0", +- "string-width": "~4.2.2", ++ "plur": "^5.1.0", ++ "string-width": "^7.0.0", + "supports-hyperlinks": "^3.0.0" + }, +- "engines": { +- "node": ">=14" ++ "dependencies": { ++ "ansi-regex": { ++ "version": "6.1.0", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", ++ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", ++ "dev": true ++ }, ++ "emoji-regex": { ++ "version": "10.4.0", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", ++ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", ++ "dev": true ++ }, ++ "string-width": { ++ "version": "7.2.0", ++ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", ++ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", ++ "dev": true, ++ "requires": { ++ "emoji-regex": "^10.3.0", ++ "get-east-asian-width": "^1.0.0", ++ "strip-ansi": "^7.1.0" ++ } ++ }, ++ "strip-ansi": { ++ "version": "7.1.0", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", ++ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", ++ "dev": true, ++ "requires": { ++ "ansi-regex": "^6.0.1" ++ } ++ } + } + }, +- "node_modules/stylelint-scss": { +- "version": "5.0.1", +- "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.0.1.tgz", +- "integrity": "sha512-n87iCRZrr2J7//I/QFsDXxFLnHKw633U4qvWZ+mOW6KDAp/HLj06H+6+f9zOuTYy+MdGdTuCSDROCpQIhw5fvQ==", ++ "stylelint-scss": { ++ "version": "6.11.0", ++ "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.11.0.tgz", ++ "integrity": "sha512-AvJ6LVzz2iXHxPlPTR9WVy73FC/vmohH54VySNlCKX1NIXNAeuzy/VbIkMJLMyw/xKYqkgY4kAgB+qy5BfCaCg==", + "dev": true, +- "dependencies": { ++ "requires": { ++ "css-tree": "^3.0.1", ++ "is-plain-object": "^5.0.0", ++ "known-css-properties": "^0.35.0", ++ "mdn-data": "^2.15.0", + "postcss-media-query-parser": "^0.2.3", +- "postcss-resolve-nested-selector": "^0.1.1", +- "postcss-selector-parser": "^6.0.13", ++ "postcss-resolve-nested-selector": "^0.1.6", ++ "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, +- "peerDependencies": { +- "stylelint": "^14.5.1 || ^15.0.0" +- } +- }, +- "node_modules/stylelint/node_modules/balanced-match": { +- "version": "2.0.0", +- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", +- "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", +- "dev": true +- }, +- "node_modules/stylelint/node_modules/resolve-from": { +- "version": "5.0.0", +- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", +- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", +- "dev": true, +- "engines": { +- "node": ">=8" +- } +- }, +- "node_modules/supports-color": { +- "version": "5.5.0", +- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", +- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", +- "dev": true, +- "dependencies": { +- "has-flag": "^3.0.0" +- }, +- "engines": { +- "node": ">=4" +- } +- }, +- "node_modules/supports-hyperlinks": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", +- "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", +- "dev": true, + "dependencies": { +- "has-flag": "^4.0.0", +- "supports-color": "^7.0.0" +- }, +- "engines": { +- "node": ">=14.18" ++ "css-tree": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", ++ "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", ++ "dev": true, ++ "requires": { ++ "mdn-data": "2.12.2", ++ "source-map-js": "^1.0.1" ++ }, ++ "dependencies": { ++ "mdn-data": { ++ "version": "2.12.2", ++ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", ++ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", ++ "dev": true ++ } ++ } ++ }, ++ "known-css-properties": { ++ "version": "0.35.0", ++ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", ++ "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", ++ "dev": true ++ }, ++ "mdn-data": { ++ "version": "2.15.0", ++ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.15.0.tgz", ++ "integrity": "sha512-KIrS0lFPOqA4DgeO16vI5fkAsy8p++WBlbXtB5P1EQs8ubBgguAInNd1DnrCeTRfGchY0kgThgDOOIPyOLH2dQ==", ++ "dev": true ++ }, ++ "postcss-selector-parser": { ++ "version": "7.0.0", ++ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", ++ "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", ++ "dev": true, ++ "requires": { ++ "cssesc": "^3.0.0", ++ "util-deprecate": "^1.0.2" ++ } ++ } + } + }, +- "node_modules/supports-hyperlinks/node_modules/has-flag": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", +- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", ++ "stylelint-use-logical-spec": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/stylelint-use-logical-spec/-/stylelint-use-logical-spec-5.0.1.tgz", ++ "integrity": "sha512-UfLB4LW6iG4r3cXxjxkiHQrFyhWFqt8FpNNngD+TyvgMWSokk5TYwTvBHS3atUvZhOogllTOe/PUrGE+4z84AA==", + "dev": true, +- "engines": { +- "node": ">=8" +- } ++ "requires": {} + }, +- "node_modules/supports-hyperlinks/node_modules/supports-color": { ++ "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, +- "dependencies": { ++ "requires": { + "has-flag": "^4.0.0" +- }, +- "engines": { +- "node": ">=8" + } + }, +- "node_modules/supports-preserve-symlinks-flag": { ++ "supports-hyperlinks": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", ++ "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", ++ "dev": true, ++ "requires": { ++ "has-flag": "^4.0.0", ++ "supports-color": "^7.0.0" ++ } ++ }, ++ "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", +- "dev": true, +- "engines": { +- "node": ">= 0.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" +- } ++ "dev": true + }, +- "node_modules/svg-tags": { ++ "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, +- "node_modules/tabbable": { +- "version": "5.3.3", +- "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", +- "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==" ++ "sync-child-process": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", ++ "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", ++ "dev": true, ++ "peer": true, ++ "requires": { ++ "sync-message-port": "^1.0.0" ++ } + }, +- "node_modules/table": { +- "version": "6.8.1", +- "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", +- "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", ++ "sync-message-port": { ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", ++ "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", + "dev": true, +- "dependencies": { ++ "peer": true ++ }, ++ "tabbable": { ++ "version": "6.2.0", ++ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", ++ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" ++ }, ++ "table": { ++ "version": "6.9.0", ++ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", ++ "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", ++ "dev": true, ++ "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, +- "engines": { +- "node": ">=10.0.0" +- } +- }, +- "node_modules/table/node_modules/ajv": { +- "version": "8.12.0", +- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", +- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", +- "dev": true, + "dependencies": { +- "fast-deep-equal": "^3.1.1", +- "json-schema-traverse": "^1.0.0", +- "require-from-string": "^2.0.2", +- "uri-js": "^4.2.2" +- }, +- "funding": { +- "type": "github", +- "url": "https://github.com/sponsors/epoberezkin" ++ "ajv": { ++ "version": "8.17.1", ++ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", ++ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", ++ "dev": true, ++ "requires": { ++ "fast-deep-equal": "^3.1.3", ++ "fast-uri": "^3.0.1", ++ "json-schema-traverse": "^1.0.0", ++ "require-from-string": "^2.0.2" ++ } ++ }, ++ "emoji-regex": { ++ "version": "8.0.0", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", ++ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", ++ "dev": true ++ }, ++ "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 ++ }, ++ "string-width": { ++ "version": "4.2.3", ++ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", ++ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", ++ "dev": true, ++ "requires": { ++ "emoji-regex": "^8.0.0", ++ "is-fullwidth-code-point": "^3.0.0", ++ "strip-ansi": "^6.0.1" ++ } ++ } + } + }, +- "node_modules/table/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/text-table": { ++ "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, +- "node_modules/tiny-glob": { ++ "throttle-debounce": { ++ "version": "5.0.2", ++ "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", ++ "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==" ++ }, ++ "tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, +- "dependencies": { ++ "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, +- "node_modules/tippy.js": { +- "version": "5.1.2", +- "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-5.1.2.tgz", +- "integrity": "sha512-Qtrv2wqbRbaKMUb6bWWBQWPayvcDKNrGlvihxtsyowhT7RLGEh1STWuy6EMXC6QLkfKPB2MLnf8W2mzql9VDAw==", +- "dependencies": { +- "popper.js": "^1.16.0" +- } +- }, +- "node_modules/to-fast-properties": { +- "version": "2.0.0", +- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", +- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", +- "dev": true, +- "peer": true, +- "engines": { +- "node": ">=4" +- } +- }, +- "node_modules/to-regex-range": { ++ "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, +- "dependencies": { ++ "requires": { + "is-number": "^7.0.0" +- }, +- "engines": { +- "node": ">=8.0" + } + }, +- "node_modules/trim-newlines": { +- "version": "4.1.1", +- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", +- "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", ++ "ts-api-utils": { ++ "version": "1.4.3", ++ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", ++ "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, +- "engines": { +- "node": ">=12" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" +- } ++ "requires": {} + }, +- "node_modules/tsconfig-paths": { +- "version": "3.14.2", +- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", +- "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", ++ "tsconfig-paths": { ++ "version": "3.15.0", ++ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", ++ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, +- "dependencies": { ++ "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, +- "node_modules/tsconfig-paths/node_modules/json5": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", +- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", +- "dev": true, +- "dependencies": { +- "minimist": "^1.2.0" +- }, +- "bin": { +- "json5": "lib/cli.js" +- } +- }, +- "node_modules/tslib": { +- "version": "2.5.3", +- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", +- "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" ++ "tslib": { ++ "version": "2.8.1", ++ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", ++ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, +- "node_modules/type-check": { ++ "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, +- "dependencies": { ++ "requires": { + "prelude-ls": "^1.2.1" +- }, +- "engines": { +- "node": ">= 0.8.0" + } + }, +- "node_modules/type-fest": { +- "version": "1.4.0", +- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", +- "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", ++ "type-fest": { ++ "version": "0.20.2", ++ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", ++ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", ++ "dev": true ++ }, ++ "typed-array-buffer": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", ++ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "requires": { ++ "call-bound": "^1.0.3", ++ "es-errors": "^1.3.0", ++ "is-typed-array": "^1.1.14" + } + }, +- "node_modules/typed-array-length": { +- "version": "1.0.4", +- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", +- "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", ++ "typed-array-byte-length": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", ++ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, +- "dependencies": { +- "call-bind": "^1.0.2", ++ "requires": { ++ "call-bind": "^1.0.8", + "for-each": "^0.3.3", +- "is-typed-array": "^1.1.9" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "gopd": "^1.2.0", ++ "has-proto": "^1.2.0", ++ "is-typed-array": "^1.1.14" + } + }, +- "node_modules/unbox-primitive": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", +- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", ++ "typed-array-byte-offset": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", ++ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, +- "dependencies": { +- "call-bind": "^1.0.2", +- "has-bigints": "^1.0.2", +- "has-symbols": "^1.0.3", +- "which-boxed-primitive": "^1.0.2" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "requires": { ++ "available-typed-arrays": "^1.0.7", ++ "call-bind": "^1.0.8", ++ "for-each": "^0.3.3", ++ "gopd": "^1.2.0", ++ "has-proto": "^1.2.0", ++ "is-typed-array": "^1.1.15", ++ "reflect.getprototypeof": "^1.0.9" + } + }, +- "node_modules/universalify": { +- "version": "2.0.0", +- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", +- "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", +- "dev": true, +- "engines": { +- "node": ">= 10.0.0" ++ "typed-array-length": { ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", ++ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", ++ "dev": true, ++ "requires": { ++ "call-bind": "^1.0.7", ++ "for-each": "^0.3.3", ++ "gopd": "^1.0.1", ++ "is-typed-array": "^1.1.13", ++ "possible-typed-array-names": "^1.0.0", ++ "reflect.getprototypeof": "^1.0.6" + } + }, +- "node_modules/update-browserslist-db": { +- "version": "1.0.11", +- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", +- "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", ++ "typescript": { ++ "version": "5.7.3", ++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", ++ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", ++ "dev": true ++ }, ++ "unbox-primitive": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", ++ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, +- "funding": [ +- { +- "type": "opencollective", +- "url": "https://opencollective.com/browserslist" +- }, +- { +- "type": "tidelift", +- "url": "https://tidelift.com/funding/github/npm/browserslist" +- }, +- { +- "type": "github", +- "url": "https://github.com/sponsors/ai" +- } +- ], +- "peer": true, +- "dependencies": { +- "escalade": "^3.1.1", +- "picocolors": "^1.0.0" +- }, +- "bin": { +- "update-browserslist-db": "cli.js" +- }, +- "peerDependencies": { +- "browserslist": ">= 4.21.0" ++ "requires": { ++ "call-bound": "^1.0.3", ++ "has-bigints": "^1.0.2", ++ "has-symbols": "^1.1.0", ++ "which-boxed-primitive": "^1.1.1" + } + }, +- "node_modules/uri-js": { ++ "universalify": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", ++ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", ++ "dev": true ++ }, ++ "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, +- "dependencies": { ++ "requires": { + "punycode": "^2.1.0" + } + }, +- "node_modules/util-deprecate": { ++ "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", +- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", +- "dev": true ++ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, +- "node_modules/validate-npm-package-license": { +- "version": "3.0.4", +- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", +- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", ++ "uuid": { ++ "version": "10.0.0", ++ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", ++ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==" ++ }, ++ "varint": { ++ "version": "6.0.0", ++ "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", ++ "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, +- "dependencies": { +- "spdx-correct": "^3.0.0", +- "spdx-expression-parse": "^3.0.0" ++ "peer": true ++ }, ++ "victory-area": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-37.3.6.tgz", ++ "integrity": "sha512-wVC8LKrZJLiSySNuJLRCB449qZTsPiRyzLlNoJwe21y+XA/a2HJbmJSeywmo8P153aX8viKe1H8ygDsTFXQhHw==", ++ "requires": { ++ "lodash": "^4.17.19", ++ "victory-core": "37.3.6", ++ "victory-vendor": "37.3.6" + } + }, +- "node_modules/victory-area": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-36.6.10.tgz", +- "integrity": "sha512-4SRXvxupIe04SMKD8DSbh5ns0/bVw20Ylp4bDXXHgAIo47iu+NmqNxnZ2CKDJ7vxN0nWPy0piQ5jO1ubhTGFIg==", +- "dependencies": { ++ "victory-axis": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-37.3.6.tgz", ++ "integrity": "sha512-Vi0dZvgmXmnCdoqc49WckeG5cMXnl7FTtqVhXu9JweA9cgCnkZabBd5mRvAjblb3Lo4j0HZCSPKHYWUPW70qZg==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", +- "victory-core": "^36.6.10", +- "victory-vendor": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6" + } + }, +- "node_modules/victory-axis": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-36.6.10.tgz", +- "integrity": "sha512-QsJrETq7mcM5AVBIPx7b31cwv901YaLGRHFWCIUGJgnKmaXdgBEl8cS9+VPrPnhhWhLeau2/LM5dENl1QwK2TQ==", +- "dependencies": { ++ "victory-bar": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-37.3.6.tgz", ++ "integrity": "sha512-jdATFRWL1LUW/yEpKWx/aId2BiU2o1pPF9+Kh1TFISBduJoI4ZqvZD90H1QK4f/z50PikqiqiDECaKoKM1jfOQ==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", +- "victory-core": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6", ++ "victory-vendor": "37.3.6" + } + }, +- "node_modules/victory-bar": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-36.6.10.tgz", +- "integrity": "sha512-3kmFa3ZEKEx968xrobWzpPebwoDxya3Xqox088NFCopLQ24FoEPLZQboJJY5PM51gyT5GdU+rAqtFc2TG1bL/Q==", +- "dependencies": { ++ "victory-box-plot": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-37.3.6.tgz", ++ "integrity": "sha512-GOucnD63h14ScBuISC/nd1GBTEx6gIZfLE+0P0gyeH1poBKq0trTTvpQDvAMuGR8zICfEETG3ltmUMCwRrFyUg==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", +- "victory-core": "^36.6.10", +- "victory-vendor": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6", ++ "victory-vendor": "37.3.6" + } + }, +- "node_modules/victory-brush-container": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-36.6.10.tgz", +- "integrity": "sha512-iDqdMm1C2uVkRRdWQMzDR0lRCK9icEjCCVHbPVxOUqThc/wiBK3GJNq4EL2lhX1F5ONxiwHzZuzK2C59fDMbAA==", +- "dependencies": { ++ "victory-brush-container": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-37.3.6.tgz", ++ "integrity": "sha512-LfZ2CgX1cYAqCtYxcSB68OfZS2v0T2VLXoEArd0lCXfRBY1Gya7GacCUcuo7GoK9XOXeslx7S/U95aVutt1VLg==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", +- "victory-core": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6" + } + }, +- "node_modules/victory-chart": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-36.6.10.tgz", +- "integrity": "sha512-W1yAYX16nASA8xllGkO6VvUAAGe9BehQ+558fhXeznIX+P4yXJ2v8CJG7NXD+bdh+Xwoft6GWouwp2ycANBKyw==", +- "dependencies": { ++ "victory-chart": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-37.3.6.tgz", ++ "integrity": "sha512-IkPo/W4AJ7bPu902TGER09OseR9ODm+FQAKfOBw4JsdEhZZ7BiG9zgd/25+x0r5EsTLu81CYGQVkBa+ZazcOlA==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", +- "victory-axis": "^36.6.10", +- "victory-core": "^36.6.10", +- "victory-polar-axis": "^36.6.10", +- "victory-shared-events": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-axis": "37.3.6", ++ "victory-core": "37.3.6", ++ "victory-polar-axis": "37.3.6", ++ "victory-shared-events": "37.3.6" + } + }, +- "node_modules/victory-core": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.6.10.tgz", +- "integrity": "sha512-rXZh6Lm/ex/2pjQQr9kfmS1ebdpO/mYvHup1gFEqzpkTgVXag6QWV8PcZkEK07x9owcfnvgBlfJvYCE6h9NpcA==", +- "dependencies": { ++ "victory-core": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.3.6.tgz", ++ "integrity": "sha512-aFgO6KokxPbUCPznZP5UPhOdI22pMuwDXKDt6eoQOnkVim66Ia+K95TQar2nwVKGYV5j26aKVf/n9blwphGJRw==", ++ "requires": { + "lodash": "^4.17.21", +- "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", +- "victory-vendor": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-vendor": "37.3.6" + } + }, +- "node_modules/victory-create-container": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-36.6.10.tgz", +- "integrity": "sha512-gIGWWNpbRbBtEJWsFpABDkZuuTe5SjhynWe2GaLLl2Hi2cYWoo/WWMef09ChfnuLOXodc0MG149KAle5j6Cq7Q==", +- "dependencies": { ++ "victory-create-container": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-37.3.6.tgz", ++ "integrity": "sha512-Uf5bFQvqUsXCjqpvBW4LhrdrHkM6dBqxYgub6FCsBb86f84xZQ3vY7jFkg/JfvF0oGKMoWXYYrYLC1sk+fcWVA==", ++ "requires": { + "lodash": "^4.17.19", +- "victory-brush-container": "^36.6.10", +- "victory-core": "^36.6.10", +- "victory-cursor-container": "^36.6.10", +- "victory-selection-container": "^36.6.10", +- "victory-voronoi-container": "^36.6.10", +- "victory-zoom-container": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" +- } +- }, +- "node_modules/victory-cursor-container": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-36.6.10.tgz", +- "integrity": "sha512-o7zc5NObAwYqD51/9GYf+jD7tQtcXdmknKdYwxcN3uCLL/MQ2R1Ql3FdCyK+GjIlim6UXukJeWWhCelApEIOIQ==", +- "dependencies": { ++ "victory-brush-container": "37.3.6", ++ "victory-core": "37.3.6", ++ "victory-cursor-container": "37.3.6", ++ "victory-selection-container": "37.3.6", ++ "victory-voronoi-container": "37.3.6", ++ "victory-zoom-container": "37.3.6" ++ } ++ }, ++ "victory-cursor-container": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-37.3.6.tgz", ++ "integrity": "sha512-+Oiw57d5nE+iq8As8RvepknzmNtKq1Gsc50u1X3IRd4jXtX8zqZrgXGlVZ+BP/tkLsWnGYVjKulwKBf2oaEUuw==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", +- "victory-core": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6" + } + }, +- "node_modules/victory-group": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-36.6.10.tgz", +- "integrity": "sha512-Dt25PXQBuJaa5yR1/ke0MTgzYZ/yQMGyGWVwN1buPIEQ3h7E3tqTVcB5oNXLiQ80MMip3U3i/yj3oASuicIyQw==", +- "dependencies": { ++ "victory-group": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-37.3.6.tgz", ++ "integrity": "sha512-kgy/Azl5BxwlJAV0KDPGypv35TMrOD1J2ZxnJW2Wyyq+e8i0GGBIv5MoBzou64BRsDlS9V0CYRIjnkHgrBpB5w==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", +- "victory-core": "^36.6.10", +- "victory-shared-events": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6", ++ "victory-shared-events": "37.3.6" + } + }, +- "node_modules/victory-legend": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-36.6.10.tgz", +- "integrity": "sha512-+pKrkBBzcf1TxiwUsWlV6Vti+HRDvF4GUa15LTszt+J6LOoJIEFM7iNS2EuWBJRM30xkJKogDjn9NhngqRa/Aw==", +- "dependencies": { ++ "victory-legend": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-37.3.6.tgz", ++ "integrity": "sha512-vRRrhj3/ENqKVLdaBMzEmR83N6BOjox1bthYT1eJjN2H5SIK35bxn30IkiV/Pz3y627EqZe4TAWaxc0jiJlCiA==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", +- "victory-core": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6" + } + }, +- "node_modules/victory-line": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-36.6.10.tgz", +- "integrity": "sha512-hS7CC5AgD9hkzu9F/b01j+q9UJk2SErcVrU8EP2SEv92M2ISH2dbFoLL/mioAPPUkSBh03o/9DDCMu7YeiZspw==", +- "dependencies": { ++ "victory-line": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-37.3.6.tgz", ++ "integrity": "sha512-Ke817uf/qFbN9jU7Dba7CrcHXYO5wAZuKKnyeHJmLDeQeFST0773xejnIuC+dBgZipjFr4KIbSd+VcUafFNE1g==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", +- "victory-core": "^36.6.10", +- "victory-vendor": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6", ++ "victory-vendor": "37.3.6" + } + }, +- "node_modules/victory-pie": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-36.6.10.tgz", +- "integrity": "sha512-ZgNBS3TNs89kjLe05IGjYDN0GK2wf0DfZFUcXdopL/EosdhKyWAVI7txJ8cUUH1Nex8UGLuI8rfuY4wWPe7rkw==", +- "dependencies": { ++ "victory-pie": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-37.3.6.tgz", ++ "integrity": "sha512-tvdgAZ/HQWlo3KDDe0XAVbizHuaNMbgkkiF7zfA7Ww+3bHSs+0P9dsDtK2xP365D8gBCOv8pWmuzvKRhzNbqeA==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", +- "victory-core": "^36.6.10", +- "victory-vendor": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6", ++ "victory-vendor": "37.3.6" + } + }, +- "node_modules/victory-polar-axis": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-36.6.10.tgz", +- "integrity": "sha512-fZt+Ww9nizkfhlqH/XvdSCiTyFcmprLl1vlPxQAHNmiLFYxDT9fmJYmcMKD/idLzVkK1HjLpHE2/jB+u4dGgmw==", +- "dependencies": { ++ "victory-polar-axis": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-37.3.6.tgz", ++ "integrity": "sha512-RpFsCkzHezJq5P+C/wtVdjEHX25JIFsSgs6qYSnfr/hayaFbWgK5HhRFpriQm5hg61cx47WxAOLyHvzf0nasvw==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", +- "victory-core": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6" + } + }, +- "node_modules/victory-scatter": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-36.6.10.tgz", +- "integrity": "sha512-gRTPkJzTluqFBBvEu3cetP/riKRHVkcO5xiK5mQ/6Rwg8iqQbsIE+QmGSngPAd9emYjy1qIWebPy92QN5/j/5A==", +- "dependencies": { ++ "victory-scatter": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-37.3.6.tgz", ++ "integrity": "sha512-fp95zMTPXgW1cmTowzDXhn+KxePMVDrzU0lotsHQMdBV7eB+ioXdu9hORlx4VHmMYg2ihsGwRTF+VAZ7rGxphA==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", +- "victory-core": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6" + } + }, +- "node_modules/victory-selection-container": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-36.6.10.tgz", +- "integrity": "sha512-jk7kqDepkTdML6NiOAz6ZQdhShm0MH4rO1lLnakA/2VYb7FpWtEYUNWs+v+OMaqzT067d3gzEqgQ5FljttuJDA==", +- "dependencies": { ++ "victory-selection-container": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-37.3.6.tgz", ++ "integrity": "sha512-gd3qODDlBtLEJM7+2jCXk2YcLBUmIpYEEHswytMhwc6zihxXipGBUHRulhLj/I05mKay2gaOAg5ewiJHd4Awgw==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", +- "victory-core": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6" + } + }, +- "node_modules/victory-shared-events": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-36.6.10.tgz", +- "integrity": "sha512-WPz0Xkz0EChnajm5qYACcFfStxnr7C885XDw8d7fpeJV+oMfdtdMRUKLtY7HatyIVn15dJhmx5jkLEiNveUnug==", +- "dependencies": { ++ "victory-shared-events": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-37.3.6.tgz", ++ "integrity": "sha512-ygrbOtzLUTbtKebacZKyQRekhSAROnAvMkVI/PKsAGsz0ClY9P7qDEJG7eTUUygjO6ax0tI6WNE6JogQzeD1gw==", ++ "requires": { + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", +- "victory-core": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6" + } + }, +- "node_modules/victory-stack": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-36.6.10.tgz", +- "integrity": "sha512-NPvpHFbR9E4z5HlDs0ERVsd0CPRBcsaParKaddG/te1U1eArEKOUxIoseT3J/Q22eaZoXI0x4E5zvqMddFNjCA==", +- "dependencies": { ++ "victory-stack": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-37.3.6.tgz", ++ "integrity": "sha512-ldod04RdqGJGH5p5eWXCofdTkbhZqIp3iwW7NpxSbMDLs8zPQIVvDFVtuJgMwQiC5vnIpbhMmxVeFbr8m64ZKA==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", +- "victory-core": "^36.6.10", +- "victory-shared-events": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6", ++ "victory-shared-events": "37.3.6" + } + }, +- "node_modules/victory-tooltip": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-36.6.10.tgz", +- "integrity": "sha512-if1pSHJQCScPFThhz7qChYqGScRn0rbAm1Vis/ceRuTRryza4a/pOoYL0unQCZSV6q/pd0WYz7P2Pc4STNpS/Q==", +- "dependencies": { ++ "victory-tooltip": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-37.3.6.tgz", ++ "integrity": "sha512-vqaJS9noauOqDDBBAV9Ln9duOY/i17h1DCfCPAqhwPFyvFbwKvAub9zPTeYWAm/14VvWX5O/0yekFCVbcC7hjg==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", +- "victory-core": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6" + } + }, +- "node_modules/victory-vendor": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.10.tgz", +- "integrity": "sha512-7YqYGtsA4mByokBhCjk+ewwPhUfzhR1I3Da6/ZsZUv/31ceT77RKoaqrxRq5Ki+9we4uzf7+A+7aG2sfYhm7nA==", +- "dependencies": { ++ "victory-vendor": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", ++ "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", ++ "requires": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", +@@ -6485,161 +13870,200 @@ + "d3-timer": "^3.0.1" + } + }, +- "node_modules/victory-voronoi-container": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-36.6.10.tgz", +- "integrity": "sha512-uAMr5SYg2RQE7nN6i0/v40QX/+9GdsnoEXy7qldONp+7O/YaeIHF5s5Tgw4hi3NT5Ge0TzhyHm8tBna2KDK+lg==", +- "dependencies": { ++ "victory-voronoi-container": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-37.3.6.tgz", ++ "integrity": "sha512-qAAG0rMuK7A4EoJ4cyUk5wNdOW+HuCXNKPOko+hYK6wWOYXJvFhiglYyA85a695YyAXECc6JyJS/crm4IOEFag==", ++ "requires": { + "delaunay-find": "0.0.6", + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", +- "victory-core": "^36.6.10", +- "victory-tooltip": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" ++ "victory-core": "37.3.6", ++ "victory-tooltip": "37.3.6" + } + }, +- "node_modules/victory-zoom-container": { +- "version": "36.6.10", +- "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-36.6.10.tgz", +- "integrity": "sha512-PwVBFhVsRBSSbq+UUqDS/udlwIahn8NOBeRSeDhKErFR5+3zNUdS9P2nUnqb2yJHXSzFMM2/slMAdPOAyzEG4g==", +- "dependencies": { ++ "victory-zoom-container": { ++ "version": "37.3.6", ++ "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-37.3.6.tgz", ++ "integrity": "sha512-AGL+k20mI44OL5b0VgIxlmnNSefIoFmbbim5NraPmIxbtns9qQW/56ivIncJcYomBungIx99gUpsEpcQaMNHgQ==", ++ "requires": { + "lodash": "^4.17.19", +- "prop-types": "^15.8.1", +- "victory-core": "^36.6.10" +- }, +- "peerDependencies": { +- "react": ">=16.6.0" +- } +- }, +- "node_modules/warning": { +- "version": "4.0.3", +- "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", +- "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", +- "dependencies": { +- "loose-envify": "^1.0.0" ++ "victory-core": "37.3.6" + } + }, +- "node_modules/which": { ++ "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, +- "dependencies": { ++ "requires": { + "isexe": "^2.0.0" +- }, +- "bin": { +- "node-which": "bin/node-which" +- }, +- "engines": { +- "node": ">= 8" + } + }, +- "node_modules/which-boxed-primitive": { ++ "which-boxed-primitive": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", ++ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", ++ "dev": true, ++ "requires": { ++ "is-bigint": "^1.1.0", ++ "is-boolean-object": "^1.2.1", ++ "is-number-object": "^1.1.1", ++ "is-string": "^1.1.1", ++ "is-symbol": "^1.1.1" ++ } ++ }, ++ "which-builtin-type": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", ++ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", ++ "dev": true, ++ "requires": { ++ "call-bound": "^1.0.2", ++ "function.prototype.name": "^1.1.6", ++ "has-tostringtag": "^1.0.2", ++ "is-async-function": "^2.0.0", ++ "is-date-object": "^1.1.0", ++ "is-finalizationregistry": "^1.1.0", ++ "is-generator-function": "^1.0.10", ++ "is-regex": "^1.2.1", ++ "is-weakref": "^1.0.2", ++ "isarray": "^2.0.5", ++ "which-boxed-primitive": "^1.1.0", ++ "which-collection": "^1.0.2", ++ "which-typed-array": "^1.1.16" ++ } ++ }, ++ "which-collection": { + "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", +- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", ++ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", ++ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, +- "dependencies": { +- "is-bigint": "^1.0.1", +- "is-boolean-object": "^1.1.0", +- "is-number-object": "^1.0.4", +- "is-string": "^1.0.5", +- "is-symbol": "^1.0.3" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "requires": { ++ "is-map": "^2.0.3", ++ "is-set": "^2.0.3", ++ "is-weakmap": "^2.0.2", ++ "is-weakset": "^2.0.3" + } + }, +- "node_modules/which-typed-array": { +- "version": "1.1.9", +- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", +- "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", ++ "which-typed-array": { ++ "version": "1.1.18", ++ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", ++ "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dev": true, +- "dependencies": { +- "available-typed-arrays": "^1.0.5", +- "call-bind": "^1.0.2", ++ "requires": { ++ "available-typed-arrays": "^1.0.7", ++ "call-bind": "^1.0.8", ++ "call-bound": "^1.0.3", + "for-each": "^0.3.3", +- "gopd": "^1.0.1", +- "has-tostringtag": "^1.0.0", +- "is-typed-array": "^1.1.10" ++ "gopd": "^1.2.0", ++ "has-tostringtag": "^1.0.2" ++ } ++ }, ++ "word-wrap": { ++ "version": "1.2.5", ++ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", ++ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", ++ "dev": true ++ }, ++ "wrap-ansi": { ++ "version": "8.1.0", ++ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", ++ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", ++ "dev": true, ++ "requires": { ++ "ansi-styles": "^6.1.0", ++ "string-width": "^5.0.1", ++ "strip-ansi": "^7.0.1" + }, +- "engines": { +- "node": ">= 0.4" ++ "dependencies": { ++ "ansi-regex": { ++ "version": "6.1.0", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", ++ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", ++ "dev": true ++ }, ++ "ansi-styles": { ++ "version": "6.2.1", ++ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", ++ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", ++ "dev": true ++ }, ++ "strip-ansi": { ++ "version": "7.1.0", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", ++ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", ++ "dev": true, ++ "requires": { ++ "ansi-regex": "^6.0.1" ++ } ++ } ++ } ++ }, ++ "wrap-ansi-cjs": { ++ "version": "npm:wrap-ansi@7.0.0", ++ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", ++ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", ++ "dev": true, ++ "requires": { ++ "ansi-styles": "^4.0.0", ++ "string-width": "^4.1.0", ++ "strip-ansi": "^6.0.0" + }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" ++ "dependencies": { ++ "emoji-regex": { ++ "version": "8.0.0", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", ++ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", ++ "dev": true ++ }, ++ "string-width": { ++ "version": "4.2.3", ++ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", ++ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", ++ "dev": true, ++ "requires": { ++ "emoji-regex": "^8.0.0", ++ "is-fullwidth-code-point": "^3.0.0", ++ "strip-ansi": "^6.0.1" ++ } ++ } + } + }, +- "node_modules/wrappy": { ++ "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, +- "node_modules/write-file-atomic": { ++ "write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, +- "dependencies": { ++ "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" +- }, +- "engines": { +- "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, +- "node_modules/ws": { ++ "ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, +- "engines": { +- "node": ">=8.3.0" +- }, +- "peerDependencies": { +- "bufferutil": "^4.0.1", +- "utf-8-validate": "^5.0.2" +- }, +- "peerDependenciesMeta": { +- "bufferutil": { +- "optional": true +- }, +- "utf-8-validate": { +- "optional": true +- } +- } +- }, +- "node_modules/yallist": { +- "version": "3.1.1", +- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", +- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", +- "dev": true, +- "peer": true +- }, +- "node_modules/yargs-parser": { +- "version": "20.2.9", +- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", +- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", +- "dev": true, +- "engines": { +- "node": ">=10" +- } ++ "requires": {} + }, +- "node_modules/yocto-queue": { ++ "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", +- "dev": true, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" +- } ++ "dev": true ++ }, ++ "yoctocolors": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", ++ "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", ++ "dev": true + } + } + } +diff --git a/src/cockpit/389-console/package.json b/src/cockpit/389-console/package.json +index a4f09a777..0680f26f2 100644 +--- a/src/cockpit/389-console/package.json ++++ b/src/cockpit/389-console/package.json +@@ -19,48 +19,67 @@ + "stylelint:fix": "stylelint --fix src/*{.css,scss}" + }, + "devDependencies": { +- "argparse": "^2.0.1", ++ "@types/qunit": "^2.19.10", ++ "@types/react": "18.3.11", ++ "@types/react-dom": "18.3.0", ++ "@typescript-eslint/eslint-plugin": "8.8.0", ++ "argparse": "2.0.1", + "chrome-remote-interface": "^0.32.1", +- "esbuild": "^0.17.15", +- "esbuild-plugin-copy": "^2.1.1", +- "esbuild-plugin-replace": "^1.3.0", +- "esbuild-sass-plugin": "^2.8.0", +- "esbuild-wasm": "^0.17.16", +- "eslint": "^8.13.0", +- "eslint-config-standard": "^17.0.0-1", +- "eslint-config-standard-jsx": "^11.0.0-1", +- "eslint-config-standard-react": "^13.0.0", +- "eslint-plugin-flowtype": "^8.0.3", +- "eslint-plugin-import": "^2.26.0", +- "eslint-plugin-node": "^11.1.0", +- "eslint-plugin-promise": "^6.0.0", +- "eslint-plugin-react": "^7.29.4", +- "eslint-plugin-react-hooks": "^4.4.0", +- "htmlparser": "^1.7.7", +- "jed": "^1.1.1", ++ "esbuild": "0.24.0", ++ "esbuild-plugin-copy": "2.1.1", ++ "esbuild-plugin-replace": "1.4.0", ++ "esbuild-sass-plugin": "3.3.1", ++ "esbuild-wasm": "0.24.0", ++ "eslint": "8.57.1", ++ "eslint-config-standard": "17.1.0", ++ "eslint-config-standard-jsx": "11.0.0", ++ "eslint-config-standard-react": "13.0.0", ++ "eslint-plugin-import": "2.31.0", ++ "eslint-plugin-jsx-a11y": "6.10.0", ++ "eslint-plugin-node": "11.1.0", ++ "eslint-plugin-promise": "6.6.0", ++ "eslint-plugin-react": "7.37.1", ++ "eslint-plugin-react-hooks": "4.6.2", ++ "glob": "11.0.0", ++ "htmlparser": "1.7.7", ++ "jed": "1.1.1", + "po2json": "^1.0.0-alpha", +- "qunit": "^2.9.3", +- "sass": "^1.61.0", +- "sizzle": "^2.3.3", +- "stylelint": "^15.10.1", +- "stylelint-config-standard": "^33.0.0", +- "stylelint-config-standard-scss": "^10.0.0", +- "stylelint-formatter-pretty": "^3.2.0" ++ "qunit": "2.22.0", ++ "qunit-tap": "1.5.1", ++ "sass": "1.79.4", ++ "sizzle": "2.3.10", ++ "stylelint": "16.9.0", ++ "stylelint-config-recommended-scss": "14.0.0", ++ "stylelint-config-standard": "36.0.1", ++ "stylelint-config-standard-scss": "13.1.0", ++ "stylelint-formatter-pretty": "4.0.1", ++ "stylelint-use-logical-spec": "5.0.1", ++ "typescript": "^5.3.3" + }, + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^1.2.34", + "@fortawesome/free-solid-svg-icons": "^5.15.2", + "@fortawesome/react-fontawesome": "^0.1.14", +- "@patternfly/patternfly": ">=4.90.3", +- "@patternfly/react-charts": "^6.34.1", +- "@patternfly/react-core": "^4.181.1", +- "@patternfly/react-icons": "^4.8.4", +- "@patternfly/react-styles": "^4.92.6", +- "@patternfly/react-table": "^4.50.1", ++ "@patternfly/patternfly": "5.4.1", ++ "@patternfly/react-charts": "7.4.3", ++ "@patternfly/react-core": "5.4.1", ++ "@patternfly/react-icons": "5.4.0", ++ "@patternfly/react-styles": "5.4.0", ++ "@patternfly/react-table": "5.4.1", ++ "@patternfly/react-tokens": "5.4.0", ++ "dequal": "2.0.3", + "eslint-plugin-react-hooks": "^4.2.0", + "gettext-parser": "^2.0.0", +- "prop-types": "^15.7.2", +- "react": "17.0.2", +- "react-dom": "17.0.2" ++ "js-sha1": "0.7.0", ++ "js-sha256": "0.11.0", ++ "json-stable-stringify-without-jsonify": "1.0.1", ++ "prop-types": "15.8.1", ++ "react": "18.3.1", ++ "react-dom": "18.3.1", ++ "remarkable": "2.0.1", ++ "throttle-debounce": "5.0.2", ++ "uuid": "10.0.0", ++ "@xterm/xterm": "5.5.0", ++ "@xterm/addon-canvas": "0.7.0" + } + } +diff --git a/src/cockpit/389-console/pkg/lib/README b/src/cockpit/389-console/pkg/lib/README +index bb0c6ef41..7677e539f 100644 +--- a/src/cockpit/389-console/pkg/lib/README ++++ b/src/cockpit/389-console/pkg/lib/README +@@ -1,5 +1,5 @@ + # Cockpit shared components + +-This directory contains React components, JavaScript modules, webpack/esbuild ++This directory contains React components, JavaScript modules, esbuild + plugins, and build tools which are shared between all Cockpit projects. + External projects usually clone this directory into their own source tree. +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-context-menu.tsx b/src/cockpit/389-console/pkg/lib/cockpit-components-context-menu.tsx +new file mode 100644 +index 000000000..dd728168b +--- /dev/null ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-context-menu.tsx +@@ -0,0 +1,103 @@ ++/* ++ * This file is part of Cockpit. ++ * ++ * Copyright (C) 2019 Red Hat, Inc. ++ * ++ * Cockpit is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU Lesser General Public License as published by ++ * the Free Software Foundation; either version 2.1 of the License, or ++ * (at your option) any later version. ++ * ++ * Cockpit 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with Cockpit; If not, see . ++ */ ++ ++import React from "react"; ++ ++import { Menu, MenuContent } from "@patternfly/react-core/dist/esm/components/Menu"; ++ ++import "context-menu.scss"; ++ ++/* ++ * A context menu component ++ * ++ * It has two properties: ++ * - parentId (required), area in which it listens to left button click ++ * - children (optional), a MenuList to be rendered in the context menu ++ */ ++export const ContextMenu = ({ parentId, children } : { ++ parentId: string, ++ children?: React.ReactNode, ++}) => { ++ const [visible, setVisible] = React.useState(false); ++ const [event, setEvent] = React.useState(null); ++ const root = React.useRef(null); ++ ++ React.useEffect(() => { ++ const _handleContextMenu = (event: MouseEvent) => { ++ event.preventDefault(); ++ ++ setVisible(true); ++ setEvent(event); ++ }; ++ ++ const _handleClick = (event: MouseEvent) => { ++ if (event.button === 0) ++ setVisible(false); ++ }; ++ ++ const parent = document.getElementById(parentId)!; ++ parent.addEventListener('contextmenu', _handleContextMenu); ++ document.addEventListener('click', _handleClick); ++ ++ return () => { ++ parent.removeEventListener('contextmenu', _handleContextMenu); ++ document.removeEventListener('click', _handleClick); ++ }; ++ }, [parentId]); ++ ++ React.useEffect(() => { ++ if (!event || !root.current) ++ return; ++ ++ const clickX = event.clientX; ++ const clickY = event.clientY; ++ const screenW = window.innerWidth; ++ const screenH = window.innerHeight; ++ const rootW = root.current.offsetWidth; ++ const rootH = root.current.offsetHeight; ++ ++ const right = (screenW - clickX) > rootW; ++ const left = !right; ++ const top = (screenH - clickY) > rootH; ++ const bottom = !top; ++ ++ if (right) { ++ root.current.style.left = `${clickX + 5}px`; ++ } ++ ++ if (left) { ++ root.current.style.left = `${clickX - rootW - 5}px`; ++ } ++ ++ if (top) { ++ root.current.style.top = `${clickY + 5}px`; ++ } ++ ++ if (bottom) { ++ root.current.style.top = `${clickY - rootH - 5}px`; ++ } ++ }, [event]); ++ ++ return visible && ++ ++ ++ {children} ++ ++ ; ++}; +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-dialog.jsx b/src/cockpit/389-console/pkg/lib/cockpit-components-dialog.jsx +index 517d50074..90e0371ec 100644 +--- a/src/cockpit/389-console/pkg/lib/cockpit-components-dialog.jsx ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-dialog.jsx +@@ -14,7 +14,7 @@ + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License +- * along with Cockpit; If not, see . ++ * along with Cockpit; If not, see . + */ + + import cockpit from "cockpit"; +@@ -25,7 +25,6 @@ import { Alert } from "@patternfly/react-core/dist/esm/components/Alert/index.js + import { Button } from "@patternfly/react-core/dist/esm/components/Button/index.js"; + import { Modal } from "@patternfly/react-core/dist/esm/components/Modal/index.js"; + import { Popover } from "@patternfly/react-core/dist/esm/components/Popover/index.js"; +-import { Spinner } from "@patternfly/react-core/dist/esm/components/Spinner/index.js"; + import { Stack, StackItem } from "@patternfly/react-core/dist/esm/layouts/Stack/index.js"; + import { HelpIcon, ExternalLinkAltIcon } from '@patternfly/react-icons'; + +@@ -44,7 +43,7 @@ const _ = cockpit.gettext; + * - list of actions, each an object with: + * - clicked + * Callback function that is expected to return a promise. +- * parameter: callback to set the progress text (will be displayed next to spinner) ++ * parameter: callback to set the progress text + * - caption optional, defaults to 'Ok' + * - disabled optional, defaults to false + * - style defaults to 'secondary', other options: 'primary', 'danger' +@@ -70,10 +69,11 @@ class DialogFooter extends React.Component { + this.setState({ action_progress_message: msg, action_progress_cancel: cancel }); + } + +- action_click(handler, e) { ++ action_click(handler, caption, e) { + this.setState({ + action_progress_message: '', + action_in_progress: true, ++ action_caption_in_progress: caption, + action_canceled: false, + }); + +@@ -144,7 +144,6 @@ class DialogFooter extends React.Component { + cancel_disabled = true; + wait_element =
+ { this.state.action_progress_message } +- +
; + } else if (this.props.idle_message) { + wait_element =
+@@ -167,8 +166,9 @@ class DialogFooter extends React.Component { + key={ caption } + className="apply" + variant={ variant } ++ isLoading={ this.state.action_in_progress && this.state.action_caption_in_progress == caption } + isDanger={ action.danger } +- onClick={ this.action_click.bind(this, action.clicked) } ++ onClick={ this.action_click.bind(this, action.clicked, caption) } + isDisabled={ actions_disabled || action.disabled } + >{ caption } + ); +@@ -209,14 +209,24 @@ DialogFooter.propTypes = { + * - id optional, id that is assigned to the top level dialog node, but not the backdrop + * - variant: See PF4 Modal component's 'variant' property + * - titleIconVariant: See PF4 Modal component's 'titleIconVariant' property ++ * - showClose optional, specifies if 'X' button for closing the dialog is present + */ + class Dialog extends React.Component { + componentDidMount() { ++ // For the scenario that cockpit-storage is used inside anaconda Web UI ++ // We need to know if there is an open dialog in order to create the backdrop effect ++ // on the parent window ++ window.sessionStorage.setItem("cockpit_has_modal", true); ++ + // if we used a button to open this, make sure it's not focused anymore + if (document.activeElement) + document.activeElement.blur(); + } + ++ componentWillUnmount() { ++ window.sessionStorage.setItem("cockpit_has_modal", false); ++ } ++ + render() { + let help = null; + let footer = null; +@@ -234,14 +244,13 @@ class Dialog extends React.Component { + ; + + const error = this.props.error || this.props.static_error; +- const error_alert = error && +- {error.details}; ++ const error_alert = error && ; + + return ( + undefined} +- showClose={false} ++ showClose={!!this.props.showClose} + id={this.props.id} + isOpen + help={help} +@@ -261,9 +270,10 @@ Dialog.propTypes = { + title: PropTypes.string, // is effectively required, but show_modal_dialog() provides initially no props and resets them later. + body: PropTypes.element, // is effectively required, see above + static_error: PropTypes.string, ++ error: PropTypes.string, + footer: PropTypes.element, // is effectively required, see above + id: PropTypes.string, +- error: PropTypes.object, ++ showClose: PropTypes.bool, + }; + + /* Create and show a dialog +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-dropdown.tsx b/src/cockpit/389-console/pkg/lib/cockpit-components-dropdown.tsx +new file mode 100644 +index 000000000..4f12a3fbb +--- /dev/null ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-dropdown.tsx +@@ -0,0 +1,83 @@ ++/* ++ * This file is part of Cockpit. ++ * ++ * Copyright (C) 2024 Red Hat, Inc. ++ * ++ * Cockpit is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU Lesser General Public License as published by ++ * the Free Software Foundation; either version 2.1 of the License, or ++ * (at your option) any later version. ++ * ++ * Cockpit 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with Cockpit; If not, see . ++ */ ++ ++import React, { useState } from 'react'; ++import PropTypes from "prop-types"; ++ ++import { MenuToggle } from "@patternfly/react-core/dist/esm/components/MenuToggle"; ++import { Dropdown, DropdownList, DropdownPopperProps } from "@patternfly/react-core/dist/esm/components/Dropdown"; ++ ++import { EllipsisVIcon } from '@patternfly/react-icons'; ++ ++/* ++ * A dropdown with a Kebab button, commonly used in Cockpit pages provided as ++ * component so not all pages have to re-invent the wheel. ++ * ++ * isOpen/setIsOpen are optional -- you need to handle the state externally if you render the KebabDropdown in an ++ * "unstable" environment such as a dynamic list. When not given, the dropdown will manage its own state. ++ * ++ * This component expects a list of (non-deprecated!) DropdownItem's, if you ++ * require a separator between DropdownItem's use PatternFly's Divivder ++ * component. ++ */ ++export const KebabDropdown = ({ dropdownItems, position = "end", isDisabled = false, toggleButtonId, isOpen, setIsOpen } : { ++ dropdownItems: React.ReactNode, ++ position?: DropdownPopperProps['position'], ++ isDisabled?: boolean, ++ toggleButtonId?: string; ++ isOpen?: boolean, setIsOpen?: React.Dispatch>, ++}) => { ++ const [isKebabOpenInternal, setKebabOpenInternal] = useState(false); ++ const isKebabOpen = isOpen ?? isKebabOpenInternal; ++ const setKebabOpen = setIsOpen ?? setKebabOpenInternal; ++ ++ return ( ++ setKebabOpen(isOpen)} ++ onSelect={() => setKebabOpen(false)} ++ toggle={(toggleRef) => ( ++ setKebabOpen(!isKebabOpen)} ++ isExpanded={isKebabOpen} ++ > ++ ++ ++ )} ++ isOpen={isKebabOpen} ++ popperProps={{ position }} ++ > ++ ++ {dropdownItems} ++ ++ ++ ); ++}; ++ ++KebabDropdown.propTypes = { ++ dropdownItems: PropTypes.array.isRequired, ++ isDisabled: PropTypes.bool, ++ toggleButtonId: PropTypes.string, ++ position: PropTypes.oneOf(['right', 'left', 'center', 'start', 'end']), ++ isOpen: PropTypes.bool, ++ setIsOpen: PropTypes.func, ++}; +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-dynamic-list.jsx b/src/cockpit/389-console/pkg/lib/cockpit-components-dynamic-list.jsx +new file mode 100644 +index 000000000..4cad793d6 +--- /dev/null ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-dynamic-list.jsx +@@ -0,0 +1,143 @@ ++import React from 'react'; ++import PropTypes from 'prop-types'; ++import { Button } from "@patternfly/react-core/dist/esm/components/Button"; ++import { EmptyState, EmptyStateBody } from "@patternfly/react-core/dist/esm/components/EmptyState"; ++import { FormFieldGroup, FormFieldGroupHeader } from "@patternfly/react-core/dist/esm/components/Form"; ++import { HelperText, HelperTextItem } from "@patternfly/react-core/dist/esm/components/HelperText"; ++ ++import './cockpit-components-dynamic-list.scss'; ++ ++/* Dynamic list with a variable number of rows. Each row is a custom component, usually an input field(s). ++ * ++ * Props: ++ * - emptyStateString ++ * - onChange ++ * - id ++ * - itemcomponent ++ * - formclass (optional) ++ * - options (optional) ++ * - onValidationChange: A handler function which updates the parent's component's validation object. ++ * Its parameter is an array the same structure as 'validationFailed'. ++ * - validationFailed: An array where each item represents a validation error of the corresponding row component index. ++ * A row is strictly mapped to an item of the array by its index. ++ * Example: Let's have a dynamic form, where each row consists of 2 fields: name and email. Then a validation array of ++ * these rows would look like this: ++ * [ ++ * { name: "Name must not be empty }, // first row ++ * { }, // second row ++ * { name: "Name cannot contain a number", email: "Email must contain '@'" } // third row ++ * ] ++ */ ++export class DynamicListForm extends React.Component { ++ constructor(props) { ++ super(props); ++ this.state = { ++ list: [], ++ }; ++ this.keyCounter = 0; ++ this.removeItem = this.removeItem.bind(this); ++ this.addItem = this.addItem.bind(this); ++ this.onItemChange = this.onItemChange.bind(this); ++ } ++ ++ removeItem(idx) { ++ const validationFailedDelta = this.props.validationFailed ? [...this.props.validationFailed] : []; ++ // We also need to remove any error messages which the item (row) may have contained ++ delete validationFailedDelta[idx]; ++ this.props.onValidationChange?.(validationFailedDelta); ++ ++ this.setState(state => { ++ const items = [...state.list]; ++ // keep the list structure, otherwise all the indexes shift and the ID/key mapping gets broken ++ delete items[idx]; ++ ++ return { list: items }; ++ }, () => this.props.onChange(this.state.list)); ++ } ++ ++ addItem() { ++ this.setState(state => { ++ return { list: [...state.list, { key: this.keyCounter++, ...this.props.default }] }; ++ }, () => this.props.onChange(this.state.list)); ++ } ++ ++ onItemChange(idx, field, value) { ++ this.setState(state => { ++ const items = [...state.list]; ++ items[idx][field] = value || null; ++ return { list: items }; ++ }, () => this.props.onChange(this.state.list)); ++ } ++ ++ render () { ++ const { id, label, actionLabel, formclass, emptyStateString, helperText, validationFailed, onValidationChange } = this.props; ++ const dialogValues = this.state; ++ return ( ++ {actionLabel}} ++ /> ++ } className={"dynamic-form-group " + formclass}> ++ { ++ dialogValues.list.some(item => item !== undefined) ++ ? <> ++ {dialogValues.list.map((item, idx) => { ++ if (item === undefined) ++ return null; ++ ++ return React.cloneElement(this.props.itemcomponent, { ++ idx, ++ item, ++ id: id + "-" + idx, ++ key: idx, ++ onChange: this.onItemChange, ++ removeitem: this.removeItem, ++ additem: this.addItem, ++ options: this.props.options, ++ validationFailed: validationFailed && validationFailed[idx], ++ onValidationChange: value => { ++ // Dynamic list consists of multiple rows. Therefore validationFailed object is presented as an array where each item represents a row ++ // Each row/item then consists of key-value pairs, which represent a field name and it's validation error ++ const delta = validationFailed ? [...validationFailed] : []; ++ // Update validation of only a single row ++ delta[idx] = value; ++ ++ // If a row doesn't contain any fields with errors anymore, we delete the item of the array ++ // Deleting an item of an array replaces an item with an "empty item". ++ // This guarantees that an array of validation errors maps to the correct rows ++ if (Object.keys(delta[idx]).length == 0) ++ delete delta[idx]; ++ ++ onValidationChange?.(delta); ++ }, ++ }); ++ }) ++ } ++ {helperText && ++ ++ {helperText} ++ ++ } ++ ++ : ++ ++ {emptyStateString} ++ ++ ++ } ++ ++ ); ++ } ++} ++ ++DynamicListForm.propTypes = { ++ emptyStateString: PropTypes.string.isRequired, ++ onChange: PropTypes.func.isRequired, ++ id: PropTypes.string.isRequired, ++ itemcomponent: PropTypes.object.isRequired, ++ formclass: PropTypes.string, ++ options: PropTypes.object, ++ validationFailed: PropTypes.array, ++ onValidationChange: PropTypes.func, ++}; +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-dynamic-list.scss b/src/cockpit/389-console/pkg/lib/cockpit-components-dynamic-list.scss +new file mode 100644 +index 000000000..2016fdaaa +--- /dev/null ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-dynamic-list.scss +@@ -0,0 +1,39 @@ ++@import "global-variables"; ++ ++.dynamic-form-group { ++ .pf-v5-c-empty-state { ++ padding: 0; ++ } ++ ++ .pf-v5-c-form__label { ++ // Don't allow labels to wrap ++ white-space: nowrap; ++ } ++ ++ .remove-button-group { ++ // Move 'Remove' button the the end of the row ++ grid-column: -1; ++ // Move 'Remove' button to the bottom of the line so as to align with the other form fields ++ display: flex; ++ align-items: flex-end; ++ } ++ ++ // Set check to the same height as input widgets and vertically align ++ .pf-v5-c-form__group-control > .pf-v5-c-check { ++ // Set height to the same as inputs ++ // Font height is font size * line height (1rem * 1.5) ++ // Widgets have 5px padding, 1px border (top & bottom): (5 + 1) * 2 = 12 ++ // This all equals to 36px ++ block-size: calc(var(--pf-v5-global--FontSize--md) * var(--pf-v5-global--LineHeight--md) + 12px); ++ align-content: center; ++ } ++ ++ // We use FormFieldGroup PF component for the nested look and for ability to add buttons to the header ++ // However we want to save space and not add indent to the left so we need to override it ++ .pf-v5-c-form__field-group-body { ++ // Stretch content fully ++ --pf-v5-c-form__field-group-body--GridColumn: 1 / -1; ++ // Reduce padding at the top ++ --pf-v5-c-form__field-group-body--PaddingTop: var(--pf-v5-global--spacer--xs); ++ } ++} +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-empty-state.jsx b/src/cockpit/389-console/pkg/lib/cockpit-components-empty-state.jsx +index 0a78d0530..82d7b97eb 100644 +--- a/src/cockpit/389-console/pkg/lib/cockpit-components-empty-state.jsx ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-empty-state.jsx +@@ -14,7 +14,7 @@ + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License +- * along with Cockpit; If not, see . ++ * along with Cockpit; If not, see . + */ + + import React from "react"; +@@ -24,7 +24,7 @@ import { EmptyStateActions, EmptyState, EmptyStateBody, EmptyStateFooter, EmptyS + import { Spinner } from "@patternfly/react-core/dist/esm/components/Spinner/index.js"; + import "./cockpit-components-empty-state.css"; + +-export const EmptyStatePanel = ({ title, paragraph, loading, icon, action, isActionInProgress, onAction, secondary, headingLevel, titleSize }) => { ++export const EmptyStatePanel = ({ title, paragraph, loading = false, icon, action, isActionInProgress = false, onAction, actionVariant = "primary", secondary, headingLevel = "h1" }) => { + const slimType = title || paragraph ? "" : "slim"; + return ( + +@@ -34,7 +34,7 @@ export const EmptyStatePanel = ({ title, paragraph, loading, icon, action, isAct + + {(action || secondary) && + { action && (typeof action == "string" +- ? +@@ -47,17 +47,12 @@ export const EmptyStatePanel = ({ title, paragraph, loading, icon, action, isAct + + EmptyStatePanel.propTypes = { + loading: PropTypes.bool, +- icon: PropTypes.oneOfType([PropTypes.string, PropTypes.func]), ++ icon: PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.func]), + title: PropTypes.string, + paragraph: PropTypes.node, + action: PropTypes.node, ++ actionVariant: PropTypes.string, + isActionInProgress: PropTypes.bool, + onAction: PropTypes.func, + secondary: PropTypes.node, + }; +- +-EmptyStatePanel.defaultProps = { +- headingLevel: "h1", +- titleSize: "lg", +- isActionInProgress: false, +-}; +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-file-autocomplete.jsx b/src/cockpit/389-console/pkg/lib/cockpit-components-file-autocomplete.jsx +index 134fea19a..f09002ba0 100644 +--- a/src/cockpit/389-console/pkg/lib/cockpit-components-file-autocomplete.jsx ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-file-autocomplete.jsx +@@ -14,7 +14,7 @@ + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License +- * along with Cockpit; If not, see . ++ * along with Cockpit; If not, see . + */ + + import cockpit from "cockpit"; +@@ -34,7 +34,7 @@ export class FileAutoComplete extends React.Component { + isOpen: false, + value: this.props.value || null, + }; +- this.updateFiles(props.value || '/'); ++ + this.typeaheadInputValue = ""; + this.allowFilesUpdate = true; + this.updateFiles = this.updateFiles.bind(this); +@@ -43,7 +43,7 @@ export class FileAutoComplete extends React.Component { + this.clearSelection = this.clearSelection.bind(this); + this.onCreateOption = this.onCreateOption.bind(this); + +- this.debouncedChange = debounce(300, (value) => { ++ this.onPathChange = (value) => { + if (!value) { + this.clearSelection(); + return; +@@ -80,7 +80,9 @@ export class FileAutoComplete extends React.Component { + return this.updateFiles(parentDir + '/'); + } + } +- }); ++ }; ++ this.debouncedChange = debounce(300, this.onPathChange); ++ this.onPathChange(this.state.value); + } + + componentWillUnmount() { +@@ -115,7 +117,8 @@ export class FileAutoComplete extends React.Component { + + channel.addEventListener("message", (ev, data) => { + const item = JSON.parse(data); +- if (item && item.path && item.event == 'present') { ++ if (item && item.path && item.event == 'present' && ++ (!this.props.onlyDirectories || item.type == 'directory')) { + item.path = item.path + (item.type == 'directory' ? '/' : ''); + results.push(item); + } +@@ -140,7 +143,7 @@ export class FileAutoComplete extends React.Component { + } + + if (error || !this.state.value) +- this.props.onChange(''); ++ this.props.onChange('', error); + + if (!error) + this.setState({ displayFiles: listItems, directory }); +@@ -160,7 +163,7 @@ export class FileAutoComplete extends React.Component { + value: null, + isOpen: false + }); +- this.props.onChange(''); ++ this.props.onChange('', null); + } + + render() { +@@ -182,7 +185,7 @@ export class FileAutoComplete extends React.Component { + onSelect={(_, value) => { + this.setState({ value, isOpen: false }); + this.debouncedChange(value); +- this.props.onChange(value || ''); ++ this.props.onChange(value || '', null); + }} + onToggle={this.onToggle} + onClear={this.clearSelection} +@@ -201,10 +204,12 @@ FileAutoComplete.propTypes = { + placeholder: PropTypes.string, + superuser: PropTypes.string, + isOptionCreatable: PropTypes.bool, ++ onlyDirectories: PropTypes.bool, + onChange: PropTypes.func, + value: PropTypes.string, + }; + FileAutoComplete.defaultProps = { + isOptionCreatable: false, ++ onlyDirectories: false, + onChange: () => '', + }; +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-firewalld-request.jsx b/src/cockpit/389-console/pkg/lib/cockpit-components-firewalld-request.jsx +index 517b8bb9d..41530b55d 100644 +--- a/src/cockpit/389-console/pkg/lib/cockpit-components-firewalld-request.jsx ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-firewalld-request.jsx +@@ -14,7 +14,7 @@ + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License +- * along with Cockpit; If not, see . ++ * along with Cockpit; If not, see . + */ + import React, { useState } from 'react'; + import { Alert, AlertActionCloseButton, AlertActionLink } from "@patternfly/react-core/dist/esm/components/Alert/index.js"; +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-form-helper.tsx b/src/cockpit/389-console/pkg/lib/cockpit-components-form-helper.tsx +new file mode 100644 +index 000000000..a5a286bb4 +--- /dev/null ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-form-helper.tsx +@@ -0,0 +1,51 @@ ++/* ++ * This file is part of Cockpit. ++ * ++ * Copyright (C) 2023 Red Hat, Inc. ++ * ++ * Cockpit is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU Lesser General Public License as published by ++ * the Free Software Foundation; either version 2.1 of the License, or ++ * (at your option) any later version. ++ * ++ * Cockpit 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with Cockpit; If not, see . ++ */ ++ ++import React from "react"; ++ ++import { FormHelperText } from "@patternfly/react-core/dist/esm/components/Form/index.js"; ++import { HelperText, HelperTextItem } from "@patternfly/react-core/dist/esm/components/HelperText"; ++ ++export const FormHelper = ({ helperText, helperTextInvalid, variant, icon, fieldId } : ++ { ++ helperText?: string | null | undefined, ++ helperTextInvalid?: string | null | undefined, ++ variant?: "error" | "default" | "indeterminate" | "warning" | "success", ++ icon?: string, ++ fieldId?: string, ++ } ++) => { ++ const formHelperVariant = variant || (helperTextInvalid ? "error" : "default"); ++ ++ if (!(helperText || helperTextInvalid)) ++ return null; ++ ++ return ( ++ ++ ++ ++ {formHelperVariant === "error" ? helperTextInvalid : helperText} ++ ++ ++ ++ ); ++}; +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-inline-notification.tsx b/src/cockpit/389-console/pkg/lib/cockpit-components-inline-notification.tsx +new file mode 100644 +index 000000000..1503f52bd +--- /dev/null ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-inline-notification.tsx +@@ -0,0 +1,83 @@ ++/* ++ * This file is part of Cockpit. ++ * ++ * Copyright (C) 2016 Red Hat, Inc. ++ * ++ * Cockpit is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU Lesser General Public License as published by ++ * the Free Software Foundation; either version 2.1 of the License, or ++ * (at your option) any later version. ++ * ++ * Cockpit 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with Cockpit; If not, see . ++ */ ++import React, { useState } from 'react'; ++import PropTypes from 'prop-types'; ++import cockpit from 'cockpit'; ++ ++import { Alert, AlertActionCloseButton, AlertProps } from "@patternfly/react-core/dist/esm/components/Alert/index.js"; ++import { Button } from "@patternfly/react-core/dist/esm/components/Button/index.js"; ++import './cockpit-components-inline-notification.css'; ++ ++const _ = cockpit.gettext; ++ ++export const InlineNotification = ({ text, detail, type = "danger", onDismiss, isInline = true, isLiveRegion = false }: { ++ text: string; ++ detail?: string; ++ type?: AlertProps["variant"]; ++ onDismiss?: (ev?: Event) => void; ++ isInline?: boolean; ++ isLiveRegion?: boolean; ++}) => { ++ const [isDetail, setIsDetail] = useState(false); ++ ++ const detailButton = (detail && ++ ++ ); ++ ++ return ( ++ {text} {detailButton} } ++ { ...onDismiss && { actionClose: } }> ++ {isDetail && (

{detail}

)} ++
++ ); ++}; ++ ++InlineNotification.propTypes = { ++ onDismiss: PropTypes.func, ++ isInline: PropTypes.bool, ++ text: PropTypes.string.isRequired, // main information to render ++ detail: PropTypes.string, // optional, more detailed information. If empty, the more/less button is not rendered. ++ type: PropTypes.string, ++ isLiveRegion: PropTypes.bool, ++}; ++ ++export const ModalError = ({ dialogError, dialogErrorDetail, id, isExpandable }: { ++ dialogError: string, ++ dialogErrorDetail?: string, ++ id?: string, ++ isExpandable?: boolean, ++}) => { ++ return ( ++ ++ { typeof dialogErrorDetail === 'string' ?

{dialogErrorDetail}

: dialogErrorDetail } ++
++ ); ++}; +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-install-dialog.jsx b/src/cockpit/389-console/pkg/lib/cockpit-components-install-dialog.jsx +index 0d933ae5f..921247d44 100644 +--- a/src/cockpit/389-console/pkg/lib/cockpit-components-install-dialog.jsx ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-install-dialog.jsx +@@ -14,7 +14,7 @@ + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License +- * along with Cockpit; If not, see . ++ * along with Cockpit; If not, see . + */ + + import cockpit from "cockpit"; +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-listing-panel.jsx b/src/cockpit/389-console/pkg/lib/cockpit-components-listing-panel.jsx +index 3f2b784b8..4e0a83688 100644 +--- a/src/cockpit/389-console/pkg/lib/cockpit-components-listing-panel.jsx ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-listing-panel.jsx +@@ -14,7 +14,7 @@ + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License +- * along with Cockpit; If not, see . ++ * along with Cockpit; If not, see . + */ + + import PropTypes from 'prop-types'; +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-listing-panel.scss b/src/cockpit/389-console/pkg/lib/cockpit-components-listing-panel.scss +index bd53cd986..c258ae697 100644 +--- a/src/cockpit/389-console/pkg/lib/cockpit-components-listing-panel.scss ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-listing-panel.scss +@@ -18,8 +18,7 @@ + order: 1; + } + +- // FIXME: https://github.com/patternfly/patternfly-react/pull/9135 +- .pf-c-tab-content { ++ .pf-v5-c-tab-content { + order: 3; + flex-basis: 100%; + } +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-logs-panel.jsx b/src/cockpit/389-console/pkg/lib/cockpit-components-logs-panel.jsx +index c960d6da3..4fe66ba50 100644 +--- a/src/cockpit/389-console/pkg/lib/cockpit-components-logs-panel.jsx ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-logs-panel.jsx +@@ -14,7 +14,7 @@ + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License +- * along with Cockpit; If not, see . ++ * along with Cockpit; If not, see . + */ + + import cockpit from "cockpit"; +@@ -55,7 +55,7 @@ export class JournalOutput { + } + + // only consider enter button for keyboard events +- if (ev.type === 'keypress' && ev.key !== "Enter") ++ if (ev.type === 'KeyDown' && ev.key !== "Enter") + return; + + cockpit.jump("system/logs#/" + cursor + "?parent_options=" + JSON.stringify(this.search_options)); +@@ -78,7 +78,7 @@ export class JournalOutput { +
this.onEvent(ev, entry.__CURSOR, full_content)} +- onKeyPress={ev => this.onEvent(ev, entry.__CURSOR, full_content)}> ++ onKeyDown={ev => this.onEvent(ev, entry.__CURSOR, full_content)}> +
+ { warning + ? +diff --git a/src/cockpit/389-console/pkg/lib/cockpit-components-modifications.jsx b/src/cockpit/389-console/pkg/lib/cockpit-components-modifications.jsx +index 3d8983641..4d472fd13 100644 +--- a/src/cockpit/389-console/pkg/lib/cockpit-components-modifications.jsx ++++ b/src/cockpit/389-console/pkg/lib/cockpit-components-modifications.jsx +@@ -14,7 +14,7 @@ + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License +- * along with Cockpit; If not, see . ++ * along with Cockpit; If not, see . + */ + + import PropTypes from 'prop-types'; +@@ -37,80 +37,77 @@ const _ = cockpit.gettext; + * Enables showing shell and ansible script. Shell one is mandatory and ansible one can be omitted. + * + */ +-class ModificationsExportDialog extends React.Component { +- constructor(props) { +- super(props); ++export const ModificationsExportDialog = ({ show, onClose, shell, ansible }) => { ++ const [active_tab, setActiveTab] = React.useState("ansible"); ++ const [copied, setCopied] = React.useState(false); ++ const [timeoutId, setTimeoutId] = React.useState(null); + +- this.state = { +- active_tab: "shell", +- copied: false +- }; +- +- this.handleSelect = this.handleSelect.bind(this); +- this.copyToClipboard = this.copyToClipboard.bind(this); +- } +- +- handleSelect(event, active_tab) { +- this.setState({ active_tab }); +- } ++ const handleSelect = (_event, active_tab) => { ++ setCopied(false); ++ setActiveTab(active_tab); ++ if (timeoutId !== null) { ++ clearTimeout(timeoutId); ++ setTimeoutId(null); ++ } ++ }; + +- copyToClipboard() { ++ const copyToClipboard = () => { + try { +- navigator.clipboard.writeText(this.props[this.state.active_tab].trim()) ++ navigator.clipboard.writeText((active_tab === "ansible" ? ansible : shell).trim()) + .then(() => { +- this.setState({ copied: true }); +- setTimeout(() => { +- this.setState({ copied: false }); +- }, 3000); ++ setCopied(true); ++ setTimeoutId(setTimeout(() => { ++ setCopied(false); ++ setTimeoutId(null); ++ }, 3000)); + }) + .catch(e => console.error('Text could not be copied: ', e ? e.toString() : "")); + } catch (error) { + console.error('Text could not be copied: ', error.toString()); + } +- } ++ }; + +- render() { +- const footer = ( +- <> +- +- +- +- ); +- return ( +- +- +- +-