diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000000..bee3ccd745
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,46 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: 'bug'
+assignees: ''
+
+---
+
+## Description
+
+Provide a clear and concise description of the issue.
+## Steps to Reproduce
+
+### Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+## Actual Behavior
+
+Describe what actually happened.
+## Expected Behavior
+
+Describe what you expected to happen.
+## Screenshots
+
+If applicable, add screenshots to help explain your problem.
+## Possible Solution
+
+If you have a solution in mind, describe it here.
+## Environment
+
+- [ ] Production
+- [ ] Staging
+## Additional Information
+### Add any other context about the problem here.
+
+- If applicable, provide the study ID that this issue relates to:
+- Any relevant logs or error messages: [e.g. console outputs, stack traces]
+- Any relevant code snippets: [e.g. relevant function calls, configuration files]
+- Any relevant library versions: [e.g. React 17.0.1]
+- The date and time when the issue occurred:
+- Browser and version: [e.g. Chrome 88, Safari 14]
+- Operating System: [e.g. Windows 10, macOS 11.2]
+
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000000..c5f8c08d06
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,29 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: 'feature request'
+assignees: ''
+
+---
+
+## Problem Statement
+
+A concise statement that clearly defines the problem the feature is trying to solve, or user problem it addresses:
+
+## Proposed Solution
+
+A high-level description of the proposed solution, including:
+
+- The desired outcome
+
+- Screenshots or mockups that illustrate the desired outcome (if available)
+
+- Any specific requirements or constraints for the feature
+
+- Add any other context or examples to help explain the requested feature
+
+## Developer Notes
+
+- Any potential roadblocks or concerns: [e.g. dependencies on other features, limitations in technology]
+
diff --git a/.github/issue-branch.yml b/.github/issue-branch.yml
deleted file mode 100644
index b31c2af433..0000000000
--- a/.github/issue-branch.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-autoCloseIssue: true
-
-branches:
- - label: '*'
- name: dev
- prefix: feature/
- - label: bug
- prefix: bugfix/
-
diff --git a/.github/workflows/compatibility.yml b/.github/workflows/compatibility.yml
index 7745986a9f..58c44c5cc4 100644
--- a/.github/workflows/compatibility.yml
+++ b/.github/workflows/compatibility.yml
@@ -10,7 +10,7 @@ jobs:
strategy:
max-parallel: 9
matrix:
- os: [windows-latest, ubuntu-latest, macOS-latest]
+ os: [windows-latest, ubuntu-20.04, macOS-latest]
python-version: [ 3.8 ]
steps:
@@ -35,7 +35,7 @@ jobs:
strategy:
max-parallel: 9
matrix:
- os: [ windows-latest, ubuntu-latest, macOS-latest ]
+ os: [ windows-latest, ubuntu-20.04, macOS-latest ]
node-version: [ 10.x, 14.x ]
steps:
- name: Checkout github repo
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 1332788c53..4f920c083e 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -11,7 +11,7 @@ jobs:
strategy:
max-parallel: 3
matrix:
- os: [windows-latest, ubuntu-latest]
+ os: [windows-latest, ubuntu-20.04]
steps:
- name: Checkout github repo (+ download lfs dependencies)
@@ -46,18 +46,13 @@ jobs:
- name: Install Windows dependencies
if: matrix.os == 'windows-latest'
run: pip install -r requirements-windows.txt
- - name: Fix symlink for windows
- if: matrix.os == 'windows-latest'
- run: |
- rm antareslauncher
- ln -s antares-launcher\antareslauncher antareslauncher
- name: Generate Windows binary
if: matrix.os == 'windows-latest'
run: |
git log -1 HEAD --format=%H > .\resources\commit_id
pyinstaller AntaresWebWin.spec
- name: Generate linux binary
- if: matrix.os == 'ubuntu-latest'
+ if: matrix.os == 'ubuntu-20.04'
run: |
git log -1 HEAD --format=%H > .\resources\commit_id
pyinstaller AntaresWebLinux.spec
@@ -67,7 +62,7 @@ jobs:
git log -1 HEAD --format=%H > .\resources\commit_id
pyinstaller -F antarest\worker\archive_worker_service.py -n AntaresWebWorker --add-data ".\resources;.\resources"
- name: Generate Linux worker binary
- if: matrix.os == 'ubuntu-latest'
+ if: matrix.os == 'ubuntu-20.04'
run: |
git log -1 HEAD --format=%H > .\resources\commit_id
pyinstaller -F antarest/worker/archive_worker_service.py -n AntaresWebWorker --add-data resources:resources
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 5922b56b51..e5061506b1 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -6,7 +6,7 @@ on:
jobs:
python-lint:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-20.04
steps:
- name: Checkout github repo (+ download lfs dependencies)
uses: actions/checkout@v2
@@ -36,7 +36,7 @@ jobs:
strategy:
max-parallel: 9
matrix:
- os: [windows-latest, ubuntu-latest]
+ os: [windows-latest, ubuntu-20.04]
steps:
- name: Checkout github repo (+ download lfs dependencies)
@@ -47,11 +47,6 @@ jobs:
uses: actions/setup-python@v1
with:
python-version: 3.8
- - name: Fix symlink for windows
- if: matrix.os == 'windows-latest'
- run: |
- rm antareslauncher
- ln -s antares-launcher\antareslauncher antareslauncher
- name: Install dependencies
run: |
python -m pip install --upgrade pip
@@ -60,11 +55,11 @@ jobs:
run: |
pytest --cov antarest --cov-report xml
- name: Fix code coverage paths
- if: matrix.os == 'ubuntu-latest'
+ if: matrix.os == 'ubuntu-20.04'
run: |
sed -i 's/\/home\/runner\/work\/AntaREST\/AntaREST/\/github\/workspace/g' coverage.xml
- name: Archive code coverage results
- if: matrix.os == 'ubuntu-latest'
+ if: matrix.os == 'ubuntu-20.04'
uses: actions/upload-artifact@v3
with:
name: python-code-coverage-report
@@ -74,7 +69,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ ubuntu-latest ]
+ os: [ ubuntu-20.04 ]
steps:
- name: Checkout github repo
uses: actions/checkout@v1
@@ -106,7 +101,7 @@ jobs:
path: webapp/coverage/lcov.info
sonarcloud:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-20.04
needs: [python-test, npm-test]
steps:
- uses: actions/checkout@v2
@@ -123,4 +118,4 @@ jobs:
uses: sonarsource/sonarcloud-github-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
\ No newline at end of file
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
diff --git a/Dockerfile b/Dockerfile
index 2260427476..f99b8d7559 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -13,10 +13,15 @@ COPY ./scripts /scripts
COPY ./alembic /alembic
COPY ./alembic.ini /alembic.ini
-COPY ./antares-launcher /antares-launcher
-RUN ln -s /antares-launcher/antareslauncher /antareslauncher
-RUN mkdir /conf/antares-launcher
-RUN cp /antares-launcher/requirements.txt /conf/antares-launcher/requirements.txt
+# > IMPORTANT: The `antares-launcher` project (source files) is no longer needed,
+# > because the `Antares-Launcher` Python library is now declared as a dependency
+# > in the `requirements.txt` file.
+# > In other words, we can dispense with the creation of the symbolic link.
+
+# COPY ./antares-launcher /antares-launcher
+# RUN ln -s /antares-launcher/antareslauncher /antareslauncher
+# RUN mkdir /conf/antares-launcher
+# RUN cp /antares-launcher/requirements.txt /conf/antares-launcher/requirements.txt
RUN ./scripts/install-debug.sh
diff --git a/antareslauncher b/antareslauncher
deleted file mode 120000
index 700bb69b40..0000000000
--- a/antareslauncher
+++ /dev/null
@@ -1 +0,0 @@
-antares-launcher/antareslauncher
\ No newline at end of file
diff --git a/antarest/__init__.py b/antarest/__init__.py
index a4d2eb832e..923dfadcf4 100644
--- a/antarest/__init__.py
+++ b/antarest/__init__.py
@@ -1,5 +1,16 @@
-__version__ = "2.12.2"
+"""
+Antares Web
+This module contains the project metadata.
+"""
from pathlib import Path
+# Standard project metadata
+
+__version__ = "2.13.0"
+__author__ = "RTE, Antares Web Team"
+__date__ = "2023-03-09"
+# noinspection SpellCheckingInspection
+__credits__ = "(c) Réseau de Transport de l’Électricité (RTE)"
+
ROOT_DIR: Path = Path(__file__).resolve().parent
diff --git a/antarest/core/cache/business/local_chache.py b/antarest/core/cache/business/local_chache.py
index a3275b5d7f..f6b544260a 100644
--- a/antarest/core/cache/business/local_chache.py
+++ b/antarest/core/cache/business/local_chache.py
@@ -20,11 +20,13 @@ class LocalCacheElement(BaseModel):
class LocalCache(ICache):
def __init__(self, config: CacheConfig = CacheConfig()):
- self.cache: Dict[str, LocalCacheElement] = dict()
+ self.cache: Dict[str, LocalCacheElement] = {}
self.lock = threading.Lock()
self.checker_delay = config.checker_delay
self.checker_thread = threading.Thread(
- target=self.checker, daemon=True
+ target=self.checker,
+ name=self.__class__.__name__,
+ daemon=True,
)
def start(self) -> None:
diff --git a/antarest/core/config.py b/antarest/core/config.py
index 7bf772ef19..86acdd8bfd 100644
--- a/antarest/core/config.py
+++ b/antarest/core/config.py
@@ -73,9 +73,9 @@ class WorkspaceConfig:
def from_dict(data: JSON) -> "WorkspaceConfig":
return WorkspaceConfig(
path=Path(data["path"]),
- groups=data.get("groups", list()),
+ groups=data.get("groups", []),
filter_in=data.get("filter_in", [".*"]),
- filter_out=data.get("filter_out", list()),
+ filter_out=data.get("filter_out", []),
)
@@ -254,7 +254,7 @@ class LoggingConfig:
@staticmethod
def from_dict(data: JSON) -> "LoggingConfig":
logging_config: Dict[str, Any] = data or {}
- logfile: Optional[str] = logging_config.get("logfile", None)
+ logfile: Optional[str] = logging_config.get("logfile")
return LoggingConfig(
logfile=Path(logfile) if logfile is not None else None,
json=logging_config.get("json", False),
@@ -287,6 +287,7 @@ class EventBusConfig:
Sub config object dedicated to eventbus module
"""
+ # noinspection PyUnusedLocal
@staticmethod
def from_dict(data: JSON) -> "EventBusConfig":
return EventBusConfig()
@@ -298,7 +299,7 @@ class CacheConfig:
Sub config object dedicated to cache module
"""
- checker_delay: float = 0.2 # in ms
+ checker_delay: float = 0.2 # in seconds
@staticmethod
def from_dict(data: JSON) -> "CacheConfig":
diff --git a/antarest/core/exceptions.py b/antarest/core/exceptions.py
index a34da7c29e..5a0476751f 100644
--- a/antarest/core/exceptions.py
+++ b/antarest/core/exceptions.py
@@ -216,3 +216,11 @@ def __init__(self, *district_ids: str):
class BadEditInstructionException(HTTPException):
def __init__(self, message: str) -> None:
super().__init__(HTTPStatus.BAD_REQUEST, message)
+
+
+class CannotScanInternalWorkspace(HTTPException):
+ def __init__(self) -> None:
+ super().__init__(
+ HTTPStatus.BAD_REQUEST,
+ "You cannot scan the default internal workspace",
+ )
diff --git a/antarest/core/interfaces/eventbus.py b/antarest/core/interfaces/eventbus.py
index 1de1daa288..863b9e9af4 100644
--- a/antarest/core/interfaces/eventbus.py
+++ b/antarest/core/interfaces/eventbus.py
@@ -1,10 +1,9 @@
from abc import ABC, abstractmethod
from enum import Enum
-from typing import Any, Callable, Optional, List, Awaitable
-
-from pydantic import BaseModel
+from typing import Any, Awaitable, Callable, List, Optional
from antarest.core.model import PermissionInfo
+from pydantic import BaseModel
class EventType(str, Enum):
@@ -49,8 +48,8 @@ class EventChannelDirectory:
class Event(BaseModel):
type: EventType
payload: Any
- permissions: PermissionInfo = PermissionInfo()
- channel: Optional[str] = None
+ permissions: PermissionInfo
+ channel: str = ""
class IEventBus(ABC):
@@ -79,13 +78,22 @@ def add_listener(
type_filter: Optional[List[EventType]] = None,
) -> str:
"""
- Add an event listener listener
- @param listener listener callback
- @param type_filter list of event types to listen to (or None to catch all)
+ Add a new event listener in the event bus.
+
+ The listener can listen to several types of events, depending on the filter
+ list. If not specified, the listener will listen to all event types.
- Beware of the fact that in gunicorn, listeners will be called on the same event as many as there is workers
+ Note:
+ Be aware that in `gunicorn`, the listeners will be called on the same
+ event as many times as there are workers.
+
+ Args:
+ listener: callback of the listener
+ type_filter: list of event types to listen to (or `None` to catch everything).
+
+ Returns:
+ Listener registration ID (usually a UUID).
"""
- pass
@abstractmethod
def remove_listener(self, listener_id: str) -> None:
diff --git a/antarest/core/interfaces/service.py b/antarest/core/interfaces/service.py
index 3696e71e5f..7adacc6182 100644
--- a/antarest/core/interfaces/service.py
+++ b/antarest/core/interfaces/service.py
@@ -4,7 +4,11 @@
class IService(ABC):
def __init__(self) -> None:
- self.thread = threading.Thread(target=self._loop, daemon=True)
+ self.thread = threading.Thread(
+ target=self._loop,
+ name=self.__class__.__name__,
+ daemon=True,
+ )
def start(self, threaded: bool = True) -> None:
if threaded:
diff --git a/antarest/core/maintenance/model.py b/antarest/core/maintenance/model.py
index 5f519ee010..b8485f12b2 100644
--- a/antarest/core/maintenance/model.py
+++ b/antarest/core/maintenance/model.py
@@ -1,17 +1,14 @@
from enum import Enum
-from typing import Optional
-
-from pydantic import BaseModel
-from sqlalchemy import Column, String, Integer, Boolean, DateTime, ForeignKey, Sequence # type: ignore
-from sqlalchemy.orm import relationship # type: ignore
class MaintenanceMode(str, Enum):
NORMAL_MODE = "NORMAL"
MAINTENANCE_MODE = "MAINTENANCE"
- @staticmethod
- def to_str(element: bool) -> str:
- if element:
- return MaintenanceMode.MAINTENANCE_MODE.value
- return MaintenanceMode.NORMAL_MODE.value
+ @classmethod
+ def from_bool(cls, flag: bool) -> "MaintenanceMode":
+ return {False: cls.NORMAL_MODE, True: cls.MAINTENANCE_MODE}[flag]
+
+ def __bool__(self) -> bool:
+ cls = self.__class__
+ return {cls.NORMAL_MODE: False, cls.MAINTENANCE_MODE: True}[self]
diff --git a/antarest/core/maintenance/service.py b/antarest/core/maintenance/service.py
index 99c4781892..f252591013 100644
--- a/antarest/core/maintenance/service.py
+++ b/antarest/core/maintenance/service.py
@@ -2,27 +2,18 @@
import shutil
import time
from threading import Thread
-from typing import Optional, Callable
+from typing import Callable, Optional
from fastapi import HTTPException
from antarest.core.config import Config
from antarest.core.configdata.model import ConfigDataAppKeys
from antarest.core.interfaces.cache import ICache
-from antarest.core.interfaces.eventbus import (
- IEventBus,
- EventType,
- Event,
-)
-from antarest.core.maintenance.model import (
- MaintenanceMode,
-)
+from antarest.core.interfaces.eventbus import Event, EventType, IEventBus
+from antarest.core.maintenance.model import MaintenanceMode
from antarest.core.maintenance.repository import MaintenanceRepository
from antarest.core.model import PermissionInfo, PublicMode
-from antarest.core.requests import (
- RequestParameters,
- UserHasNotPermissionError,
-)
+from antarest.core.requests import RequestParameters, UserHasNotPermissionError
logger = logging.getLogger(__name__)
@@ -42,7 +33,11 @@ def __init__(
self._init()
def _init(self) -> None:
- self.thread = Thread(target=self.check_disk_usage, daemon=True)
+ self.thread = Thread(
+ target=self.check_disk_usage,
+ name=self.__class__.__name__,
+ daemon=True,
+ )
self.thread.start()
def check_disk_usage(self) -> None:
@@ -51,7 +46,8 @@ def check_disk_usage(self) -> None:
try:
usage = shutil.disk_usage(workspace.path)
logger.info(
- f"Disk usage for {name}: {(100 * usage.used / usage.total):.2f}% ({(usage.free / 1000000000):.3f}GB free)"
+ f"Disk usage for {name}: {(100 * usage.used / usage.total):.2f}%"
+ f" ({(usage.free / 1000000000):.3f}GB free)"
)
except Exception as e:
logger.error(
@@ -113,16 +109,19 @@ def _set_maintenance_data(
except Exception as e:
cache_save_error = f"Failed to put {cache_id} in cache"
logger.error(cache_save_error, exc_info=e)
- raise HTTPException(status_code=500, detail=cache_save_error)
+ raise HTTPException(
+ status_code=500,
+ detail=cache_save_error,
+ ) from e
def set_maintenance_status(
self,
data: bool,
request_params: RequestParameters,
) -> None:
- maintenance_mode = MaintenanceMode.to_str(data)
+ maintenance_mode = MaintenanceMode.from_bool(data)
self._set_maintenance_data(
- data=maintenance_mode,
+ data=maintenance_mode.value,
cache_id=ConfigDataAppKeys.MAINTENANCE_MODE.value,
db_call=lambda x: self.repo.save_maintenance_mode(x),
request_params=request_params,
@@ -141,15 +140,14 @@ def get_maintenance_status(self) -> bool:
db_call=lambda: self.repo.get_maintenance_mode(),
default_value=MaintenanceMode.NORMAL_MODE.value,
)
- return data == MaintenanceMode.MAINTENANCE_MODE.value
+ return bool(MaintenanceMode(data))
def set_message_info(
self,
data: str,
request_params: RequestParameters,
) -> None:
- message = "" if data.replace("\t", "").replace(" ", "") == "" else data
- message = message.strip()
+ message = data.strip()
self._set_maintenance_data(
data=message,
cache_id=ConfigDataAppKeys.MESSAGE_INFO.value,
diff --git a/antarest/core/maintenance/web.py b/antarest/core/maintenance/web.py
index 8912d2a509..9f4a17c2af 100644
--- a/antarest/core/maintenance/web.py
+++ b/antarest/core/maintenance/web.py
@@ -1,11 +1,10 @@
import logging
from typing import Any
-from fastapi import APIRouter, Depends, Body
+from fastapi import APIRouter, Body, Depends
from antarest.core.config import Config
from antarest.core.jwt import JWTUser
-from antarest.core.maintenance.model import MaintenanceMode
from antarest.core.maintenance.service import MaintenanceService
from antarest.core.requests import RequestParameters
from antarest.login.auth import Auth
diff --git a/antarest/core/model.py b/antarest/core/model.py
index 6953a30eff..132ceb0b77 100644
--- a/antarest/core/model.py
+++ b/antarest/core/model.py
@@ -1,7 +1,12 @@
import enum
-from typing import Any, Dict, List, Union, Optional
+from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
+
from pydantic import BaseModel
+if TYPE_CHECKING:
+ # These dependencies are only used for type checking with mypy.
+ from antarest.study.model import Study, StudyMetadataDTO
+
JSON = Dict[str, Any]
ELEMENT = Union[str, int, float, bool, bytes]
SUB_JSON = Union[ELEMENT, JSON, List, None]
@@ -29,5 +34,17 @@ class StudyPermissionType(str, enum.Enum):
class PermissionInfo(BaseModel):
owner: Optional[int] = None
- groups: List[str] = list()
+ groups: List[str] = []
public_mode: PublicMode = PublicMode.NONE
+
+ @classmethod
+ def from_study(
+ cls, study: Union["Study", "StudyMetadataDTO"]
+ ) -> "PermissionInfo":
+ return cls(
+ owner=None if study.owner is None else study.owner.id,
+ groups=[g.id for g in study.groups if g.id is not None],
+ public_mode=PublicMode.NONE
+ if study.public_mode is None
+ else PublicMode(study.public_mode),
+ )
diff --git a/antarest/core/permissions.py b/antarest/core/permissions.py
index e3a1a1135c..f7ed6b3020 100644
--- a/antarest/core/permissions.py
+++ b/antarest/core/permissions.py
@@ -1,7 +1,7 @@
import logging
from antarest.core.jwt import JWTUser
-from antarest.core.model import PermissionInfo, StudyPermissionType, PublicMode
+from antarest.core.model import PermissionInfo, PublicMode, StudyPermissionType
from antarest.core.roles import RoleType
logger = logging.getLogger(__name__)
@@ -70,8 +70,9 @@ def check_permission(
):
return True
+ allowed_roles = permission_matrix[permission]["roles"]
group_permission = any(
- role in permission_matrix[permission]["roles"] # type: ignore
+ role in allowed_roles # type: ignore
for role in [
group.role
for group in (user.groups or [])
@@ -81,4 +82,5 @@ def check_permission(
if group_permission:
return True
- return permission_info.public_mode in permission_matrix[permission]["public_modes"] # type: ignore
+ allowed_public_modes = permission_matrix[permission]["public_modes"]
+ return permission_info.public_mode in allowed_public_modes # type: ignore
diff --git a/antarest/core/tasks/service.py b/antarest/core/tasks/service.py
index 3480e3c592..147823af69 100644
--- a/antarest/core/tasks/service.py
+++ b/antarest/core/tasks/service.py
@@ -1,38 +1,36 @@
-import asyncio
import datetime
import logging
import time
from abc import ABC, abstractmethod
-from concurrent.futures import ThreadPoolExecutor, Future
-from enum import Enum
+from concurrent.futures import Future, ThreadPoolExecutor
from http import HTTPStatus
-from typing import Callable, Optional, List, Dict, Awaitable, Union, cast
+from typing import Awaitable, Callable, Dict, List, Optional, Union
from fastapi import HTTPException
from antarest.core.config import Config
from antarest.core.interfaces.eventbus import (
- IEventBus,
Event,
- EventType,
EventChannelDirectory,
+ EventType,
+ IEventBus,
)
from antarest.core.jwt import DEFAULT_ADMIN_USER
-from antarest.core.model import PermissionInfo
+from antarest.core.model import PermissionInfo, PublicMode
from antarest.core.requests import (
- RequestParameters,
MustBeAuthenticatedError,
+ RequestParameters,
UserHasNotPermissionError,
)
from antarest.core.tasks.model import (
+ CustomTaskEventMessages,
TaskDTO,
- TaskListFilter,
+ TaskEventPayload,
TaskJob,
- TaskStatus,
TaskJobLog,
+ TaskListFilter,
TaskResult,
- CustomTaskEventMessages,
- TaskEventPayload,
+ TaskStatus,
TaskType,
)
from antarest.core.tasks.repository import TaskJobRepository
@@ -93,6 +91,7 @@ def await_task(
raise NotImplementedError()
+# noinspection PyUnusedLocal
def noop_notifier(message: str) -> None:
pass
@@ -139,7 +138,8 @@ async def _await_task_end(event: Event) -> None:
return _await_task_end
- def _send_worker_task(logger: TaskUpdateNotifier) -> TaskResult:
+ # todo: Is `logger_` parameter required? (consider refactoring)
+ def _send_worker_task(logger_: TaskUpdateNotifier) -> TaskResult:
listener_id = self.event_bus.add_listener(
_create_awaiter(task_result_wrapper),
[EventType.WORKER_TASK_ENDED],
@@ -152,6 +152,8 @@ def _send_worker_task(logger: TaskUpdateNotifier) -> TaskResult:
task_type=task_type,
task_args=task_args,
),
+ # Use `NONE` for internal events
+ permissions=PermissionInfo(public_mode=PublicMode.NONE),
),
task_type,
)
@@ -163,10 +165,7 @@ def _send_worker_task(logger: TaskUpdateNotifier) -> TaskResult:
return _send_worker_task
def check_remote_worker_for_queue(self, task_queue: str) -> bool:
- for rw in self.remote_workers:
- if task_queue in rw.queues:
- return True
- return False
+ return any(task_queue in rw.queues for rw in self.remote_workers)
def add_worker_task(
self,
@@ -279,7 +278,12 @@ def _cancel_task(self, task_id: str, dispatch: bool = False) -> None:
self.repo.save(task)
elif dispatch:
self.event_bus.push(
- Event(type=EventType.TASK_CANCEL_REQUEST, payload=task_id)
+ Event(
+ type=EventType.TASK_CANCEL_REQUEST,
+ payload=task_id,
+ # Use `NONE` for internal events
+ permissions=PermissionInfo(public_mode=PublicMode.NONE),
+ )
)
def status_task(
@@ -290,14 +294,13 @@ def status_task(
) -> TaskDTO:
if not request_params.user:
raise MustBeAuthenticatedError()
-
- task = self.repo.get(task_id)
- if not task:
+ if task := self.repo.get(task_id):
+ return task.to_dto(with_logs)
+ else:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND,
detail=f"Failed to retrieve task {task_id} in db",
)
- return task.to_dto(with_logs)
def list_tasks(
self, task_filter: TaskListFilter, request_params: RequestParameters
@@ -312,12 +315,12 @@ def list_db_tasks(
) -> List[TaskJob]:
if not request_params.user:
raise MustBeAuthenticatedError()
- return self.repo.list(
- task_filter,
- request_params.user.impersonator
- if not request_params.user.is_site_admin()
- else None,
+ user = (
+ None
+ if request_params.user.is_site_admin()
+ else request_params.user.impersonator
)
+ return self.repo.list(task_filter, user)
def await_task(
self, task_id: str, timeout_sec: Optional[int] = None
@@ -357,6 +360,7 @@ def _run_task(
if custom_event_messages is not None
else f"Task {task_id} is running",
).dict(),
+ permissions=PermissionInfo(public_mode=PublicMode.READ),
channel=EventChannelDirectory.TASK + task_id,
)
)
@@ -392,24 +396,32 @@ def _run_task(
if custom_event_messages is not None
else f'Task {task_id} {"completed" if result.success else "failed"}',
).dict(),
+ permissions=PermissionInfo(public_mode=PublicMode.READ),
channel=EventChannelDirectory.TASK + task_id,
)
)
- except Exception as e:
- logger.error(f"Exception when running task {task_id}", exc_info=e)
+ except Exception as exc:
+ err_msg = f"Task {task_id} failed: Unhandled exception {exc}"
+ logger.error(err_msg, exc_info=exc)
with db():
self._update_task_status(
- task_id, TaskStatus.FAILED, False, repr(e)
+ task_id,
+ TaskStatus.FAILED,
+ False,
+ f"{err_msg}\nSee the logs for detailed information and the error traceback.",
)
+ message = (
+ err_msg
+ if custom_event_messages is None
+ else custom_event_messages.end
+ )
self.event_bus.push(
Event(
type=EventType.TASK_FAILED,
payload=TaskEventPayload(
- id=task_id,
- message=custom_event_messages.end
- if custom_event_messages is not None
- else f"Task {task_id} failed",
+ id=task_id, message=message
).dict(),
+ permissions=PermissionInfo(public_mode=PublicMode.READ),
channel=EventChannelDirectory.TASK + task_id,
)
)
@@ -453,5 +465,5 @@ def _update_task_status(
task.result_status = result
task.result = command_result
if status.is_final():
- task.completion_date = datetime.datetime.utcnow()
+ task.completion_date = datetime.datetime.now(datetime.timezone.utc)
self.repo.save(task)
diff --git a/antarest/eventbus/business/redis_eventbus.py b/antarest/eventbus/business/redis_eventbus.py
index 4e27a7793c..3a4f5871bb 100644
--- a/antarest/eventbus/business/redis_eventbus.py
+++ b/antarest/eventbus/business/redis_eventbus.py
@@ -6,7 +6,6 @@
from redis.client import Redis
from antarest.core.interfaces.eventbus import Event
-from antarest.core.model import PermissionInfo
from antarest.eventbus.business.interfaces import IEventBusBackend
logger = logging.getLogger(__name__)
diff --git a/antarest/eventbus/main.py b/antarest/eventbus/main.py
index 9398abf03c..3f961fd410 100644
--- a/antarest/eventbus/main.py
+++ b/antarest/eventbus/main.py
@@ -4,7 +4,6 @@
from redis import Redis
from antarest.core.config import Config
-from antarest.core.interfaces.eventbus import IEventBus
from antarest.eventbus.business.local_eventbus import LocalEventBus
from antarest.eventbus.business.redis_eventbus import RedisEventBus
from antarest.eventbus.service import EventBusService
@@ -16,7 +15,7 @@ def build_eventbus(
config: Config,
autostart: bool = True,
redis_client: Optional[Redis] = None, # type: ignore
-) -> IEventBus:
+) -> EventBusService:
eventbus = EventBusService(
RedisEventBus(redis_client)
if redis_client is not None
diff --git a/antarest/eventbus/service.py b/antarest/eventbus/service.py
index a7b8cfd2c7..8411547f8d 100644
--- a/antarest/eventbus/service.py
+++ b/antarest/eventbus/service.py
@@ -3,11 +3,10 @@
import random
import threading
import time
-from typing import List, Callable, Optional, Dict, Awaitable, Any, cast
-from uuid import uuid4
+from typing import Awaitable, Callable, Dict, List, Optional
+import uuid
-from antarest.core.interfaces.eventbus import Event, IEventBus, EventType
-from antarest.core.utils.utils import suppress_exception
+from antarest.core.interfaces.eventbus import Event, EventType, IEventBus
from antarest.eventbus.business.interfaces import IEventBusBackend
logger = logging.getLogger(__name__)
@@ -39,7 +38,7 @@ def add_queue_consumer(
self, listener: Callable[[Event], Awaitable[None]], queue: str
) -> str:
with self.lock:
- listener_id = str(uuid4())
+ listener_id = str(uuid.uuid4())
if queue not in self.consumers:
self.consumers[queue] = {}
self.consumers[queue][listener_id] = listener
@@ -57,7 +56,7 @@ def add_listener(
type_filter: Optional[List[EventType]] = None,
) -> str:
with self.lock:
- listener_id = str(uuid4())
+ listener_id = str(uuid.uuid4())
types = type_filter or [EventType.ANY]
for listener_type in types:
self.listeners[listener_type][listener_id] = listener
@@ -76,7 +75,7 @@ async def _run_loop(self) -> None:
await self._on_events()
except Exception as e:
logger.error(
- f"Unexpected error when processing events", exc_info=e
+ "Unexpected error when processing events", exc_info=e
)
async def _on_events(self) -> None:
@@ -125,8 +124,11 @@ def _async_loop(self, new_loop: bool = True) -> None:
def start(self, threaded: bool = True) -> None:
if threaded:
- t = threading.Thread(target=self._async_loop)
- t.setDaemon(True)
+ t = threading.Thread(
+ target=self._async_loop,
+ name=self.__class__.__name__,
+ daemon=True,
+ )
logger.info("Starting event bus")
t.start()
else:
diff --git a/antarest/eventbus/web.py b/antarest/eventbus/web.py
index c2b01c0d96..f437e3c5a6 100644
--- a/antarest/eventbus/web.py
+++ b/antarest/eventbus/web.py
@@ -3,19 +3,18 @@
import logging
from enum import Enum
from http import HTTPStatus
-from typing import List, Dict, Optional, Tuple
-
-from fastapi import FastAPI, Query, HTTPException, Depends
-from fastapi_jwt_auth import AuthJWT # type: ignore
-from pydantic import BaseModel
-from starlette.websockets import WebSocket, WebSocketDisconnect
+from typing import List, Optional
from antarest.core.config import Config
-from antarest.core.interfaces.eventbus import IEventBus, Event
-from antarest.core.jwt import JWTUser, DEFAULT_ADMIN_USER
-from antarest.core.model import PermissionInfo, StudyPermissionType, PublicMode
+from antarest.core.interfaces.eventbus import Event, IEventBus
+from antarest.core.jwt import DEFAULT_ADMIN_USER, JWTUser
+from antarest.core.model import PermissionInfo, StudyPermissionType
from antarest.core.permissions import check_permission
from antarest.login.auth import Auth
+from fastapi import Depends, FastAPI, HTTPException, Query
+from fastapi_jwt_auth import AuthJWT # type: ignore
+from pydantic import BaseModel
+from starlette.websockets import WebSocket, WebSocketDisconnect
logger = logging.getLogger(__name__)
@@ -63,9 +62,7 @@ def disconnect(self, websocket: WebSocket) -> None:
if connection_to_remove is not None:
self.active_connections.remove(connection_to_remove)
- def process_message(
- self, message: str, websocket: WebSocket, user: JWTUser
- ) -> None:
+ def process_message(self, message: str, websocket: WebSocket) -> None:
connection = self._get_connection(websocket)
if not connection:
return
@@ -79,17 +76,16 @@ def process_message(
connection.channel_subscriptions.remove(ws_message.payload)
async def broadcast(
- self, message: str, permissions: PermissionInfo, channel: Optional[str]
+ self, message: str, permissions: PermissionInfo, channel: str
) -> None:
for connection in self.active_connections:
- if channel is not None or check_permission(
+ # if is subscribed to chanel and has permission, send message to websocket
+ if (
+ not channel or channel in connection.channel_subscriptions
+ ) and check_permission(
connection.user, permissions, StudyPermissionType.READ
):
- if (
- channel is None
- or channel in connection.channel_subscriptions
- ):
- await connection.websocket.send_text(message)
+ await connection.websocket.send_text(message)
def configure_websockets(
@@ -130,9 +126,7 @@ async def connect(
while True:
message = await websocket.receive_text()
try:
- manager.process_message(
- message, websocket, user or DEFAULT_ADMIN_USER
- )
+ manager.process_message(message, websocket)
except Exception as e:
logger.error(
f"Failed to process websocket message {message}",
diff --git a/antarest/launcher/adapters/abstractlauncher.py b/antarest/launcher/adapters/abstractlauncher.py
index d16da3a154..2427db5b73 100644
--- a/antarest/launcher/adapters/abstractlauncher.py
+++ b/antarest/launcher/adapters/abstractlauncher.py
@@ -1,23 +1,40 @@
-import logging
+import os
from abc import ABC, abstractmethod
from pathlib import Path
-from typing import Callable, NamedTuple, Optional, Dict, List
+from typing import Callable, Dict, List, NamedTuple, Optional
from antarest.core.config import Config
from antarest.core.interfaces.cache import ICache
from antarest.core.interfaces.eventbus import (
Event,
- EventType,
EventChannelDirectory,
+ EventType,
IEventBus,
)
+from antarest.core.model import PermissionInfo, PublicMode
from antarest.core.requests import RequestParameters
from antarest.launcher.adapters.log_parser import LaunchProgressDTO, LogParser
from antarest.launcher.model import JobStatus, LauncherParametersDTO, LogType
class LauncherInitException(Exception):
- pass
+ """
+ Exception raised during local or SLURM launcher initialisation
+ when a required parameter is not set in the application configuration.
+
+ In Docker environment, the configuration path is `/resources/application.yaml`.
+ """
+
+ def __init__(self, reason: str) -> None:
+ from antarest.core.utils import utils
+
+ if config_path := (
+ os.getenv("ANTAREST_CONF") or utils.get_default_config_path()
+ ):
+ msg = f"Invalid configuration '{config_path}': {reason}"
+ else:
+ msg = f"Invalid configuration: {reason}"
+ super().__init__(msg)
class LauncherCallbacks(NamedTuple):
@@ -74,6 +91,7 @@ def update_log(log_line: str) -> None:
"log": log_line,
"job_id": job_id,
},
+ permissions=PermissionInfo(public_mode=PublicMode.READ),
channel=EventChannelDirectory.JOB_LOGS + job_id,
)
)
@@ -99,6 +117,9 @@ def update_log(log_line: str) -> None:
"progress": launch_progress_dto.progress,
"message": "",
},
+ permissions=PermissionInfo(
+ public_mode=PublicMode.READ
+ ),
channel=EventChannelDirectory.JOB_STATUS + job_id,
)
)
diff --git a/antarest/launcher/adapters/local_launcher/local_launcher.py b/antarest/launcher/adapters/local_launcher/local_launcher.py
index 4b1aa6349c..5b3a95ff5b 100644
--- a/antarest/launcher/adapters/local_launcher/local_launcher.py
+++ b/antarest/launcher/adapters/local_launcher/local_launcher.py
@@ -6,7 +6,7 @@
import threading
import time
from pathlib import Path
-from typing import Dict, Optional, Tuple, Callable, cast, IO
+from typing import IO, Callable, Dict, Optional, Tuple, cast
from uuid import UUID
from antarest.core.config import Config
@@ -15,8 +15,8 @@
from antarest.core.requests import RequestParameters
from antarest.launcher.adapters.abstractlauncher import (
AbstractLauncher,
- LauncherInitException,
LauncherCallbacks,
+ LauncherInitException,
)
from antarest.launcher.adapters.log_manager import LogTailManager
from antarest.launcher.model import JobStatus, LauncherParametersDTO, LogType
@@ -37,6 +37,8 @@ def __init__(
cache: ICache,
) -> None:
super().__init__(config, callbacks, event_bus, cache)
+ if self.config.launcher.local is None:
+ raise LauncherInitException("Missing parameter 'launcher.local'")
self.tmpdir = config.storage.tmp_dir
self.job_id_to_study_id: Dict[ # type: ignore
str, Tuple[str, Path, subprocess.Popen]
@@ -44,19 +46,19 @@ def __init__(
self.logs: Dict[str, str] = {}
def _select_best_binary(self, version: str) -> Path:
- if self.config.launcher.local is None:
- raise LauncherInitException()
-
- if version in self.config.launcher.local.binaries:
- antares_solver_path = self.config.launcher.local.binaries[version]
+ local = self.config.launcher.local
+ if local is None:
+ raise LauncherInitException("Missing parameter 'launcher.local'")
+ elif version in local.binaries:
+ antares_solver_path = local.binaries[version]
else:
+ # sourcery skip: extract-method, max-min-default
+ # fixme: `version` must remain a string, consider using a `Version` class
version_int = int(version)
- keys = list(map(int, self.config.launcher.local.binaries.keys()))
+ keys = list(map(int, local.binaries.keys()))
keys_sup = [k for k in keys if k > version_int]
best_existing_version = min(keys_sup) if keys_sup else max(keys)
- antares_solver_path = self.config.launcher.local.binaries[
- str(best_existing_version)
- ]
+ antares_solver_path = local.binaries[str(best_existing_version)]
logger.warning(
f"Version {version} is not available. Version {best_existing_version} has been selected instead"
)
@@ -70,9 +72,6 @@ def run_study(
launcher_parameters: LauncherParametersDTO,
params: RequestParameters,
) -> None:
- if self.config.launcher.local is None:
- raise LauncherInitException()
-
antares_solver_path = self._select_best_binary(version)
job = threading.Thread(
@@ -84,6 +83,7 @@ def run_study(
job_id,
launcher_parameters,
),
+ name=f"{self.__class__.__name__}-JobRunner",
)
job.start()
@@ -144,23 +144,21 @@ def stop_reading_output() -> bool:
stop_reading_output,
None,
),
+ name=f"{self.__class__.__name__}-LogsWatcher",
daemon=True,
)
thread.start()
- while True:
- if process.poll() is not None:
- break
+ while process.poll() is None:
time.sleep(1)
- if launcher_parameters is not None:
- if (
- launcher_parameters.post_processing
- or launcher_parameters.adequacy_patch is not None
- ):
- subprocess.run(
- ["Rscript", "post-processing.R"], cwd=export_path
- )
+ if launcher_parameters is not None and (
+ launcher_parameters.post_processing
+ or launcher_parameters.adequacy_patch is not None
+ ):
+ subprocess.run(
+ ["Rscript", "post-processing.R"], cwd=export_path
+ )
output_id: Optional[str] = None
try:
diff --git a/antarest/launcher/adapters/log_manager.py b/antarest/launcher/adapters/log_manager.py
index a7d53b16f8..afac2a2da1 100644
--- a/antarest/launcher/adapters/log_manager.py
+++ b/antarest/launcher/adapters/log_manager.py
@@ -32,6 +32,7 @@ def track(
target=lambda: self._follow(
log_path, handler, self._stop_tracking(str(log_path))
),
+ name=f"{self.__class__.__name__}-LogsWatcher",
daemon=True,
)
self.tracked_logs[str(log_path)] = thread
diff --git a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py
index a033bd1b26..ae247009f8 100644
--- a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py
+++ b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py
@@ -6,11 +6,10 @@
import tempfile
import threading
import time
+import traceback
from copy import deepcopy
from pathlib import Path
-from typing import Callable, Optional, Dict, Awaitable, List
-
-from filelock import FileLock
+from typing import Awaitable, Callable, Dict, List, Optional, cast
from antareslauncher.data_repo.data_repo_tinydb import DataRepoTinydb
from antareslauncher.main import MainParameters, run_with
@@ -21,27 +20,25 @@
from antareslauncher.study_dto import StudyDTO
from antarest.core.config import Config, SlurmConfig
from antarest.core.interfaces.cache import ICache
-from antarest.core.interfaces.eventbus import (
- IEventBus,
- Event,
- EventType,
-)
+from antarest.core.interfaces.eventbus import Event, EventType, IEventBus
+from antarest.core.model import PermissionInfo, PublicMode
from antarest.core.requests import RequestParameters
from antarest.core.utils.utils import assert_this, unzip
from antarest.launcher.adapters.abstractlauncher import (
AbstractLauncher,
- LauncherInitException,
LauncherCallbacks,
+ LauncherInitException,
)
from antarest.launcher.adapters.log_manager import LogTailManager
from antarest.launcher.model import (
JobStatus,
LauncherParametersDTO,
- XpansionParametersDTO,
LogType,
+ XpansionParametersDTO,
)
from antarest.study.storage.rawstudy.io.reader import IniReader
from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter
+from filelock import FileLock
logger = logging.getLogger(__name__)
logging.getLogger("paramiko").setLevel("WARN")
@@ -76,7 +73,7 @@ def __init__(
) -> None:
super().__init__(config, callbacks, event_bus, cache)
if config.launcher.slurm is None:
- raise LauncherInitException()
+ raise LauncherInitException("Missing parameter 'launcher.slurm'")
self.slurm_config: SlurmConfig = config.launcher.slurm
self.check_state: bool = True
@@ -88,18 +85,18 @@ def __init__(
self.job_list: List[str] = []
self._check_config()
self.antares_launcher_lock = threading.Lock()
- with FileLock(LOCK_FILE_NAME):
+
+ # use an absolute path instead of `LOCK_FILE_NAME`:
+ local_workspace_dir = Path(self.slurm_config.local_workspace)
+ with FileLock(local_workspace_dir.joinpath(LOCK_FILE_NAME)):
self.local_workspace = self._init_workspace(use_private_workspace)
+ self.log_tail_manager = LogTailManager(local_workspace_dir)
+
+ # fmt: off
+ self.launcher_args = self._init_launcher_arguments(self.local_workspace)
+ self.launcher_params = self._init_launcher_parameters(self.local_workspace)
+ # fmt: on
- self.log_tail_manager = LogTailManager(
- Path(self.slurm_config.local_workspace)
- )
- self.launcher_args = self._init_launcher_arguments(
- self.local_workspace
- )
- self.launcher_params = self._init_launcher_parameters(
- self.local_workspace
- )
self.data_repo_tinydb = DataRepoTinydb(
database_file_path=(
self.launcher_params.json_dir
@@ -117,34 +114,33 @@ def _check_config(self) -> None:
) # and check write permission
def _init_workspace(self, use_private_workspace: bool) -> Path:
- if use_private_workspace:
- for (
- existing_workspace
- ) in self.slurm_config.local_workspace.iterdir():
- lock_file = existing_workspace / WORKSPACE_LOCK_FILE_NAME
- if (
- existing_workspace.is_dir()
- and existing_workspace
- != self.slurm_config.local_workspace / LOG_DIR_NAME
- and not lock_file.exists()
- ):
- logger.info(
- f"Initiating slurm workspace into existing directory {existing_workspace}"
- )
- lock_file.touch()
- return existing_workspace
- new_workspace = Path(
- tempfile.mkdtemp(dir=str(self.slurm_config.local_workspace))
- )
- lock_file = new_workspace / WORKSPACE_LOCK_FILE_NAME
- lock_file.touch()
- logger.info(
- f"Initiating slurm workspace in new directory {new_workspace}"
- )
- return new_workspace
- else:
+ if not use_private_workspace:
return Path(self.slurm_config.local_workspace)
+ for existing_workspace in self.slurm_config.local_workspace.iterdir():
+ lock_file = existing_workspace / WORKSPACE_LOCK_FILE_NAME
+ if (
+ existing_workspace.is_dir()
+ and existing_workspace
+ != self.slurm_config.local_workspace / LOG_DIR_NAME
+ and not lock_file.exists()
+ ):
+ logger.info(
+ f"Initiating slurm workspace into existing directory {existing_workspace}"
+ )
+ lock_file.touch()
+ return existing_workspace
+
+ new_workspace = Path(
+ tempfile.mkdtemp(dir=str(self.slurm_config.local_workspace))
+ )
+ lock_file = new_workspace / WORKSPACE_LOCK_FILE_NAME
+ lock_file.touch()
+ logger.info(
+ f"Initiating slurm workspace in new directory {new_workspace}"
+ )
+ return new_workspace
+
def _retrieve_running_jobs(self) -> None:
if len(self.data_repo_tinydb.get_list_of_studies()) > 0:
logger.info("Old job retrieved, starting loop")
@@ -158,7 +154,11 @@ def _loop(self) -> None:
def start(self) -> None:
logger.info("Starting slurm_launcher loop")
self.check_state = True
- self.thread = threading.Thread(target=self._loop, daemon=True)
+ self.thread = threading.Thread(
+ target=self._loop,
+ name=self.__class__.__name__,
+ daemon=True,
+ )
self.thread.start()
def stop(self) -> None:
@@ -196,8 +196,8 @@ def _init_launcher_arguments(
parser: MainOptionParser = MainOptionParser(main_options_parameters)
parser.add_basic_arguments()
parser.add_advanced_arguments()
- arguments = parser.parse_args([])
+ arguments = cast(argparse.Namespace, parser.parse_args([]))
arguments.wait_mode = False
arguments.check_queue = False
arguments.json_ssh_config = None
@@ -206,12 +206,13 @@ def _init_launcher_arguments(
arguments.version = False
arguments.post_processing = False
arguments.other_options = None
+
return arguments
def _init_launcher_parameters(
self, local_workspace: Optional[Path] = None
) -> MainParameters:
- main_parameters = MainParameters(
+ return MainParameters(
json_dir=local_workspace or self.slurm_config.local_workspace,
default_json_db_name=self.slurm_config.default_json_db_name,
slurm_script_path=self.slurm_config.slurm_script_path,
@@ -226,16 +227,17 @@ def _init_launcher_parameters(
},
db_primary_key="name",
)
- return main_parameters
def _delete_workspace_file(self, study_path: Path) -> None:
- logger.info(f"Deleting workspace file at {study_path}")
- if self.local_workspace.absolute() in study_path.absolute().parents:
- if study_path.exists():
- if study_path.is_dir():
- shutil.rmtree(study_path)
- else:
- os.unlink(study_path)
+ if (
+ self.local_workspace.absolute() in study_path.absolute().parents
+ and study_path.exists()
+ ):
+ logger.info(f"Deleting workspace file at {study_path}")
+ if study_path.is_dir():
+ shutil.rmtree(study_path)
+ else:
+ os.unlink(study_path)
def _import_study_output(
self,
@@ -272,6 +274,9 @@ def _import_study_output(
}.items()
if log_path
}
+
+ # The following callback is actually calling:
+ # `antarest.launcher.service.LauncherService._import_output`
return self.callbacks.import_output(
job_id,
self.local_workspace / STUDIES_OUTPUT_DIR_NAME / job_id / "output",
@@ -305,7 +310,7 @@ def _import_xpansion_result(self, job_id: str, xpansion_mode: str) -> None:
if (output_path / "updated_links").exists():
logger.warning("Skipping updated links")
self.callbacks.append_after_log(
- job_id, f"Skipping updated links"
+ job_id, "Skipping updated links"
)
else:
shutil.copytree(
@@ -339,58 +344,112 @@ def _check_studies_state(self) -> None:
logger.info("Could not get data on remote server", exc_info=e)
study_list = self.data_repo_tinydb.get_list_of_studies()
-
- nb_study_done = 0
- studies_to_cleanup = []
for study in study_list:
- nb_study_done += 1 if (study.finished or study.with_error) else 0
- if study.done:
- try:
- studies_to_cleanup.append(study.name)
- self.log_tail_manager.stop_tracking(
- SlurmLauncher._get_log_path(study)
- )
- output_id: Optional[str] = None
- try:
- output_id = self._import_study_output(
- study.name,
- study.xpansion_mode,
- study.job_log_dir,
- )
- except Exception as e:
- self.callbacks.append_after_log(
- study.name,
- f"Unexpected error when importing study output : {str(e)}",
- )
- raise e
- finally:
- self.callbacks.update_status(
- study.name,
- JobStatus.FAILED
- if study.with_error or output_id is None
- else JobStatus.SUCCESS,
- None,
- output_id,
- )
- except Exception as e:
- logger.error(
- f"Failed to finalize study {study.name} launch",
- exc_info=e,
- )
+ log_path = SlurmLauncher._get_log_path(study)
+ if study.with_error:
+ self.log_tail_manager.stop_tracking(log_path)
+ self._handle_failure(study)
+ elif study.done:
+ self.log_tail_manager.stop_tracking(log_path)
+ self._handle_success(study)
else:
+ # study.started => still running
+ # study.finished => waiting for ZIP + logs retrieval (or failure)
self.log_tail_manager.track(
- SlurmLauncher._get_log_path(study),
- self.create_update_log(study.name),
+ log_path, self.create_update_log(study.name)
)
- # we refetch study list here because by the time the import_output is done, maybe some new studies has been added
- # also we clean up the study after because it remove the study in the database
+ # Re-fetching the study list is necessary as new studies may have been added
+ # during the `import_output` process. Afterward, we clean up the list to ensure
+ # that any removed studies are removed from the database.
with self.antares_launcher_lock:
- nb_studies = self.data_repo_tinydb.get_list_of_studies()
- for study_id in studies_to_cleanup:
- self._clean_up_study(study_id)
- if nb_study_done == len(nb_studies):
+ # fmt: off
+ cleanup_list = [s for s in study_list if s.with_error or s.done]
+ for study in cleanup_list:
+ self._clean_up_study(study.name)
+ updated_list = self.data_repo_tinydb.get_list_of_studies()
+ if {s.name for s in updated_list} == {s.name for s in cleanup_list}:
self.stop()
+ # fmt: on
+
+ def _handle_failure(self, study: StudyDTO) -> None:
+ """
+ The simulation failed (`study.with_error == True`),
+ we can try to download output results,
+ but we expect to find no `output` directory
+
+ Args:
+ study: Study extracted from the SLURM database.
+ """
+ # sourcery skip: extract-duplicate-method
+ try:
+ output_id = self._import_study_output(
+ study.name,
+ study.xpansion_mode,
+ study.job_log_dir,
+ )
+ except FileNotFoundError:
+ msg = "Simulation failed, output results are not available"
+ self.callbacks.append_after_log(study.name, msg)
+ # see antarest.launcher.service.LauncherService.update
+ self.callbacks.update_status(
+ study.name, JobStatus.FAILED, msg, None
+ )
+ except Exception as e:
+ stack_trace = traceback.format_exc()
+ msg = (
+ f"An error occurred unexpectedly while trying to import the study output:"
+ f" {study.name=}, {study.xpansion_mode=}, {study.job_log_dir=},"
+ f" see stack trace below:\n{stack_trace}"
+ )
+ self.callbacks.append_after_log(study.name, msg)
+ self.callbacks.update_status(
+ study.name, JobStatus.FAILED, msg, None
+ )
+ logger.error(msg, exc_info=e)
+ raise
+ else:
+ msg = "Simulation failed (even if some output results may be available)"
+ self.callbacks.append_after_log(study.name, msg)
+ self.callbacks.update_status(
+ study.name, JobStatus.FAILED, msg, output_id
+ )
+
+ def _handle_success(self, study: StudyDTO) -> None:
+ """
+ The simulation succeed (`study.done == True`),
+ in that case, we have the guarantee that:
+
+ - logs are downloaded,
+ - result ZIPs are downloaded and unarchived to `output`,
+ - the server is clean (a.k.a. input and output ZIPs are removed from remote)
+
+ Args:
+ study: Study extracted from the SLURM database.
+ """
+ try:
+ output_id = self._import_study_output(
+ study.name,
+ study.xpansion_mode,
+ study.job_log_dir,
+ )
+ except Exception as e:
+ stack_trace = traceback.format_exc()
+ msg = (
+ f"An error occurred unexpectedly while importing the study output:"
+ f" {study.name=}, {study.xpansion_mode=}, {study.job_log_dir=},"
+ f" see stack trace below:\n{stack_trace}"
+ )
+ self.callbacks.append_after_log(study.name, msg)
+ self.callbacks.update_status(
+ study.name, JobStatus.FAILED, msg, None
+ )
+ logger.error(msg, exc_info=e)
+ raise
+ else:
+ self.callbacks.update_status(
+ study.name, JobStatus.SUCCESS, None, output_id
+ )
@staticmethod
def _get_log_path(
@@ -401,24 +460,18 @@ def _get_log_path(
@staticmethod
def _find_log_dir(base_log_dir: Path, job_id: str) -> Optional[Path]:
- if base_log_dir.exists() and base_log_dir.is_dir():
- for fname in os.listdir(base_log_dir):
- if fname.startswith(job_id):
- return base_log_dir / fname
- return None
+ pattern = f"{job_id}*"
+ return next(iter(base_log_dir.glob(pattern)), None)
@staticmethod
def _get_log_path_from_log_dir(
log_dir: Path, log_type: LogType = LogType.STDOUT
) -> Optional[Path]:
- log_prefix = (
- "antares-out-" if log_type == LogType.STDOUT else "antares-err-"
- )
- if log_dir.exists() and log_dir.is_dir():
- for fname in os.listdir(log_dir):
- if fname.startswith(log_prefix):
- return log_dir / fname
- return None
+ pattern = {
+ LogType.STDOUT: "antares-out-*",
+ LogType.STDERR: "antares-err-*",
+ }[log_type]
+ return next(iter(log_dir.glob(pattern)), None)
def _clean_local_workspace(self) -> None:
logger.info("Cleaning up slurm workspace")
@@ -430,16 +483,6 @@ def _clean_local_workspace(self) -> None:
elif os.path.isdir(file_path):
shutil.rmtree(file_path)
- def _assert_study_version_is_supported(self, study_version: str) -> None:
- if (
- str(study_version)
- not in self.slurm_config.antares_versions_on_remote_server
- ):
- raise VersionNotSupportedError(
- f"Study version ({study_version}) is not supported. Currently supported versions are"
- f" {', '.join(self.slurm_config.antares_versions_on_remote_server)}"
- )
-
def _clean_up_study(self, launch_id: str) -> None:
logger.info(f"Cleaning up study with launch_id {launch_id}")
self.data_repo_tinydb.remove_study(launch_id)
@@ -458,16 +501,6 @@ def _clean_up_study(self, launch_id: str) -> None:
):
self._delete_workspace_file(finished_zip)
- @staticmethod
- def _override_solver_version(study_path: Path, version: str) -> None:
- study_info_path = study_path / "study.antares"
- study_info = IniReader().read(study_info_path)
- if "antares" in study_info:
- study_info["antares"]["solver_version"] = version
- IniWriter().write(study_info, study_info_path)
- else:
- logger.warning("Failed to find antares study info")
-
def _run_study(
self,
study_uuid: str,
@@ -475,62 +508,71 @@ def _run_study(
launcher_params: LauncherParametersDTO,
version: str,
) -> None:
- study_path = Path(self.launcher_args.studies_in) / str(launch_uuid)
+ study_path = Path(self.launcher_args.studies_in) / launch_uuid
+
+ # `append_log` is a function alias for readability ;-)
+ append_log = self.callbacks.append_before_log
with self.antares_launcher_lock:
+ # noinspection PyBroadException
try:
# export study
+ append_log(launch_uuid, "Exporting study...")
self.callbacks.export_study(
launch_uuid, study_uuid, study_path, launcher_params
)
- self._assert_study_version_is_supported(version)
- SlurmLauncher._override_solver_version(study_path, version)
+ append_log(launch_uuid, "Checking study version...")
+ available_versions = (
+ self.slurm_config.antares_versions_on_remote_server
+ )
+ if version not in available_versions:
+ raise VersionNotSupportedError(
+ f"Study version '{version}' is not supported. Currently supported versions are"
+ f" {', '.join(available_versions)}"
+ )
+ _override_solver_version(study_path, version)
+ append_log(launch_uuid, "Submitting study to slurm launcher")
launcher_args = self._check_and_apply_launcher_params(
launcher_params
)
- self.callbacks.append_before_log(
- launch_uuid, f"Submitting study to slurm launcher"
- )
-
self._call_launcher(launcher_args, self.launcher_params)
launch_success = self._check_if_study_is_in_launcher_db(
launch_uuid
)
if launch_success:
- self.callbacks.append_before_log(
- launch_uuid, f"Study submitted"
- )
+ append_log(launch_uuid, "Study submitted")
logger.info("Study exported and run with launcher")
else:
self.callbacks.append_after_log(
launch_uuid,
- f"Study not submitted. The study configuration may be incorrect",
+ "Study not submitted. The study configuration may be incorrect",
)
logger.warning(
f"Study {study_uuid} with job id {launch_uuid} does not seem to have been launched"
)
self.callbacks.update_status(
- str(launch_uuid),
+ launch_uuid,
JobStatus.RUNNING if launch_success else JobStatus.FAILED,
None,
None,
)
except Exception as e:
- logger.error(
- f"Failed to launch study {study_uuid}", exc_info=e
- )
- self.callbacks.append_after_log(
- launch_uuid,
- f"Unexpected error when launching study : {str(e)}",
+ stack_trace = traceback.format_exc()
+ msg = (
+ f"Failed to launch study {study_uuid}:"
+ f" see stack trace below:\n{stack_trace}"
)
+ self.callbacks.append_after_log(launch_uuid, msg)
self.callbacks.update_status(
- str(launch_uuid), JobStatus.FAILED, str(e), None
+ launch_uuid, JobStatus.FAILED, msg, None
)
- self._clean_up_study(str(launch_uuid))
+ self._clean_up_study(launch_uuid)
+ logger.error(msg, exc_info=e)
+ raise
finally:
self._delete_workspace_file(study_path)
@@ -544,10 +586,7 @@ def _call_launcher(
def _check_if_study_is_in_launcher_db(self, job_id: str) -> bool:
studies = self.data_repo_tinydb.get_list_of_studies()
- for s in studies:
- if s.name == job_id:
- return True
- return False
+ return any(s.name == job_id for s in studies)
def _check_and_apply_launcher_params(
self, launcher_params: LauncherParametersDTO
@@ -572,12 +611,14 @@ def _check_and_apply_launcher_params(
if time_limit and isinstance(time_limit, int):
if MIN_TIME_LIMIT > time_limit:
logger.warning(
- f"Invalid slurm launcher time limit ({time_limit}), should be higher than {MIN_TIME_LIMIT}. Using min limit."
+ f"Invalid slurm launcher time limit ({time_limit}),"
+ f" should be higher than {MIN_TIME_LIMIT}. Using min limit."
)
launcher_args.time_limit = MIN_TIME_LIMIT
elif time_limit >= MAX_TIME_LIMIT:
logger.warning(
- f"Invalid slurm launcher time limit ({time_limit}), should be lower than {MAX_TIME_LIMIT}. Using max limit."
+ f"Invalid slurm launcher time limit ({time_limit}),"
+ f" should be lower than {MAX_TIME_LIMIT}. Using max limit."
)
launcher_args.time_limit = MAX_TIME_LIMIT - 3600
else:
@@ -613,6 +654,7 @@ def run_study(
thread = threading.Thread(
target=self._run_study,
args=(study_uuid, job_id, launcher_parameters, version),
+ name=f"{self.__class__.__name__}-JobRunner",
)
thread.start()
@@ -623,17 +665,13 @@ def get_log(self, job_id: str, log_type: LogType) -> Optional[str]:
log_path = SlurmLauncher._get_log_path(study, log_type)
if log_path:
return log_path.read_text()
- # when this is not the current worker handling this job (found in data_repo_tinydb)
- log_dir = SlurmLauncher._find_log_dir(
+ if log_dir := SlurmLauncher._find_log_dir(
Path(self.launcher_args.log_dir) / "JOB_LOGS", job_id
- )
- if log_dir:
+ ):
log_path = SlurmLauncher._get_log_path_from_log_dir(
log_dir, log_type
)
- if log_path:
- return log_path.read_text()
- return None
+ return log_path.read_text() if log_path else None
def _create_event_listener(self) -> Callable[[Event], Awaitable[None]]:
async def _listen_to_kill_job(event: Event) -> None:
@@ -654,7 +692,11 @@ def kill_job(self, job_id: str, dispatch: bool = True) -> None:
return
if dispatch:
self.event_bus.push(
- Event(type=EventType.STUDY_JOB_CANCEL_REQUEST, payload=job_id)
+ Event(
+ type=EventType.STUDY_JOB_CANCEL_REQUEST,
+ payload=job_id,
+ permissions=PermissionInfo(public_mode=PublicMode.NONE),
+ )
)
self.callbacks.update_status(
job_id,
@@ -662,3 +704,13 @@ def kill_job(self, job_id: str, dispatch: bool = True) -> None:
None,
None,
)
+
+
+def _override_solver_version(study_path: Path, version: str) -> None:
+ study_info_path = study_path / "study.antares"
+ study_info = IniReader().read(study_info_path)
+ if "antares" in study_info:
+ study_info["antares"]["solver_version"] = version
+ IniWriter().write(study_info, study_info_path)
+ else:
+ logger.warning("Failed to find antares study info")
diff --git a/antarest/launcher/service.py b/antarest/launcher/service.py
index c335e27f7d..45330ef940 100644
--- a/antarest/launcher/service.py
+++ b/antarest/launcher/service.py
@@ -5,7 +5,7 @@
from functools import reduce
from http import HTTPStatus
from pathlib import Path
-from typing import List, Optional, cast, Dict
+from typing import Dict, List, Optional, cast
from uuid import UUID, uuid4
from fastapi import HTTPException
@@ -16,29 +16,24 @@
from antarest.core.filetransfer.service import FileTransferManager
from antarest.core.interfaces.cache import ICache
from antarest.core.interfaces.eventbus import (
- IEventBus,
Event,
- EventType,
EventChannelDirectory,
+ EventType,
+ IEventBus,
)
-from antarest.core.jwt import JWTUser, DEFAULT_ADMIN_USER
-from antarest.core.model import (
- StudyPermissionType,
-)
-from antarest.core.requests import (
- RequestParameters,
- UserHasNotPermissionError,
-)
+from antarest.core.jwt import DEFAULT_ADMIN_USER, JWTUser
+from antarest.core.model import PermissionInfo, PublicMode, StudyPermissionType
+from antarest.core.requests import RequestParameters, UserHasNotPermissionError
from antarest.core.tasks.model import TaskResult, TaskType
-from antarest.core.tasks.service import TaskUpdateNotifier, ITaskService
+from antarest.core.tasks.service import ITaskService, TaskUpdateNotifier
from antarest.core.utils.fastapi_sqlalchemy import db
from antarest.core.utils.utils import (
- concat_files,
- zip_dir,
StopWatch,
+ concat_files,
+ concat_files_to_str,
is_zip,
read_in_zip,
- concat_files_to_str,
+ zip_dir,
)
from antarest.launcher.adapters.abstractlauncher import LauncherCallbacks
from antarest.launcher.adapters.factory_launcher import FactoryLauncher
@@ -47,19 +42,18 @@
)
from antarest.launcher.extensions.interface import ILauncherExtension
from antarest.launcher.model import (
- JobResult,
- JobStatus,
JobLog,
JobLogType,
+ JobResult,
+ JobStatus,
LauncherParametersDTO,
- XpansionParametersDTO,
LogType,
+ XpansionParametersDTO,
)
from antarest.launcher.repository import JobResultRepository
from antarest.study.service import StudyService
from antarest.study.storage.utils import (
assert_permission,
- create_permission_from_study,
extract_output_name,
find_single_output_path,
)
@@ -200,6 +194,9 @@ def update(
if final_status
else EventType.STUDY_JOB_STATUS_UPDATE,
payload=job_result.to_dto().dict(),
+ permissions=PermissionInfo(
+ public_mode=PublicMode.READ
+ ),
channel=EventChannelDirectory.JOB_STATUS
+ job_result.id,
)
@@ -281,7 +278,7 @@ def run_study(
Event(
type=EventType.STUDY_JOB_STARTED,
payload=job_status.to_dto().dict(),
- permissions=create_permission_from_study(study_info),
+ permissions=PermissionInfo.from_study(study_info),
)
)
return job_uuid
@@ -314,6 +311,7 @@ def kill_job(self, job_id: str, params: RequestParameters) -> JobResult:
Event(
type=EventType.STUDY_JOB_CANCELLED,
payload=job_status.to_dto().dict(),
+ permissions=PermissionInfo.from_study(study),
channel=EventChannelDirectory.JOB_STATUS + job_result.id,
)
)
diff --git a/antarest/study/business/area_management.py b/antarest/study/business/area_management.py
index d28d726333..1f6402286f 100644
--- a/antarest/study/business/area_management.py
+++ b/antarest/study/business/area_management.py
@@ -168,6 +168,12 @@ def get_layers(self, study: RawStudy) -> List[LayerInfoDTO]:
if len(file_study.config.areas)
else {}
)
+
+ # if there is only 1 area, the area_ui object is not a dict keyed by area_id
+ area_list = list(file_study.config.areas.keys())
+ if len(area_list) == 1:
+ areas_ui = {area_list[0]: areas_ui}
+
if len(layers) == 0:
layers["0"] = "All"
layers_with_items = [
diff --git a/antarest/study/business/binding_constraint_management.py b/antarest/study/business/binding_constraint_management.py
index d5add93629..bff6596ec3 100644
--- a/antarest/study/business/binding_constraint_management.py
+++ b/antarest/study/business/binding_constraint_management.py
@@ -133,6 +133,20 @@ def process_constraint(
continue
return new_config
+ @staticmethod
+ def constraints_to_coeffs(
+ constraint: BindingConstraintDTO,
+ ) -> Dict[str, List[float]]:
+ coeffs: Dict[str, List[float]] = {}
+ if constraint.constraints is not None:
+ for term in constraint.constraints:
+ if term.id is not None and term.weight is not None:
+ coeffs[term.id] = [term.weight]
+ if term.offset is not None:
+ coeffs[term.id].append(term.offset)
+
+ return coeffs
+
def get_binding_constraint(
self, study: Study, constraint_id: Optional[str]
) -> Union[BindingConstraintDTO, List[BindingConstraintDTO], None]:
@@ -173,13 +187,6 @@ def update_binding_constraint(
if not isinstance(constraint, BindingConstraintDTO):
raise NoBindingConstraintError(study.id)
- coeffs = {}
- if constraint.constraints is not None:
- for term in constraint.constraints:
- coeffs[term.id] = [term.weight]
- if term.offset is not None:
- coeffs[term.id].append(term.offset)
-
command = UpdateBindingConstraint(
id=constraint.id,
enabled=data.value
@@ -191,7 +198,7 @@ def update_binding_constraint(
operator=data.value
if data.key == "operator"
else constraint.operator,
- coeffs=coeffs,
+ coeffs=BindingConstraintManager.constraints_to_coeffs(constraint),
values=constraint.values,
filter_year_by_year=data.value
if data.key == "filterByYear"
diff --git a/antarest/study/business/hydro_management.py b/antarest/study/business/hydro_management.py
index 6f77031e94..6c87c80358 100644
--- a/antarest/study/business/hydro_management.py
+++ b/antarest/study/business/hydro_management.py
@@ -5,6 +5,7 @@
from antarest.study.business.utils import (
FormFieldsBaseModel,
execute_or_add_commands,
+ FieldInfo,
)
from antarest.study.model import Study
from antarest.study.storage.storage_service import StudyStorageService
@@ -30,11 +31,6 @@ class ManagementOptionsFormFields(FormFieldsBaseModel):
pumping_efficiency: Optional[Union[StrictFloat, StrictInt]]
-class FieldInfo(TypedDict, total=False):
- path: str
- default_value: Any
-
-
HYDRO_PATH = "input/hydro/hydro"
FIELDS_INFO: Dict[str, FieldInfo] = {
diff --git a/antarest/study/business/optimization_management.py b/antarest/study/business/optimization_management.py
index 698ec76c2b..6c6daa85bf 100644
--- a/antarest/study/business/optimization_management.py
+++ b/antarest/study/business/optimization_management.py
@@ -1,7 +1,7 @@
from enum import Enum
-from typing import Optional, Union, Literal, List, Any, Dict, TypedDict
+from typing import Optional, Union, List, Any, Dict
-from pydantic.types import StrictBool
+from pydantic.types import StrictBool, StrictFloat, StrictInt
from antarest.study.business.utils import (
FormFieldsBaseModel,
@@ -45,6 +45,11 @@ class SimplexOptimizationRange(str, Enum):
WEEK = "week"
+class PriceTakingOrder(str, Enum):
+ DENS = "DENS"
+ LOAD = "Load"
+
+
class OptimizationFormFields(FormFieldsBaseModel):
binding_constraints: Optional[StrictBool]
hurdle_costs: Optional[StrictBool]
@@ -71,6 +76,13 @@ class OptimizationFormFields(FormFieldsBaseModel):
StrictBool
]
ntc_between_physical_areas_out_adequacy_patch: Optional[StrictBool]
+ # version 850
+ price_taking_order: Optional[PriceTakingOrder]
+ include_hurdle_cost_csr: Optional[StrictBool]
+ check_csr_cost_function: Optional[StrictBool]
+ threshold_initiate_curtailment_sharing_rule: Optional[StrictFloat]
+ threshold_display_local_matching_rule_violations: Optional[StrictFloat]
+ threshold_csr_variable_bounds_relaxation: Optional[StrictInt]
OPTIMIZATION_PATH = f"{GENERAL_DATA_PATH}/optimization"
@@ -151,6 +163,36 @@ class OptimizationFormFields(FormFieldsBaseModel):
"default_value": True,
"start_version": 830,
},
+ "price_taking_order": {
+ "path": f"{ADEQUACY_PATCH_PATH}/price-taking-order",
+ "default_value": "DENS",
+ "start_version": 850,
+ },
+ "include_hurdle_cost_csr": {
+ "path": f"{ADEQUACY_PATCH_PATH}/include-hurdle-cost-csr",
+ "default_value": False,
+ "start_version": 850,
+ },
+ "check_csr_cost_function": {
+ "path": f"{ADEQUACY_PATCH_PATH}/check-csr-cost-function",
+ "default_value": False,
+ "start_version": 850,
+ },
+ "threshold_initiate_curtailment_sharing_rule": {
+ "path": f"{ADEQUACY_PATCH_PATH}/threshold-initiate-curtailment-sharing-rule",
+ "default_value": 0.0,
+ "start_version": 850,
+ },
+ "threshold_display_local_matching_rule_violations": {
+ "path": f"{ADEQUACY_PATCH_PATH}/threshold-display-local-matching-rule-violations",
+ "default_value": 0.0,
+ "start_version": 850,
+ },
+ "threshold_csr_variable_bounds_relaxation": {
+ "path": f"{ADEQUACY_PATCH_PATH}/threshold-csr-variable-bounds-relaxation",
+ "default_value": 3,
+ "start_version": 850,
+ },
}
@@ -205,7 +247,7 @@ def set_field_values(
)
)
- if len(commands) > 0:
+ if commands:
file_study = self.storage_service.get_storage(study).get_raw(study)
execute_or_add_commands(
study, file_study, commands, self.storage_service
diff --git a/antarest/study/business/renewable_management.py b/antarest/study/business/renewable_management.py
new file mode 100644
index 0000000000..7481b6d4a8
--- /dev/null
+++ b/antarest/study/business/renewable_management.py
@@ -0,0 +1,115 @@
+from enum import Enum
+from pathlib import Path, PurePosixPath
+from typing import Union, Optional, Dict, TypedDict, Any, List
+
+from pydantic import StrictFloat, StrictInt, StrictStr, StrictBool
+
+from antarest.study.business.utils import (
+ execute_or_add_commands,
+ FormFieldsBaseModel,
+ FieldInfo,
+)
+from antarest.study.model import Study
+from antarest.study.storage.storage_service import StudyStorageService
+from antarest.study.storage.variantstudy.model.command.update_config import (
+ UpdateConfig,
+)
+
+
+class TimeSeriesInterpretation(str, Enum):
+ POWER_GENERATION = "power-generation"
+ PRODUCTION_FACTOR = "production-factor"
+
+
+RENEWABLE_PATH = "input/renewables/clusters/{area}/list/{cluster}"
+
+
+class RenewableFormFields(FormFieldsBaseModel):
+ group: Optional[StrictStr]
+ name: Optional[StrictStr]
+ ts_interpretation: Optional[TimeSeriesInterpretation]
+ unit_count: Optional[StrictInt]
+ enabled: Optional[StrictBool]
+ nominal_capacity: Optional[StrictInt]
+
+
+FIELDS_INFO: Dict[str, FieldInfo] = {
+ "group": {
+ "path": f"{RENEWABLE_PATH}/group",
+ "default_value": "",
+ },
+ "name": {
+ "path": f"{RENEWABLE_PATH}/name",
+ "default_value": "",
+ },
+ "ts_interpretation": {
+ "path": f"{RENEWABLE_PATH}/ts-interpretation",
+ "default_value": TimeSeriesInterpretation.POWER_GENERATION.value,
+ },
+ "unit_count": {
+ "path": f"{RENEWABLE_PATH}/unitcount",
+ "default_value": 0,
+ },
+ "enabled": {
+ "path": f"{RENEWABLE_PATH}/enabled",
+ "default_value": True,
+ },
+ "nominal_capacity": {
+ "path": f"{RENEWABLE_PATH}/nominalcapacity",
+ "default_value": 0,
+ },
+}
+
+
+def format_path(path: str, area_id: str, cluster_id: str) -> str:
+ return path.format(area=area_id, cluster=cluster_id)
+
+
+class RenewableManager:
+ def __init__(self, storage_service: StudyStorageService):
+ self.storage_service = storage_service
+
+ def get_field_values(
+ self, study: Study, area_id: str, cluster_id: str
+ ) -> RenewableFormFields:
+ file_study = self.storage_service.get_storage(study).get_raw(study)
+ renewable_config = file_study.tree.get(
+ format_path(RENEWABLE_PATH, area_id, cluster_id).split("/")
+ )
+
+ def get_value(field_info: FieldInfo) -> Any:
+ target_name = PurePosixPath(field_info["path"]).name
+ return renewable_config.get(
+ target_name, field_info["default_value"]
+ )
+
+ return RenewableFormFields.construct(
+ **{name: get_value(info) for name, info in FIELDS_INFO.items()}
+ )
+
+ def set_field_values(
+ self,
+ study: Study,
+ area_id: str,
+ cluster_id: str,
+ field_values: RenewableFormFields,
+ ) -> None:
+ commands: List[UpdateConfig] = []
+
+ for field_name, value in field_values.__iter__():
+ if value is not None:
+ info = FIELDS_INFO[field_name]
+
+ commands.append(
+ UpdateConfig(
+ target=format_path(info["path"], area_id, cluster_id),
+ data=value,
+ command_context=self.storage_service.variant_study_service.command_factory.command_context,
+ )
+ )
+
+ if commands:
+ file_study = self.storage_service.get_storage(study).get_raw(study)
+ execute_or_add_commands(
+ study, file_study, commands, self.storage_service
+ )
diff --git a/antarest/study/business/table_mode_management.py b/antarest/study/business/table_mode_management.py
index 9cc5ff5c35..1f7bf3a348 100644
--- a/antarest/study/business/table_mode_management.py
+++ b/antarest/study/business/table_mode_management.py
@@ -11,6 +11,16 @@
from pydantic import StrictFloat
from pydantic.types import StrictStr, StrictInt, StrictBool
+from antarest.study.business.binding_constraint_management import (
+ BindingConstraintManager,
+)
+from antarest.study.business.renewable_management import (
+ TimeSeriesInterpretation,
+)
+from antarest.study.business.thermal_management import (
+ TimeSeriesGenerationOption,
+ LawOption,
+)
from antarest.study.business.utils import (
FormFieldsBaseModel,
execute_or_add_commands,
@@ -23,6 +33,10 @@
FilteringOptions,
LinkProperties,
)
+from antarest.study.storage.variantstudy.model.command.icommand import ICommand
+from antarest.study.storage.variantstudy.model.command.update_binding_constraint import (
+ UpdateBindingConstraint,
+)
from antarest.study.storage.variantstudy.model.command.update_config import (
UpdateConfig,
)
@@ -32,6 +46,8 @@ class TableTemplateType(str, Enum):
AREA = "area"
LINK = "link"
CLUSTER = "cluster"
+ RENEWABLE = "renewable"
+ BINDING_CONSTRAINT = "binding constraint"
class AdequacyPatchMode(str, Enum):
@@ -54,15 +70,17 @@ class TransmissionCapacity(str, Enum):
ENABLED = "enabled"
-class TimeSeriesGenerationOption(str, Enum):
- USE_GLOBAL_PARAMETER = "use global parameter"
- FORCE_NO_GENERATION = "force no generation"
- FORCE_GENERATION = "force generation"
+class BindingConstraintType(str, Enum):
+ HOURLY = "hourly"
+ DAILY = "daily"
+ WEEKLY = "weekly"
-class LawOption(str, Enum):
- UNIFORM = "uniform"
- GEOMETRIC = "geometric"
+class BindingConstraintOperator(str, Enum):
+ LESS = "less"
+ GREATER = "greater"
+ BOTH = "both"
+ EQUAL = "equal"
class AreaColumns(FormFieldsBaseModel):
@@ -117,9 +135,22 @@ class ClusterColumns(FormFieldsBaseModel):
law_planned: Optional[LawOption]
+class RenewableColumns(FormFieldsBaseModel):
+ group: Optional[StrictStr]
+ ts_interpretation: Optional[TimeSeriesInterpretation]
+ enabled: Optional[StrictBool]
+ unit_count: Optional[StrictInt]
+ nominal_capacity: Optional[StrictInt]
+
+
+class BindingConstraintColumns(FormFieldsBaseModel):
+ type: Optional[BindingConstraintType]
+ operator: Optional[BindingConstraintOperator]
+ enabled: Optional[StrictBool]
+
+
class ColumnInfo(TypedDict):
- glob_path: str
- rel_glob_path: str
+ path: str
default_value: Any
@@ -129,232 +160,240 @@ class PathVars(TypedDict, total=False):
# Link
area1: str
area2: str
- # Cluster
+ # Cluster, Renewable
area: str
cluster: str
-AREA_FIELD_PATH_PREFIX = "input/areas/{id}/optimization"
-ECONOMIC_OPTIONS_PREFIX = "input/thermal/areas"
-LINK_FIELD_PATH_PREFIX = "input/links/{area1}/properties/{area2}"
-CLUSTER_FIELD_PATH_PREFIX = "input/thermal/clusters/{area}/list/{cluster}"
+AREA_FIELD_PATH_BASE = "input/areas/{id}/optimization"
+ECONOMIC_OPTIONS_PATH_BASE = "input/thermal/areas"
+LINK_FIELD_PATH_BASE = "input/links/{area1}/properties/{area2}"
+CLUSTER_FIELD_PATH_BASE = "input/thermal/clusters/{area}/list/{cluster}"
+RENEWABLE_FIELD_PATH_BASE = "input/renewables/clusters/{area}/list/{cluster}"
+BINDING_CONSTRAINT_FIELD_PATH_BASE = (
+ "input/bindingconstraints/bindingconstraints"
+)
FIELDS_INFO_BY_TYPE: Dict[TableTemplateType, Dict[str, ColumnInfo]] = {
TableTemplateType.AREA: {
"non_dispatchable_power": {
- "glob_path": AREA_FIELD_PATH_PREFIX,
- "rel_glob_path": "nodal optimization/non-dispatchable-power",
+ "path": f"{AREA_FIELD_PATH_BASE}/nodal optimization/non-dispatchable-power",
"default_value": NodalOptimization.NON_DISPATCHABLE_POWER,
},
"dispatchable_hydro_power": {
- "glob_path": AREA_FIELD_PATH_PREFIX,
- "rel_glob_path": "nodal optimization/dispatchable-hydro-power",
+ "path": f"{AREA_FIELD_PATH_BASE}/nodal optimization/dispatchable-hydro-power",
"default_value": NodalOptimization.DISPATCHABLE_HYDRO_POWER,
},
"other_dispatchable_power": {
- "glob_path": AREA_FIELD_PATH_PREFIX,
- "rel_glob_path": "nodal optimization/other-dispatchable-power",
+ "path": f"{AREA_FIELD_PATH_BASE}/nodal optimization/other-dispatchable-power",
"default_value": NodalOptimization.OTHER_DISPATCHABLE_POWER,
},
"average_unsupplied_energy_cost": {
- "glob_path": ECONOMIC_OPTIONS_PREFIX,
- "rel_glob_path": "unserverdenergycost",
+ "path": f"{ECONOMIC_OPTIONS_PATH_BASE}/unserverdenergycost/{{id}}",
"default_value": NodalOptimization.SPREAD_UNSUPPLIED_ENERGY_COST,
},
"spread_unsupplied_energy_cost": {
- "glob_path": AREA_FIELD_PATH_PREFIX,
- "rel_glob_path": "nodal optimization/spread-unsupplied-energy-cost",
+ "path": f"{AREA_FIELD_PATH_BASE}/nodal optimization/spread-unsupplied-energy-cost",
"default_value": NodalOptimization.SPREAD_UNSUPPLIED_ENERGY_COST,
},
"average_spilled_energy_cost": {
- "glob_path": ECONOMIC_OPTIONS_PREFIX,
- "rel_glob_path": "spilledenergycost",
+ "path": f"{ECONOMIC_OPTIONS_PATH_BASE}/spilledenergycost/{{id}}",
"default_value": NodalOptimization.SPREAD_SPILLED_ENERGY_COST,
},
"spread_spilled_energy_cost": {
- "glob_path": AREA_FIELD_PATH_PREFIX,
- "rel_glob_path": "nodal optimization/spread-spilled-energy-cost",
+ "path": f"{AREA_FIELD_PATH_BASE}/nodal optimization/spread-spilled-energy-cost",
"default_value": NodalOptimization.SPREAD_SPILLED_ENERGY_COST,
},
"filter_synthesis": {
- "glob_path": AREA_FIELD_PATH_PREFIX,
- "rel_glob_path": "filtering/filter-synthesis",
+ "path": f"{AREA_FIELD_PATH_BASE}/filtering/filter-synthesis",
"default_value": FilteringOptions.FILTER_SYNTHESIS,
},
"filter_year_by_year": {
- "glob_path": AREA_FIELD_PATH_PREFIX,
- "rel_glob_path": "filtering/filter-year-by-year",
+ "path": f"{AREA_FIELD_PATH_BASE}/filtering/filter-year-by-year",
"default_value": FilteringOptions.FILTER_YEAR_BY_YEAR,
},
"adequacy_patch_mode": {
- "glob_path": AREA_FIELD_PATH_PREFIX,
- "rel_glob_path": "adequacy_patch/adequacy-patch/adequacy-patch-mode",
+ "path": f"{AREA_FIELD_PATH_BASE}/adequacy_patch/adequacy-patch/adequacy-patch-mode",
"default_value": AdequacyPatchMode.OUTSIDE.value,
},
},
TableTemplateType.LINK: {
"hurdles_cost": {
- "glob_path": LINK_FIELD_PATH_PREFIX,
- "rel_glob_path": "hurdles-cost",
+ "path": f"{LINK_FIELD_PATH_BASE}/hurdles-cost",
"default_value": LinkProperties.HURDLES_COST,
},
"loop_flow": {
- "glob_path": LINK_FIELD_PATH_PREFIX,
- "rel_glob_path": "loop-flow",
+ "path": f"{LINK_FIELD_PATH_BASE}/loop-flow",
"default_value": LinkProperties.LOOP_FLOW,
},
"use_phase_shifter": {
- "glob_path": LINK_FIELD_PATH_PREFIX,
- "rel_glob_path": "use-phase-shifter",
+ "path": f"{LINK_FIELD_PATH_BASE}/use-phase-shifter",
"default_value": LinkProperties.USE_PHASE_SHIFTER,
},
"transmission_capacities": {
- "glob_path": LINK_FIELD_PATH_PREFIX,
- "rel_glob_path": "transmission-capacities",
+ "path": f"{LINK_FIELD_PATH_BASE}/transmission-capacities",
"default_value": LinkProperties.TRANSMISSION_CAPACITIES,
},
"asset_type": {
- "glob_path": LINK_FIELD_PATH_PREFIX,
- "rel_glob_path": "asset-type",
+ "path": f"{LINK_FIELD_PATH_BASE}/asset-type",
"default_value": LinkProperties.ASSET_TYPE,
},
"link_style": {
- "glob_path": LINK_FIELD_PATH_PREFIX,
- "rel_glob_path": "link-style",
+ "path": f"{LINK_FIELD_PATH_BASE}/link-style",
"default_value": LinkProperties.LINK_STYLE,
},
"link_width": {
- "glob_path": LINK_FIELD_PATH_PREFIX,
- "rel_glob_path": "link-width",
+ "path": f"{LINK_FIELD_PATH_BASE}/link-width",
"default_value": LinkProperties.LINK_WIDTH,
},
"display_comments": {
- "glob_path": LINK_FIELD_PATH_PREFIX,
- "rel_glob_path": "display-comments",
+ "path": f"{LINK_FIELD_PATH_BASE}/display-comments",
"default_value": LinkProperties.DISPLAY_COMMENTS,
},
"filter_synthesis": {
- "glob_path": LINK_FIELD_PATH_PREFIX,
- "rel_glob_path": "filter-synthesis",
+ "path": f"{LINK_FIELD_PATH_BASE}/filter-synthesis",
"default_value": FilteringOptions.FILTER_SYNTHESIS,
},
"filter_year_by_year": {
- "glob_path": LINK_FIELD_PATH_PREFIX,
- "rel_glob_path": "filter-year-by-year",
+ "path": f"{LINK_FIELD_PATH_BASE}/filter-year-by-year",
"default_value": FilteringOptions.FILTER_YEAR_BY_YEAR,
},
},
TableTemplateType.CLUSTER: {
"group": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "group",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/group",
"default_value": "",
},
"enabled": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "enabled",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/enabled",
"default_value": True,
},
"must_run": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "must-run",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/must-run",
"default_value": False,
},
"unit_count": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "unitcount",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/unitcount",
"default_value": 0,
},
"nominal_capacity": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "nominalcapacity",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/nominalcapacity",
"default_value": 0,
},
"min_stable_power": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "min-stable-power",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/min-stable-power",
"default_value": 0,
},
"spinning": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "spinning",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/spinning",
"default_value": 0,
},
"min_up_time": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "min-up-time",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/min-up-time",
"default_value": 1,
},
"min_down_time": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "min-down-time",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/min-down-time",
"default_value": 1,
},
"co2": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "co2",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/co2",
"default_value": 0,
},
"marginal_cost": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "marginal-cost",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/marginal-cost",
"default_value": 0,
},
"fixed_cost": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "fixed-cost",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/fixed-cost",
"default_value": 0,
},
"startup_cost": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "startup-cost",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/startup-cost",
"default_value": 0,
},
"market_bid_cost": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "market-bid-cost",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/market-bid-cost",
"default_value": 0,
},
"spread_cost": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "spread-cost",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/spread-cost",
"default_value": 0,
},
"ts_gen": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "gen-ts",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/gen-ts",
"default_value": TimeSeriesGenerationOption.USE_GLOBAL_PARAMETER.value,
},
"volatility_forced": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "volatility.forced",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/volatility.forced",
"default_value": 0,
},
"volatility_planned": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "volatility.planned",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/volatility.planned",
"default_value": 0,
},
"law_forced": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "law.forced",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/law.forced",
"default_value": LawOption.UNIFORM.value,
},
"law_planned": {
- "glob_path": CLUSTER_FIELD_PATH_PREFIX,
- "rel_glob_path": "law.planned",
+ "path": f"{CLUSTER_FIELD_PATH_BASE}/law.planned",
"default_value": LawOption.UNIFORM.value,
},
},
+ TableTemplateType.RENEWABLE: {
+ "group": {
+ "path": f"{RENEWABLE_FIELD_PATH_BASE}/group",
+ "default_value": "",
+ },
+ "ts_interpretation": {
+ "path": f"{RENEWABLE_FIELD_PATH_BASE}/ts-interpretation",
+ "default_value": TimeSeriesInterpretation.POWER_GENERATION.value,
+ },
+ "enabled": {
+ "path": f"{RENEWABLE_FIELD_PATH_BASE}/enabled",
+ "default_value": True,
+ },
+ "unit_count": {
+ "path": f"{RENEWABLE_FIELD_PATH_BASE}/unitcount",
+ "default_value": 0,
+ },
+ "nominal_capacity": {
+ "path": f"{RENEWABLE_FIELD_PATH_BASE}/nominalcapacity",
+ "default_value": 0,
+ },
+ },
+ TableTemplateType.BINDING_CONSTRAINT: {
+ "type": {
+ "path": f"{BINDING_CONSTRAINT_FIELD_PATH_BASE}/type",
+ "default_value": BindingConstraintType.HOURLY.value,
+ },
+ "operator": {
+ "path": f"{BINDING_CONSTRAINT_FIELD_PATH_BASE}/operator",
+ "default_value": BindingConstraintOperator.LESS.value,
+ },
+ "enabled": {
+ "path": f"{BINDING_CONSTRAINT_FIELD_PATH_BASE}/enabled",
+ "default_value": True,
+ },
+ },
}
COLUMN_MODELS_BY_TYPE = {
TableTemplateType.AREA: AreaColumns,
TableTemplateType.LINK: LinkColumns,
TableTemplateType.CLUSTER: ClusterColumns,
+ TableTemplateType.RENEWABLE: RenewableColumns,
+ TableTemplateType.BINDING_CONSTRAINT: BindingConstraintColumns,
}
-ColumnModelTypes = Union[AreaColumns, LinkColumns, ClusterColumns]
+ColumnModelTypes = Union[
+ AreaColumns,
+ LinkColumns,
+ ClusterColumns,
+ RenewableColumns,
+ BindingConstraintColumns,
+]
class TableModeManager:
@@ -374,34 +413,38 @@ def get_table_data(
file_study, table_type
)
- if table_type == TableTemplateType.AREA:
-
- def get_value_from_data(col: str, data: Dict[str, Any]) -> Any:
- field_info = fields_info[col]
- return TableModeManager.__get_value(
- field_info["rel_glob_path"].split("/"),
- data,
- field_info["default_value"],
- )
+ def get_column_value(col: str, data: Dict[str, Any]) -> Any:
+ f_info = fields_info[col]
+ relative_path = TableModeManager.__get_relative_path(
+ f_info["path"], table_type
+ )
+ return TableModeManager.__get_value(
+ relative_path,
+ data,
+ f_info["default_value"],
+ )
+ if table_type == TableTemplateType.AREA:
return {
area_id: column_model.construct(
- **{col: get_value_from_data(col, data) for col in columns}
+ **{col: get_column_value(col, data) for col in columns}
) # type: ignore
for area_id, data in glob_object.items()
}
+ if table_type == TableTemplateType.BINDING_CONSTRAINT:
+ return {
+ data["id"]: column_model.construct(
+ **{col: get_column_value(col, data) for col in columns}
+ ) # type: ignore
+ for data in glob_object.values()
+ }
+
obj: Dict[str, Any] = {}
for id_1, value_1 in glob_object.items():
for id_2, value_2 in value_1.items():
obj[f"{id_1} / {id_2}"] = column_model.construct(
- **{
- col: value_2.get(
- fields_info[col]["rel_glob_path"],
- fields_info[col]["default_value"],
- )
- for col in columns
- }
+ **{col: get_column_value(col, value_2) for col in columns}
)
return obj
@@ -412,14 +455,55 @@ def set_table_data(
table_type: TableTemplateType,
data: Dict[str, ColumnModelTypes],
) -> None:
- commands: List[UpdateConfig] = []
+ commands: List[ICommand] = []
+ bindings_by_id = None
- for key, values in data.items():
+ for key, columns in data.items():
path_vars = TableModeManager.__get_path_vars_from_key(
table_type, key
)
- if path_vars is not None:
- for col, val in values.__iter__():
+
+ if table_type == TableTemplateType.BINDING_CONSTRAINT:
+ file_study = self.storage_service.get_storage(study).get_raw(
+ study
+ )
+ bindings_by_id = bindings_by_id or {
+ binding["id"]: binding
+ for binding in TableModeManager.__get_glob_object(
+ file_study, table_type
+ ).values()
+ }
+ binding_id = path_vars["id"]
+ current_binding = bindings_by_id.get(binding_id, None)
+
+ if current_binding:
+ col_values = columns.dict(exclude_none=True)
+ current_binding_dto = (
+ BindingConstraintManager.process_constraint(
+ current_binding
+ )
+ )
+
+ commands.append(
+ UpdateBindingConstraint(
+ id=binding_id,
+ enabled=col_values.get(
+ "enabled", current_binding_dto.enabled
+ ),
+ time_step=col_values.get(
+ "type", current_binding_dto.time_step
+ ),
+ operator=col_values.get(
+ "operator", current_binding_dto.operator
+ ),
+ coeffs=BindingConstraintManager.constraints_to_coeffs(
+ current_binding_dto
+ ),
+ command_context=self.storage_service.variant_study_service.command_factory.command_context,
+ )
+ )
+ else:
+ for col, val in columns.__iter__():
if val is not None:
commands.append(
UpdateConfig(
@@ -447,44 +531,77 @@ def __get_value(
)
return data if data != {} else default_value
+ @staticmethod
+ def __get_relative_path(
+ path: str,
+ table_type: TableTemplateType,
+ ) -> List[str]:
+ base_path = ""
+ path_arr = path.split("/")
+
+ if table_type == TableTemplateType.AREA:
+ if path.startswith(ECONOMIC_OPTIONS_PATH_BASE):
+ base_path = ECONOMIC_OPTIONS_PATH_BASE
+ # Remove {id}
+ path_arr = path_arr[:-1]
+ else:
+ base_path = AREA_FIELD_PATH_BASE
+ elif table_type == TableTemplateType.LINK:
+ base_path = LINK_FIELD_PATH_BASE
+ elif table_type == TableTemplateType.CLUSTER:
+ base_path = CLUSTER_FIELD_PATH_BASE
+ elif table_type == TableTemplateType.RENEWABLE:
+ base_path = RENEWABLE_FIELD_PATH_BASE
+ elif table_type == TableTemplateType.BINDING_CONSTRAINT:
+ base_path = BINDING_CONSTRAINT_FIELD_PATH_BASE
+
+ return path_arr[len(base_path.split("/")) :]
+
@staticmethod
def __get_column_path(
table_type: TableTemplateType,
path_vars: PathVars,
column: str,
) -> str:
- path = (
- FIELDS_INFO_BY_TYPE[table_type][column]["glob_path"]
- + "/"
- + FIELDS_INFO_BY_TYPE[table_type][column]["rel_glob_path"]
- )
+ path = FIELDS_INFO_BY_TYPE[table_type][column]["path"]
+
+ if table_type == TableTemplateType.AREA:
+ return path.replace("{id}", path_vars["id"])
if table_type == TableTemplateType.LINK:
return path.replace("{area1}", path_vars["area1"]).replace(
"{area2}", path_vars["area2"]
)
- if table_type == TableTemplateType.CLUSTER:
+ if table_type in [
+ TableTemplateType.CLUSTER,
+ TableTemplateType.RENEWABLE,
+ ]:
return path.replace("{area}", path_vars["area"]).replace(
"{cluster}", path_vars["cluster"]
)
- # Area
- if "{id}" not in path:
- path += "/{id}"
- return path.replace("{id}", path_vars["id"])
+
+ return path
@staticmethod
def __get_path_vars_from_key(
table_type: TableTemplateType,
key: str,
- ) -> Optional[PathVars]:
- if table_type == TableTemplateType.AREA:
+ ) -> PathVars:
+ if table_type in [
+ TableTemplateType.AREA,
+ TableTemplateType.BINDING_CONSTRAINT,
+ ]:
return PathVars(id=key)
- elif table_type == TableTemplateType.LINK:
+ if table_type == TableTemplateType.LINK:
area1, area2 = [v.strip() for v in key.split("/")]
return PathVars(area1=area1, area2=area2)
- elif table_type == TableTemplateType.CLUSTER:
+ if table_type in [
+ TableTemplateType.CLUSTER,
+ TableTemplateType.RENEWABLE,
+ ]:
area, cluster = [v.strip() for v in key.split("/")]
return PathVars(area=area, cluster=cluster)
- return None
+
+ return PathVars()
@staticmethod
def __get_glob_object(
@@ -492,23 +609,43 @@ def __get_glob_object(
) -> Dict[str, Any]:
if table_type == TableTemplateType.AREA:
data: Dict[str, Any] = file_study.tree.get(
- AREA_FIELD_PATH_PREFIX.replace("{id}", "*").split("/")
+ AREA_FIELD_PATH_BASE.replace("{id}", "*").split("/")
+ )
+
+ # Add economic options in data
+ economic_opts = file_study.tree.get(
+ ECONOMIC_OPTIONS_PATH_BASE.split("/")
)
- ecopts = file_study.tree.get(ECONOMIC_OPTIONS_PREFIX.split("/"))
- for opt in ecopts:
- for area in ecopts[opt]:
- data[area] = {**data.get(area, {}), opt: ecopts[opt][area]}
+ for opt in economic_opts:
+ for area in economic_opts[opt]:
+ if area in data:
+ data[area] = {
+ **data[area],
+ opt: economic_opts[opt][area],
+ }
+
return data
- elif table_type == TableTemplateType.LINK:
+ if table_type == TableTemplateType.LINK:
return file_study.tree.get(
- LINK_FIELD_PATH_PREFIX.replace("{area1}", "*")
+ LINK_FIELD_PATH_BASE.replace("{area1}", "*")
.replace("/{area2}", "")
.split("/")
)
- elif table_type == TableTemplateType.CLUSTER:
+ if table_type == TableTemplateType.CLUSTER:
+ return file_study.tree.get(
+ CLUSTER_FIELD_PATH_BASE.replace("{area}", "*")
+ .replace("/{cluster}", "")
+ .split("/")
+ )
+ if table_type == TableTemplateType.RENEWABLE:
return file_study.tree.get(
- CLUSTER_FIELD_PATH_PREFIX.replace("{area}", "*")
+ RENEWABLE_FIELD_PATH_BASE.replace("{area}", "*")
.replace("/{cluster}", "")
.split("/")
)
+ if table_type == TableTemplateType.BINDING_CONSTRAINT:
+ return file_study.tree.get(
+ BINDING_CONSTRAINT_FIELD_PATH_BASE.split("/")
+ )
+
return {}
diff --git a/antarest/study/business/thermal_management.py b/antarest/study/business/thermal_management.py
new file mode 100644
index 0000000000..716acde83a
--- /dev/null
+++ b/antarest/study/business/thermal_management.py
@@ -0,0 +1,194 @@
+from enum import Enum
+from pathlib import PurePosixPath
+from typing import Optional, Dict, Any, List
+
+from pydantic import StrictStr, StrictBool
+
+from antarest.study.business.utils import (
+ FormFieldsBaseModel,
+ FieldInfo,
+ execute_or_add_commands,
+)
+from antarest.study.model import Study
+from antarest.study.storage.storage_service import StudyStorageService
+from antarest.study.storage.variantstudy.model.command.update_config import (
+ UpdateConfig,
+)
+
+
+class TimeSeriesGenerationOption(str, Enum):
+ USE_GLOBAL_PARAMETER = "use global parameter"
+ FORCE_NO_GENERATION = "force no generation"
+ FORCE_GENERATION = "force generation"
+
+
+class LawOption(str, Enum):
+ UNIFORM = "uniform"
+ GEOMETRIC = "geometric"
+
+
+THERMAL_PATH = "input/thermal/clusters/{area}/list/{cluster}"
+
+
+class ThermalFormFields(FormFieldsBaseModel):
+ group: Optional[StrictStr]
+ name: Optional[StrictStr]
+ unit_count: Optional[int]
+ enabled: Optional[StrictBool]
+ nominal_capacity: Optional[int]
+ gen_ts: Optional[TimeSeriesGenerationOption]
+ min_stable_power: Optional[int]
+ min_up_time: Optional[int]
+ min_down_time: Optional[int]
+ must_run: Optional[StrictBool]
+ spinning: Optional[int]
+ co2: Optional[int]
+ volatility_forced: Optional[int]
+ volatility_planned: Optional[int]
+ law_forced: Optional[LawOption]
+ law_planned: Optional[LawOption]
+ marginal_cost: Optional[int]
+ spread_cost: Optional[int]
+ fixed_cost: Optional[int]
+ startup_cost: Optional[int]
+ market_bid_cost: Optional[int]
+
+
+FIELDS_INFO: Dict[str, FieldInfo] = {
+ "group": {
+ "path": f"{THERMAL_PATH}/group",
+ "default_value": "",
+ },
+ "name": {
+ "path": f"{THERMAL_PATH}/name",
+ "default_value": "",
+ },
+ "unit_count": {
+ "path": f"{THERMAL_PATH}/unitcount",
+ "default_value": 0,
+ },
+ "enabled": {
+ "path": f"{THERMAL_PATH}/enabled",
+ "default_value": True,
+ },
+ "nominal_capacity": {
+ "path": f"{THERMAL_PATH}/nominalcapacity",
+ "default_value": 0,
+ },
+ "gen_ts": {
+ "path": f"{THERMAL_PATH}/gen-ts",
+ "default_value": TimeSeriesGenerationOption.USE_GLOBAL_PARAMETER.value,
+ },
+ "min_stable_power": {
+ "path": f"{THERMAL_PATH}/min-stable-power",
+ "default_value": 0,
+ },
+ "min_up_time": {
+ "path": f"{THERMAL_PATH}/min-up-time",
+ "default_value": 1,
+ },
+ "min_down_time": {
+ "path": f"{THERMAL_PATH}/min-down-time",
+ "default_value": 1,
+ },
+ "must_run": {
+ "path": f"{THERMAL_PATH}/must-run",
+ "default_value": False,
+ },
+ "spinning": {
+ "path": f"{THERMAL_PATH}/spinning",
+ "default_value": 0,
+ },
+ "co2": {
+ "path": f"{THERMAL_PATH}/co2",
+ "default_value": 0,
+ },
+ "volatility_forced": {
+ "path": f"{THERMAL_PATH}/volatility.forced",
+ "default_value": 0,
+ },
+ "volatility_planned": {
+ "path": f"{THERMAL_PATH}/volatility.planned",
+ "default_value": 0,
+ },
+ "law_forced": {
+ "path": f"{THERMAL_PATH}/law.forced",
+ "default_value": LawOption.UNIFORM.value,
+ },
+ "law_planned": {
+ "path": f"{THERMAL_PATH}/law.planned",
+ "default_value": LawOption.UNIFORM.value,
+ },
+ "marginal_cost": {
+ "path": f"{THERMAL_PATH}/marginal-cost",
+ "default_value": 0,
+ },
+ "spread_cost": {
+ "path": f"{THERMAL_PATH}/spread-cost",
+ "default_value": 0,
+ },
+ "fixed_cost": {
+ "path": f"{THERMAL_PATH}/fixed-cost",
+ "default_value": 0,
+ },
+ "startup_cost": {
+ "path": f"{THERMAL_PATH}/startup-cost",
+ "default_value": 0,
+ },
+ "market_bid_cost": {
+ "path": f"{THERMAL_PATH}/market-bid-cost",
+ "default_value": 0,
+ },
+}
+
+
+def format_path(path: str, area_id: str, cluster_id: str) -> str:
+ return path.format(area=area_id, cluster=cluster_id)
+
+
+class ThermalManager:
+ def __init__(self, storage_service: StudyStorageService):
+ self.storage_service = storage_service
+
+ def get_field_values(
+ self, study: Study, area_id: str, cluster_id: str
+ ) -> ThermalFormFields:
+ file_study = self.storage_service.get_storage(study).get_raw(study)
+ thermal_config = file_study.tree.get(
+ format_path(THERMAL_PATH, area_id, cluster_id).split("/")
+ )
+
+ def get_value(field_info: FieldInfo) -> Any:
+ target_name = PurePosixPath(field_info["path"]).name
+ return thermal_config.get(target_name, field_info["default_value"])
+
+ return ThermalFormFields.construct(
+ **{name: get_value(info) for name, info in FIELDS_INFO.items()}
+ )
+
+ def set_field_values(
+ self,
+ study: Study,
+ area_id: str,
+ cluster_id: str,
+ field_values: ThermalFormFields,
+ ) -> None:
+ commands: List[UpdateConfig] = []
+
+ for field_name, value in field_values.__iter__():
+ if value is not None:
+ info = FIELDS_INFO[field_name]
+
+ commands.append(
+ UpdateConfig(
+ target=format_path(info["path"], area_id, cluster_id),
+ data=value,
+ command_context=self.storage_service.variant_study_service.command_factory.command_context,
+ )
+ )
+
+ if commands:
+ file_study = self.storage_service.get_storage(study).get_raw(study)
+ execute_or_add_commands(
+ study, file_study, commands, self.storage_service
+ )
diff --git a/antarest/study/business/xpansion_management.py b/antarest/study/business/xpansion_management.py
index c540e8b3e6..d18159df5d 100644
--- a/antarest/study/business/xpansion_management.py
+++ b/antarest/study/business/xpansion_management.py
@@ -64,7 +64,7 @@ class MaxIteration(str, Enum):
class XpansionSensitivitySettingsDTO(BaseModel):
epsilon: float
- projection: List[str]
+ projection: Optional[List[str]]
capex: bool = False
diff --git a/antarest/study/model.py b/antarest/study/model.py
index e1d55346f4..5ec9140c93 100644
--- a/antarest/study/model.py
+++ b/antarest/study/model.py
@@ -1,18 +1,26 @@
import enum
import uuid
from dataclasses import dataclass
-from datetime import timedelta, datetime
+from datetime import datetime, timedelta
from pathlib import Path
from typing import Any, Dict, List, Optional, Tuple
-from pydantic import BaseModel
-from sqlalchemy import Column, String, Integer, DateTime, Table, ForeignKey, Enum, Boolean # type: ignore
-from sqlalchemy.orm import relationship # type: ignore
-
from antarest.core.exceptions import ShouldNotHappenException
from antarest.core.model import PublicMode
from antarest.core.persistence import Base
-from antarest.login.model import Group, Identity, GroupDTO
+from antarest.login.model import Group, GroupDTO, Identity
+from pydantic import BaseModel
+from sqlalchemy import ( # type: ignore
+ Boolean,
+ Column,
+ DateTime,
+ Enum,
+ ForeignKey,
+ Integer,
+ String,
+ Table,
+)
+from sqlalchemy.orm import relationship # type: ignore
DEFAULT_WORKSPACE_NAME = "default"
@@ -35,9 +43,10 @@
"820": "empty_study_820.zip",
"830": "empty_study_830.zip",
"840": "empty_study_840.zip",
+ "850": "empty_study_850.zip",
}
-NEW_DEFAULT_STUDY_VERSION: str = "840"
+NEW_DEFAULT_STUDY_VERSION: str = "850"
class StudyContentStatus(enum.Enum):
@@ -118,7 +127,17 @@ class Study(Base): # type: ignore
__mapper_args__ = {"polymorphic_identity": "study", "polymorphic_on": type}
def __str__(self) -> str:
- return f"[Study] id={self.id}, type={self.type}, name={self.name}, version={self.version}, updated_at={self.updated_at}, last_access={self.last_access}, owner={self.owner}, groups={[str(u) + ',' for u in self.groups]}"
+ return (
+ f"[Study]"
+ f" id={self.id},"
+ f" type={self.type},"
+ f" name={self.name},"
+ f" version={self.version},"
+ f" updated_at={self.updated_at},"
+ f" last_access={self.last_access},"
+ f" owner={self.owner},"
+ f" groups={[str(u) + ',' for u in self.groups]}"
+ )
def __eq__(self, other: Any) -> bool:
if not isinstance(other, Study):
@@ -206,7 +225,7 @@ class PatchCluster(BaseModel):
class Config:
@classmethod
def alias_generator(cls, string: str) -> str:
- return "-".join(word for word in string.split("_"))
+ return "-".join(string.split("_"))
class PatchOutputs(BaseModel):
@@ -349,13 +368,13 @@ class MatrixIndex(BaseModel):
class TimeSerie(BaseModel):
name: str
unit: str
- data: List[Optional[float]] = list()
+ data: List[Optional[float]] = []
class TimeSeriesData(BaseModel):
type: StudyDownloadType
name: str
- data: Dict[str, List[TimeSerie]] = dict()
+ data: Dict[str, List[TimeSerie]] = {}
class MatrixAggregationResultDTO(BaseModel):
diff --git a/antarest/study/repository.py b/antarest/study/repository.py
index 3d99e0d11a..b40c29ca83 100644
--- a/antarest/study/repository.py
+++ b/antarest/study/repository.py
@@ -45,9 +45,15 @@ def refresh(self, metadata: Study) -> None:
db.session.refresh(metadata)
def get(self, id: str) -> Optional[Study]:
+ """Get the study by ID or return `None` if not found in database."""
metadata: Study = db.session.query(Study).get(id)
return metadata
+ def one(self, id: str) -> Study:
+ """Get the study by ID or raise `sqlalchemy.exc.NoResultFound` if not found in database."""
+ study: Study = db.session.query(Study).filter_by(id=id).one()
+ return study
+
def get_list(self, study_id: List[str]) -> List[Study]:
studies: List[Study] = (
db.session.query(Study).where(Study.id.in_(study_id)).all()
diff --git a/antarest/study/service.py b/antarest/study/service.py
index 183f56b5b2..d4bf5144cf 100644
--- a/antarest/study/service.py
+++ b/antarest/study/service.py
@@ -6,46 +6,39 @@
from http import HTTPStatus
from pathlib import Path
from time import time
-from typing import List, IO, Optional, cast, Union, Dict, Callable, Any, Tuple
+from typing import IO, Any, Callable, Dict, List, Optional, Tuple, Union, cast
from uuid import uuid4
-from fastapi import HTTPException, UploadFile
-from markupsafe import escape
-from starlette.responses import FileResponse, Response
-
from antarest.core.config import Config
from antarest.core.exceptions import (
- StudyNotFoundError,
- StudyTypeUnsupported,
- UnsupportedOperationOnArchivedStudy,
- NotAManagedStudyException,
CommandApplicationError,
+ NotAManagedStudyException,
StudyDeletionNotAllowed,
+ StudyNotFoundError,
+ StudyTypeUnsupported,
TaskAlreadyRunning,
+ UnsupportedOperationOnArchivedStudy,
+ UnsupportedStudyVersion,
)
-from antarest.core.filetransfer.model import (
- FileDownloadTaskDTO,
-)
+from antarest.core.filetransfer.model import FileDownloadTaskDTO
from antarest.core.filetransfer.service import FileTransferManager
-from antarest.core.interfaces.cache import ICache, CacheConstants
-from antarest.core.interfaces.eventbus import IEventBus, Event, EventType
-from antarest.core.jwt import JWTUser, DEFAULT_ADMIN_USER
+from antarest.core.interfaces.cache import CacheConstants, ICache
+from antarest.core.interfaces.eventbus import Event, EventType, IEventBus
+from antarest.core.jwt import DEFAULT_ADMIN_USER, JWTUser
from antarest.core.model import (
JSON,
+ SUB_JSON,
+ PermissionInfo,
PublicMode,
StudyPermissionType,
- SUB_JSON,
-)
-from antarest.core.requests import (
- RequestParameters,
- UserHasNotPermissionError,
)
+from antarest.core.requests import RequestParameters, UserHasNotPermissionError
from antarest.core.roles import RoleType
from antarest.core.tasks.model import (
- TaskResult,
- TaskType,
TaskListFilter,
+ TaskResult,
TaskStatus,
+ TaskType,
)
from antarest.core.tasks.service import (
ITaskService,
@@ -60,11 +53,14 @@
MatrixEditInstructionDTO,
)
from antarest.matrixstore.utils import parse_tsv_matrix
+from antarest.study.business.advanced_parameters_management import (
+ AdvancedParamsManager,
+)
from antarest.study.business.area_management import (
+ AreaCreationDTO,
+ AreaInfoDTO,
AreaManager,
AreaType,
- AreaInfoDTO,
- AreaCreationDTO,
AreaUI,
)
from antarest.study.business.binding_constraint_management import (
@@ -73,18 +69,12 @@
from antarest.study.business.config_management import ConfigManager
from antarest.study.business.district_manager import DistrictManager
from antarest.study.business.general_management import GeneralManager
-from antarest.study.business.link_management import LinkManager, LinkInfoDTO
-from antarest.study.business.hydro_management import (
- HydroManager,
-)
+from antarest.study.business.hydro_management import HydroManager
+from antarest.study.business.link_management import LinkInfoDTO, LinkManager
from antarest.study.business.matrix_management import MatrixManager
-from antarest.study.business.playlist_management import (
- PlaylistManager,
-)
from antarest.study.business.optimization_management import OptimizationManager
-from antarest.study.business.advanced_parameters_management import (
- AdvancedParamsManager,
-)
+from antarest.study.business.playlist_management import PlaylistManager
+from antarest.study.business.renewable_management import RenewableManager
from antarest.study.business.scenario_builder_management import (
ScenarioBuilderManager,
)
@@ -92,35 +82,36 @@
from antarest.study.business.thematic_trimming_management import (
ThematicTrimmingManager,
)
+from antarest.study.business.thermal_management import ThermalManager
from antarest.study.business.timeseries_config_management import (
TimeSeriesConfigManager,
)
from antarest.study.business.utils import execute_or_add_commands
from antarest.study.business.xpansion_management import (
+ XpansionCandidateDTO,
XpansionManager,
XpansionSettingsDTO,
- XpansionCandidateDTO,
)
from antarest.study.model import (
- Study,
- StudyContentStatus,
- StudyFolder,
DEFAULT_WORKSPACE_NAME,
- RawStudy,
- StudyMetadataPatchDTO,
- StudyMetadataDTO,
- StudyDownloadDTO,
- StudySimResultDTO,
- CommentsDto,
- STUDY_REFERENCE_TEMPLATES,
NEW_DEFAULT_STUDY_VERSION,
- PatchStudy,
+ STUDY_REFERENCE_TEMPLATES,
+ CommentsDto,
+ ExportFormat,
MatrixIndex,
- PatchCluster,
PatchArea,
- ExportFormat,
+ PatchCluster,
+ PatchStudy,
+ RawStudy,
+ Study,
StudyAdditionalData,
+ StudyContentStatus,
+ StudyDownloadDTO,
StudyDownloadLevelDTO,
+ StudyFolder,
+ StudyMetadataDTO,
+ StudyMetadataPatchDTO,
+ StudySimResultDTO,
)
from antarest.study.repository import StudyMetadataRepository
from antarest.study.storage.rawstudy.model.filesystem.config.model import (
@@ -142,22 +133,22 @@
from antarest.study.storage.rawstudy.model.filesystem.raw_file_node import (
RawFileNode,
)
-from antarest.study.storage.rawstudy.raw_study_service import (
- RawStudyService,
-)
+from antarest.study.storage.rawstudy.raw_study_service import RawStudyService
from antarest.study.storage.storage_service import StudyStorageService
from antarest.study.storage.study_download_utils import (
StudyDownloader,
get_output_variables_information,
)
-from antarest.study.storage.study_version_upgrader import upgrade_study
+from antarest.study.storage.study_upgrader import (
+ find_next_version,
+ upgrade_study,
+)
from antarest.study.storage.utils import (
+ assert_permission,
get_default_workspace_path,
+ get_start_date,
is_managed,
remove_from_cache,
- assert_permission,
- create_permission_from_study,
- get_start_date,
study_matcher,
)
from antarest.study.storage.variantstudy.model.command.icommand import ICommand
@@ -180,12 +171,104 @@
)
from antarest.worker.archive_worker import ArchiveTaskArgs
from antarest.worker.simulator_worker import GenerateTimeseriesTaskArgs
+from fastapi import HTTPException, UploadFile
+from markupsafe import escape
+from starlette.responses import FileResponse, Response
logger = logging.getLogger(__name__)
MAX_MISSING_STUDY_TIMEOUT = 2 # days
+class StudyUpgraderTask:
+ """
+ Task to perform a study upgrade.
+ """
+
+ def __init__(
+ self,
+ study_id: str,
+ target_version: str,
+ *,
+ repository: StudyMetadataRepository,
+ storage_service: StudyStorageService,
+ cache_service: ICache,
+ event_bus: IEventBus,
+ ):
+ self._study_id = study_id
+ self._target_version = target_version
+ self.repository = repository
+ self.storage_service = storage_service
+ self.cache_service = cache_service
+ self.event_bus = event_bus
+
+ def _upgrade_study(self) -> None:
+ """Run the task (lock the database)."""
+ study_id: str = self._study_id
+ target_version: str = self._target_version
+ with db():
+ # TODO We want to verify that a study doesn't have children and if it does do we upgrade all of them ?
+ study_to_upgrade = self.repository.one(study_id)
+ is_variant = isinstance(study_to_upgrade, VariantStudy)
+ if is_managed(study_to_upgrade) and not is_variant:
+ file_study = self.storage_service.get_storage(
+ study_to_upgrade
+ ).get_raw(study_to_upgrade)
+ file_study.tree.denormalize()
+ try:
+ # sourcery skip: extract-method
+ if is_variant:
+ self.storage_service.variant_study_service.clear_snapshot(
+ study_to_upgrade
+ )
+ else:
+ study_path = Path(study_to_upgrade.path)
+ upgrade_study(study_path, target_version)
+ remove_from_cache(self.cache_service, study_to_upgrade.id)
+ study_to_upgrade.version = target_version
+ self.repository.save(study_to_upgrade)
+ self.event_bus.push(
+ Event(
+ type=EventType.STUDY_EDITED,
+ payload=study_to_upgrade.to_json_summary(),
+ permissions=PermissionInfo.from_study(
+ study_to_upgrade
+ ),
+ )
+ )
+ finally:
+ if is_managed(study_to_upgrade) and not is_variant:
+ file_study = self.storage_service.get_storage(
+ study_to_upgrade
+ ).get_raw(study_to_upgrade)
+ file_study.tree.normalize()
+
+ def run_task(self, notifier: TaskUpdateNotifier) -> TaskResult:
+ """
+ Run the study upgrade task.
+
+ Args:
+ notifier: function used to emit user messages.
+
+ Returns:
+ The result of the task is always `success=True`.
+ """
+ # The call to `_upgrade_study` may raise an exception, which will be
+ # handled in the task service (see: `TaskJobService._run_task`)
+ msg = f"Upgrade study '{self._study_id}' to version {self._target_version}"
+ notifier(msg)
+ self._upgrade_study()
+ msg = (
+ f"Successfully upgraded study '{self._study_id}'"
+ f" to version {self._target_version}"
+ )
+ notifier(msg)
+ return TaskResult(success=True, message=msg)
+
+ # Make `StudyUpgraderTask` object is callable
+ __call__ = run_task
+
+
class StudyService:
"""
Storage module facade service to handle studies management.
@@ -224,6 +307,8 @@ def __init__(
self.storage_service
)
self.hydro_manager = HydroManager(self.storage_service)
+ self.renewable_manager = RenewableManager(self.storage_service)
+ self.thermal_manager = ThermalManager(self.storage_service)
self.ts_config_manager = TimeSeriesConfigManager(self.storage_service)
self.table_mode_manager = TableModeManager(self.storage_service)
self.playlist_manager = PlaylistManager(self.storage_service)
@@ -595,7 +680,7 @@ def update_study_information(
Event(
type=EventType.STUDY_DATA_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
return new_metadata
@@ -667,7 +752,7 @@ def create_study(
Event(
type=EventType.STUDY_CREATED,
payload=raw.to_json_summary(),
- permissions=create_permission_from_study(raw),
+ permissions=PermissionInfo.from_study(raw),
)
)
@@ -783,7 +868,7 @@ def sync_studies_on_disk(
Event(
type=EventType.STUDY_DELETED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
elif study.missing < clean_up_missing_studies_threshold:
@@ -851,7 +936,7 @@ def sync_studies_on_disk(
Event(
type=EventType.STUDY_CREATED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
except Exception as e:
@@ -904,7 +989,7 @@ def copy_task(notifier: TaskUpdateNotifier) -> TaskResult:
Event(
type=EventType.STUDY_CREATED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
@@ -948,7 +1033,7 @@ def move_study(
Event(
type=EventType.STUDY_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
@@ -1139,7 +1224,7 @@ def delete_study(
Event(
type=EventType.STUDY_DELETED,
payload=study_info,
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
@@ -1182,7 +1267,7 @@ def delete_output(
Event(
type=EventType.STUDY_DATA_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
@@ -1413,7 +1498,7 @@ def import_study(
Event(
type=EventType.STUDY_CREATED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
@@ -1587,7 +1672,7 @@ def apply_commands(
Event(
type=EventType.STUDY_DATA_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
logger.info(
@@ -1628,7 +1713,7 @@ def edit_study(
Event(
type=EventType.STUDY_DATA_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
logger.info(
@@ -1664,7 +1749,7 @@ def change_owner(
Event(
type=EventType.STUDY_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
@@ -1707,7 +1792,7 @@ def add_group(
Event(
type=EventType.STUDY_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
@@ -1743,7 +1828,7 @@ def remove_group(
Event(
type=EventType.STUDY_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
@@ -1777,7 +1862,7 @@ def set_public_mode(
Event(
type=EventType.STUDY_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
logger.info(
@@ -1830,7 +1915,7 @@ def create_area(
Event(
type=EventType.STUDY_DATA_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
return new_area
@@ -1849,7 +1934,7 @@ def create_link(
Event(
type=EventType.STUDY_DATA_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
return new_link
@@ -1871,7 +1956,7 @@ def update_area(
Event(
type=EventType.STUDY_DATA_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
return updated_area
@@ -1914,7 +1999,7 @@ def delete_area(
Event(
type=EventType.STUDY_DATA_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
@@ -1933,7 +2018,7 @@ def delete_link(
Event(
type=EventType.STUDY_DATA_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
@@ -1971,7 +2056,7 @@ def archive_task(notifier: TaskUpdateNotifier) -> TaskResult:
Event(
type=EventType.STUDY_EDITED,
payload=study_to_archive.to_json_summary(),
- permissions=create_permission_from_study(study_to_archive),
+ permissions=PermissionInfo.from_study(study_to_archive),
)
)
return TaskResult(success=True, message="ok")
@@ -2022,7 +2107,7 @@ def unarchive_task(notifier: TaskUpdateNotifier) -> TaskResult:
Event(
type=EventType.STUDY_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
remove_from_cache(cache=self.cache_service, root_id=uuid)
@@ -2129,9 +2214,10 @@ def _analyse_study(self, metadata: Study) -> StudyContentStatus:
logger.error(e)
return StudyContentStatus.ERROR
+ # noinspection PyUnusedLocal
@staticmethod
def get_studies_versions(params: RequestParameters) -> List[str]:
- return list(STUDY_REFERENCE_TEMPLATES.keys())
+ return list(STUDY_REFERENCE_TEMPLATES)
def create_xpansion_configuration(
self,
@@ -2453,61 +2539,19 @@ def generate_timeseries(
request_params=params,
)
- def _upgrade_study(self, study_id: str, target_version: int) -> TaskResult:
- with db():
- # TODO We want to verify that a study doesn't have children and if it does do we upgrade all of them ?
- study_to_upgrade = self.get_study(study_id)
- is_variant = isinstance(study_to_upgrade, VariantStudy)
- if is_managed(study_to_upgrade) and not is_variant:
- file_study = self.storage_service.get_storage(
- study_to_upgrade
- ).get_raw(study_to_upgrade)
- file_study.tree.denormalize()
- try:
- if is_variant:
- self.storage_service.variant_study_service.clear_snapshot(
- study_to_upgrade
- )
- else:
- upgrade_study(study_to_upgrade.path, target_version)
- remove_from_cache(self.cache_service, study_to_upgrade.id)
- study_to_upgrade.version = str(target_version)
- self.repository.save(study_to_upgrade)
- self.event_bus.push(
- Event(
- type=EventType.STUDY_EDITED,
- payload=study_to_upgrade.to_json_summary(),
- permissions=create_permission_from_study(
- study_to_upgrade
- ),
- )
- )
- return TaskResult(
- success=True,
- message=f"Sucessfuly upgraded study {study_to_upgrade.name} ({study_to_upgrade.id}) to {target_version}",
- )
- except Exception as e:
- return TaskResult(
- success=False,
- message=f"Failed to upgrad study {study_to_upgrade.name} ({study_to_upgrade.id}) to {target_version} : {repr(e)}",
- )
- finally:
- if is_managed(study_to_upgrade) and not is_variant:
- file_study = self.storage_service.get_storage(
- study_to_upgrade
- ).get_raw(study_to_upgrade)
- file_study.tree.normalize()
-
- def upgrade_study(self, study_id: str, params: RequestParameters) -> str:
+ def upgrade_study(
+ self,
+ study_id: str,
+ target_version: str,
+ params: RequestParameters,
+ ) -> str:
study = self.get_study(study_id)
assert_permission(params.user, study, StudyPermissionType.WRITE)
self._assert_study_unarchived(study)
- list_versions = list(STUDY_REFERENCE_TEMPLATES.keys())
- target_version = study.version
- for k, elt in enumerate(list_versions):
- if elt == study.version and k < len(list_versions) - 1:
- target_version = int(list_versions[k + 1])
- break
+
+ target_version = target_version or find_next_version(study.version)
+ if not target_version:
+ raise UnsupportedStudyVersion(study.version)
task_name = f"Upgrade study {study.name} ({study.id}) to version {target_version}"
study_tasks = self.task_service.list_tasks(
@@ -2521,8 +2565,17 @@ def upgrade_study(self, study_id: str, params: RequestParameters) -> str:
if len(study_tasks) > 0:
raise TaskAlreadyRunning()
+ study_upgrader_task = StudyUpgraderTask(
+ study_id,
+ target_version,
+ repository=self.repository,
+ storage_service=self.storage_service,
+ cache_service=self.cache_service,
+ event_bus=self.event_bus,
+ )
+
return self.task_service.add_task(
- lambda _: self._upgrade_study(study_id, target_version),
+ study_upgrader_task,
task_name,
task_type=TaskType.UPGRADE_STUDY,
ref_id=study.id,
diff --git a/antarest/study/storage/abstract_storage_service.py b/antarest/study/storage/abstract_storage_service.py
index e4e81ed139..404019a289 100644
--- a/antarest/study/storage/abstract_storage_service.py
+++ b/antarest/study/storage/abstract_storage_service.py
@@ -1,5 +1,4 @@
import logging
-import os
import shutil
import tempfile
from abc import ABC
@@ -10,7 +9,7 @@
from antarest.core.config import Config
from antarest.core.exceptions import BadOutputError, StudyOutputNotFoundError
from antarest.core.interfaces.cache import CacheConstants, ICache
-from antarest.core.model import JSON, PublicMode
+from antarest.core.model import JSON
from antarest.core.utils.utils import (
extract_zip,
StopWatch,
@@ -18,7 +17,6 @@
zip_dir,
unzip,
)
-from antarest.login.model import GroupDTO
from antarest.study.common.studystorage import IStudyStorageService, T
from antarest.study.common.utils import get_study_information
from antarest.study.model import (
@@ -26,16 +24,13 @@
StudySimResultDTO,
StudySimSettingsDTO,
PatchOutputs,
- OwnerInfo,
- DEFAULT_WORKSPACE_NAME,
PatchStudy,
StudyMetadataPatchDTO,
- Patch,
StudyAdditionalData,
)
from antarest.study.storage.patch_service import PatchService
from antarest.study.storage.rawstudy.model.filesystem.config.files import (
- ConfigPathBuilder,
+ get_playlist,
)
from antarest.study.storage.rawstudy.model.filesystem.config.model import (
Simulation,
@@ -171,8 +166,7 @@ def get_study_sim_result(
playlist=[
year
for year in (
- ConfigPathBuilder.get_playlist(file_metadata)
- or {}
+ get_playlist(file_metadata) or {}
).keys()
],
)
diff --git a/antarest/study/storage/antares_configparser.py b/antarest/study/storage/antares_configparser.py
new file mode 100644
index 0000000000..723766d356
--- /dev/null
+++ b/antarest/study/storage/antares_configparser.py
@@ -0,0 +1,71 @@
+import configparser
+from typing import Any, Dict, Union, Optional
+
+
+def _convert_value(value: Any) -> str:
+ """
+ Convert a value to a string using the specific format of Antares INI files.
+
+ - strings are preserved,
+ - ``None`` is converted to an empty string,
+ - booleans are converted to "true"/"false" in lower case.
+ - numbers are converted to strings using the :class:`str` function.
+ """
+ if value is None:
+ return ""
+ elif value is True or value is False:
+ return str(value).lower()
+ else:
+ return str(value)
+
+
+class AntaresSectionProxy(configparser.SectionProxy):
+ """
+ This class extends the :class:`configparser.SectionProxy` class in order
+ to store strings or other types of values by converting them according
+ to the rules of Antares INI files.
+ """
+
+ def __repr__(self) -> str:
+ """String representation of the section proxy used for debug."""
+ cls = self.__class__.__name__
+ return f"<{cls}: {self._name}>"
+
+ def __setitem__(self, key: str, value: Any) -> None:
+ """
+ Sets the value of the specified key in the section.
+ """
+ super().__setitem__(key, _convert_value(value))
+
+
+class AntaresConfigParser(configparser.RawConfigParser):
+ """
+ This class extends the :class:`configparser.RawConfigParser` class in order
+ to store strings or other types of values by converting them according
+ to the rules of Antares INI files.
+ """
+
+ _proxies: Dict[str, AntaresSectionProxy]
+ _sections: Dict[str, Optional[Union[bool, int, float, str]]]
+
+ def __init__(self, *args, **kwargs) -> None: # type: ignore
+ super().__init__(*args, **kwargs)
+ self._proxies[self.default_section] = AntaresSectionProxy(
+ self, self.default_section
+ )
+
+ def add_section(self, section: str) -> None:
+ super().add_section(section)
+ self._proxies[section] = AntaresSectionProxy(self, section)
+
+ def set(self, section: str, option: str, value: Any = None) -> None:
+ super().set(section, option, _convert_value(value))
+
+ def _read(self, fp, fpname): # type: ignore
+ # noinspection PyProtectedMember
+ super()._read(fp, fpname) # type: ignore
+ # cast section proxies to AntaresSectionProxy
+ proxies = self._proxies
+ for name, proxy in self._sections.items():
+ if not isinstance(proxy, AntaresSectionProxy):
+ proxies[name] = AntaresSectionProxy(self, name)
diff --git a/antarest/study/storage/patch_service.py b/antarest/study/storage/patch_service.py
index 9d16199d14..a6b81c02ba 100644
--- a/antarest/study/storage/patch_service.py
+++ b/antarest/study/storage/patch_service.py
@@ -27,13 +27,12 @@ def get(
self, study: Union[RawStudy, VariantStudy], get_from_file: bool = False
) -> Patch:
if not get_from_file:
- try:
- return Patch.parse_raw(study.additional_data.patch)
- except Exception as e:
- logger.warning("Failed to parse patch data", exc_info=e)
+ # the `study.additional_data.patch` field is optional
+ if patch_data := study.additional_data.patch:
+ return Patch.parse_raw(patch_data)
patch = Patch()
- patch_path = (Path(study.path)) / "patch.json"
+ patch_path = Path(study.path) / "patch.json"
if patch_path.exists():
patch = Patch.parse_file(patch_path)
diff --git a/antarest/study/storage/rawstudy/io/reader/ini_reader.py b/antarest/study/storage/rawstudy/io/reader/ini_reader.py
index 8e019e2273..dfcd6ee9b7 100644
--- a/antarest/study/storage/rawstudy/io/reader/ini_reader.py
+++ b/antarest/study/storage/rawstudy/io/reader/ini_reader.py
@@ -1,10 +1,11 @@
import configparser
+import contextlib
import re
from abc import ABC, abstractmethod
from pathlib import Path
from typing import List, Optional, Union
-from antarest.core.model import ELEMENT, JSON, SUB_JSON
+from antarest.core.model import JSON, SUB_JSON
class IReader(ABC):
@@ -32,8 +33,7 @@ class IniReader(IReader):
@staticmethod
def _parse_bool(value: str) -> Optional[bool]:
- value = value.lower()
- return bool(value == "true") if value in ["true", "false"] else None
+ return {"true": True, "false": False}.get(value.lower())
@staticmethod
def _parse_int(value: str) -> Optional[int]:
@@ -50,15 +50,14 @@ def _parse_float(value: str) -> Optional[float]:
return None
@staticmethod
- def parse_value(value: str) -> SUB_JSON:
- parsed: Union[str, int, float, bool, None] = IniReader._parse_bool(
- value
- )
- parsed = parsed if parsed is not None else IniReader._parse_int(value)
- parsed = (
- parsed if parsed is not None else IniReader._parse_float(value)
- )
- return parsed if parsed is not None else value
+ def parse_value(value: str) -> Union[bool, int, float, str]:
+ def strict_bool(v: str) -> bool:
+ return {"true": True, "false": False}[v.lower()]
+
+ for parser in [strict_bool, int, float]:
+ with contextlib.suppress(KeyError, ValueError):
+ return parser(value) # type: ignore
+ return value
@staticmethod
def _parse_json(json: configparser.SectionProxy) -> JSON:
@@ -89,6 +88,7 @@ def _parse_inf(value: str) -> Optional[str]:
except ValueError:
return None
+ # noinspection PyProtectedMember
@staticmethod
def parse_value(value: str) -> SUB_JSON:
parsed: Union[
@@ -109,9 +109,9 @@ def _parse_json(json: JSON) -> JSON:
}
def read(self, path: Path) -> JSON:
- with open(path, "r") as f:
- json = {}
- for line in f.readlines():
+ json = {}
+ with open(path, "r") as fd:
+ for line in fd:
line = line.strip()
if line and not line.startswith("#"):
key, value = line.split("=")
@@ -121,6 +121,7 @@ def read(self, path: Path) -> JSON:
class IniConfigParser(configparser.RawConfigParser):
+ # noinspection SpellCheckingInspection
def optionxform(self, optionstr: str) -> str:
return optionstr
@@ -129,7 +130,7 @@ class MultipleSameKeysIniReader(IReader):
"""
Custom .ini reader for inputs/sets.ini file.
This file has format :
- ``` python
+ ```python
[chap]
+ = areaA
+ = areaB
@@ -142,35 +143,27 @@ def __init__(self, special_keys: Optional[List[str]] = None) -> None:
self.special_keys = special_keys or []
super().__init__()
- @staticmethod
- def fetch_cleaned_lines(path: Path) -> List[str]:
- return [l for l in path.read_text().split("\n") if l.strip() != ""]
-
def read(self, path: Path) -> JSON:
- data: JSON = dict()
- curr_part = ""
- lines = MultipleSameKeysIniReader.fetch_cleaned_lines(path)
-
- for l in lines:
- line = l.strip()
- regex = re.search("^\[(.*)\]$", line)
- if regex:
- curr_part = regex.group(1)
- data[curr_part] = dict()
- else:
- elements = re.split("\s+=\s*", line)
- key = elements[0]
- value = None
- if len(elements) == 2:
- value = IniReader.parse_value(elements[1].strip())
- if key not in data[curr_part]:
- if key in self.special_keys:
- data[curr_part][key] = [value]
+ data: JSON = {}
+ section = ""
+ with path.open(encoding="utf-8") as lines:
+ for line in lines:
+ line = line.strip()
+ if match := re.fullmatch(r"\[(.*)]", line):
+ section = match[1]
+ data[section] = {}
+ elif "=" in line:
+ key, arg = map(str.strip, line.split("=", 1))
+ value = IniReader.parse_value(arg)
+ group = data[section]
+ if key in group:
+ if isinstance(group[key], list):
+ group[key].append(value)
+ else:
+ group[key] = [group[key], value]
+ elif key in self.special_keys:
+ group[key] = [value]
else:
- data[curr_part][key] = value
- else:
- if not isinstance(data[curr_part][key], list):
- data[curr_part][key] = [data[curr_part][key]]
- data[curr_part][key].append(value)
+ group[key] = value
return data
diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/exceptions.py b/antarest/study/storage/rawstudy/model/filesystem/config/exceptions.py
new file mode 100644
index 0000000000..7cdf5b2a50
--- /dev/null
+++ b/antarest/study/storage/rawstudy/model/filesystem/config/exceptions.py
@@ -0,0 +1,42 @@
+from pathlib import Path
+from typing import cast
+
+
+class BaseConfigError(Exception):
+ """Base class of the configuration errors."""
+
+
+class SimulationParsingError(BaseConfigError):
+ def __init__(self, output_path: Path, reason: str):
+ super().__init__(output_path, reason)
+
+ @property
+ def output_path(self) -> Path:
+ return cast(Path, self.args[0])
+
+ @property
+ def reason(self) -> str:
+ return cast(str, self.args[1])
+
+ def __str__(self) -> str:
+ output_path = self.output_path
+ reason = self.reason
+ return f"Fail to parse the simulation file '{output_path}': {reason}"
+
+
+class XpansionParsingError(BaseConfigError):
+ def __init__(self, xpansion_json: Path, reason: str):
+ super().__init__(xpansion_json, reason)
+
+ @property
+ def xpansion_json(self) -> Path:
+ return cast(Path, self.args[0])
+
+ @property
+ def reason(self) -> str:
+ return cast(str, self.args[1])
+
+ def __str__(self) -> str:
+ xpansion_json = self.xpansion_json
+ reason = self.reason
+ return f"Fail to parse the Xpansion file '{xpansion_json}': {reason}"
diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/files.py b/antarest/study/storage/rawstudy/model/filesystem/config/files.py
index f266c27078..83c31183ee 100644
--- a/antarest/study/storage/rawstudy/model/filesystem/config/files.py
+++ b/antarest/study/storage/rawstudy/model/filesystem/config/files.py
@@ -1,10 +1,11 @@
+import json
import logging
import re
import tempfile
+import zipfile
from enum import Enum
from pathlib import Path
-from typing import List, Dict, Any, Tuple, Optional, cast
-from zipfile import ZipFile
+from typing import Any, Dict, List, Optional, Tuple, cast
from antarest.core.model import JSON
from antarest.core.utils.utils import extract_file_to_tmp_dir
@@ -12,15 +13,19 @@
IniReader,
MultipleSameKeysIniReader,
)
+from antarest.study.storage.rawstudy.model.filesystem.config.exceptions import (
+ SimulationParsingError,
+ XpansionParsingError,
+)
from antarest.study.storage.rawstudy.model.filesystem.config.model import (
- FileStudyTreeConfig,
Area,
- Simulation,
- Link,
+ BindingConstraintDTO,
+ Cluster,
DistrictSet,
+ FileStudyTreeConfig,
+ Link,
+ Simulation,
transform_name_to_id,
- Cluster,
- BindingConstraintDTO,
)
from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import (
DUPLICATE_KEYS,
@@ -39,382 +44,374 @@ class FileTypeNotSupportedException(Exception):
pass
-class ConfigPathBuilder:
- """
- Fetch information need by StudyConfig from filesystem data
+def build(
+ study_path: Path, study_id: str, output_path: Optional[Path] = None
+) -> "FileStudyTreeConfig":
"""
+ Extract data from filesystem to build config study.
+ Args:
+ study_path: study_path with files inside.
+ study_id: uuid of the study
+ output_path: output_path if not in study_path/output
- @staticmethod
- def build(
- study_path: Path, study_id: str, output_path: Optional[Path] = None
- ) -> "FileStudyTreeConfig":
- """
- Extract data from filesystem to build config study.
- Args:
- study_path: study_path with files inside.
- study_id: uuid of the study
- output_path: output_path if not in study_path/output
-
- Returns: study config fill with data
-
- """
- (sns, asi, enr_modelling) = ConfigPathBuilder._parse_parameters(
- study_path
- )
-
- study_path_without_zip_extension = study_path.parent / (
- study_path.stem if study_path.suffix == ".zip" else study_path.name
- )
-
- return FileStudyTreeConfig(
- study_path=study_path,
- output_path=output_path or study_path / "output",
- path=study_path_without_zip_extension,
- study_id=study_id,
- version=ConfigPathBuilder._parse_version(study_path),
- areas=ConfigPathBuilder._parse_areas(study_path),
- sets=ConfigPathBuilder._parse_sets(study_path),
- outputs=ConfigPathBuilder._parse_outputs(
- output_path or study_path / "output"
- ),
- bindings=ConfigPathBuilder._parse_bindings(study_path),
- store_new_set=sns,
- archive_input_series=asi,
- enr_modelling=enr_modelling,
- zip_path=study_path if study_path.suffix == ".zip" else None,
- )
+ Returns: study config fill with data
- @staticmethod
- def _extract_data_from_file(
- root: Path,
- inside_root_path: Path,
- file_type: FileType,
- multi_ini_keys: Optional[List[str]] = None,
- ) -> Any:
- tmp_dir = None
- try:
- if root.suffix == ".zip":
- output_data_path, tmp_dir = extract_file_to_tmp_dir(
- root, inside_root_path
- )
- else:
- output_data_path = root / inside_root_path
-
- if file_type == FileType.TXT:
- output_data: Any = output_data_path.read_text().split("\n")
- elif file_type == FileType.MULTI_INI:
- output_data = MultipleSameKeysIniReader(multi_ini_keys).read(
- output_data_path
- )
- elif file_type == FileType.SIMPLE_INI:
- output_data = IniReader().read(output_data_path)
- else:
- raise FileTypeNotSupportedException()
- finally:
- if tmp_dir:
- tmp_dir.cleanup()
-
- return output_data
-
- @staticmethod
- def _parse_version(path: Path) -> int:
- study_info = ConfigPathBuilder._extract_data_from_file(
- root=path,
- inside_root_path=Path("study.antares"),
- file_type=FileType.SIMPLE_INI,
- )
- version: int = study_info.get("antares", {}).get("version", -1)
- return version
-
- @staticmethod
- def _parse_parameters(path: Path) -> Tuple[bool, List[str], str]:
- general = ConfigPathBuilder._extract_data_from_file(
- root=path,
- inside_root_path=Path("settings/generaldata.ini"),
- file_type=FileType.MULTI_INI,
- )
+ """
+ (sns, asi, enr_modelling) = _parse_parameters(study_path)
+
+ study_path_without_zip_extension = study_path.parent / (
+ study_path.stem if study_path.suffix == ".zip" else study_path.name
+ )
+
+ return FileStudyTreeConfig(
+ study_path=study_path,
+ output_path=output_path or study_path / "output",
+ path=study_path_without_zip_extension,
+ study_id=study_id,
+ version=_parse_version(study_path),
+ areas=_parse_areas(study_path),
+ sets=_parse_sets(study_path),
+ outputs=_parse_outputs(output_path or study_path / "output"),
+ bindings=_parse_bindings(study_path),
+ store_new_set=sns,
+ archive_input_series=asi,
+ enr_modelling=enr_modelling,
+ zip_path=study_path if study_path.suffix == ".zip" else None,
+ )
+
+
+def _extract_data_from_file(
+ root: Path,
+ inside_root_path: Path,
+ file_type: FileType,
+ multi_ini_keys: Optional[List[str]] = None,
+) -> Any:
+ tmp_dir = None
+ try:
+ if root.suffix == ".zip":
+ output_data_path, tmp_dir = extract_file_to_tmp_dir(
+ root, inside_root_path
+ )
+ else:
+ output_data_path = root / inside_root_path
+
+ if file_type == FileType.TXT:
+ output_data: Any = output_data_path.read_text().split("\n")
+ elif file_type == FileType.MULTI_INI:
+ output_data = MultipleSameKeysIniReader(multi_ini_keys).read(
+ output_data_path
+ )
+ elif file_type == FileType.SIMPLE_INI:
+ output_data = IniReader().read(output_data_path)
+ else:
+ raise FileTypeNotSupportedException()
+ finally:
+ if tmp_dir:
+ tmp_dir.cleanup()
- store_new_set: bool = general.get("output", {}).get(
- "storenewset", False
- )
- archive_input_series: List[str] = [
- e.strip()
- for e in general.get("output", {})
- .get("archives", "")
- .strip()
- .split(",")
- if e.strip()
- ]
- enr_modelling: str = general.get("other preferences", {}).get(
- "renewable-generation-modelling", "aggregated"
+ return output_data
+
+
+def _parse_version(path: Path) -> int:
+ study_info = _extract_data_from_file(
+ root=path,
+ inside_root_path=Path("study.antares"),
+ file_type=FileType.SIMPLE_INI,
+ )
+ version: int = study_info.get("antares", {}).get("version", -1)
+ return version
+
+
+def _parse_parameters(path: Path) -> Tuple[bool, List[str], str]:
+ general = _extract_data_from_file(
+ root=path,
+ inside_root_path=Path("settings/generaldata.ini"),
+ file_type=FileType.MULTI_INI,
+ )
+
+ store_new_set: bool = general.get("output", {}).get("storenewset", False)
+ archive_input_series: List[str] = [
+ e.strip()
+ for e in general.get("output", {})
+ .get("archives", "")
+ .strip()
+ .split(",")
+ if e.strip()
+ ]
+ enr_modelling: str = general.get("other preferences", {}).get(
+ "renewable-generation-modelling", "aggregated"
+ )
+ return store_new_set, archive_input_series, enr_modelling
+
+
+def _parse_bindings(root: Path) -> List[BindingConstraintDTO]:
+ bindings = _extract_data_from_file(
+ root=root,
+ inside_root_path=Path(
+ "input/bindingconstraints/bindingconstraints.ini"
+ ),
+ file_type=FileType.SIMPLE_INI,
+ )
+ output_list = []
+ for bind in bindings.values():
+ area_set = set()
+ # contains a set of strings in the following format: "area.cluster"
+ cluster_set = set()
+ for key in bind:
+ if "%" in key:
+ areas = key.split("%", 1)
+ area_set.add(areas[0])
+ area_set.add(areas[1])
+ elif "." in key:
+ cluster_set.add(key)
+ area_set.add(key.split(".", 1)[0])
+
+ output_list.append(
+ BindingConstraintDTO(
+ id=bind["id"], areas=area_set, clusters=cluster_set
+ )
)
- return store_new_set, archive_input_series, enr_modelling
- @staticmethod
- def _parse_bindings(root: Path) -> List[BindingConstraintDTO]:
- bindings = ConfigPathBuilder._extract_data_from_file(
- root=root,
- inside_root_path=Path(
- "input/bindingconstraints/bindingconstraints.ini"
+ return output_list
+
+
+def _parse_sets(root: Path) -> Dict[str, DistrictSet]:
+ obj = _extract_data_from_file(
+ root=root,
+ inside_root_path=Path("input/areas/sets.ini"),
+ file_type=FileType.MULTI_INI,
+ multi_ini_keys=["+", "-"],
+ )
+ return {
+ transform_name_to_id(name): DistrictSet(
+ areas=item.get(
+ "-"
+ if item.get("apply-filter", "remove-all") == "add-all"
+ else "+"
),
- file_type=FileType.SIMPLE_INI,
+ name=item.get("caption"),
+ inverted_set=item.get("apply-filter", "remove-all") == "add-all",
+ output=item.get("output", True),
)
- output_list = []
- for id, bind in bindings.items():
- area_set = set()
- cluster_set = (
- set()
- ) # contains a list of strings in the following format: "area.cluster"
- for key in bind.keys():
- if "%" in key:
- areas = key.split("%")
- area_set.add(areas[0])
- area_set.add(areas[1])
- elif "." in key:
- cluster_set.add(key)
- area_set.add(key.split(".")[0])
-
- output_list.append(
- BindingConstraintDTO(
- id=bind["id"], areas=area_set, clusters=cluster_set
- )
- )
-
- return output_list
-
- @staticmethod
- def _parse_sets(root: Path) -> Dict[str, DistrictSet]:
- json = ConfigPathBuilder._extract_data_from_file(
- root=root,
- inside_root_path=Path("input/areas/sets.ini"),
- file_type=FileType.MULTI_INI,
- multi_ini_keys=["+", "-"],
+ for name, item in obj.items()
+ }
+
+
+def _parse_areas(root: Path) -> Dict[str, Area]:
+ areas = _extract_data_from_file(
+ root=root,
+ inside_root_path=Path("input/areas/list.txt"),
+ file_type=FileType.TXT,
+ )
+ areas = [a for a in areas if a != ""]
+ return {transform_name_to_id(a): parse_area(root, a) for a in areas}
+
+
+def _parse_outputs(output_path: Path) -> Dict[str, Simulation]:
+ if not output_path.is_dir():
+ return {}
+ sims = {}
+ # Paths are sorted to have the folders _before_ the ZIP files with the same name.
+ for path in sorted(output_path.iterdir()):
+ suffix = path.suffix.lower()
+ path_name = path.name
+ try:
+ if suffix == ".tmp" or path_name.startswith("~"):
+ continue
+ elif suffix == ".zip":
+ if path.stem not in sims:
+ if simulation := parse_simulation_zip(path):
+ sims[path.stem] = simulation
+ elif (path / "about-the-study/parameters.ini").exists():
+ if simulation := parse_simulation(
+ path, canonical_name=path_name
+ ):
+ sims[path_name] = simulation
+ except SimulationParsingError as exc:
+ logger.warning(str(exc), exc_info=True)
+ return sims
+
+
+def parse_simulation_zip(path: Path) -> Simulation:
+ with tempfile.TemporaryDirectory(
+ dir=path.parent, prefix=f"~{path.stem}-", suffix=".tmp"
+ ) as output_dir:
+ try:
+ with zipfile.ZipFile(path) as zf:
+ zf.extractall(output_dir)
+ except zipfile.BadZipFile as exc:
+ raise SimulationParsingError(path, f"Bad ZIP file: {exc}") from exc
+ simulation = parse_simulation(
+ Path(output_dir), canonical_name=path.stem
)
- return {
- transform_name_to_id(name): DistrictSet(
- areas=item.get(
- "-"
- if item.get("apply-filter", "remove-all") == "add-all"
- else "+"
- ),
- name=item.get("caption"),
- inverted_set=item.get("apply-filter", "remove-all")
- == "add-all",
- output=item.get("output", True),
- )
- for name, item in json.items()
- }
-
- @staticmethod
- def _parse_areas(root: Path) -> Dict[str, Area]:
- areas = ConfigPathBuilder._extract_data_from_file(
- root=root,
- inside_root_path=Path("input/areas/list.txt"),
- file_type=FileType.TXT,
+ simulation.archived = True
+ return simulation
+
+
+def _parse_xpansion_version(path: Path) -> str:
+ xpansion_json = path / "expansion" / "out.json"
+ try:
+ content = xpansion_json.read_text(encoding="utf-8")
+ obj = json.loads(content)
+ return str(obj["antares_xpansion"]["version"])
+ except FileNotFoundError:
+ return ""
+ except json.JSONDecodeError as exc:
+ raise XpansionParsingError(
+ xpansion_json, f"invalid JSON format: {exc}"
+ ) from exc
+ except KeyError as exc:
+ raise XpansionParsingError(
+ xpansion_json, f"key '{exc}' not found in JSON object"
+ ) from exc
+
+
+_regex_eco_adq = re.compile("^([0-9]{8}-[0-9]{4})(eco|adq)-?(.*)")
+match_eco_adq = _regex_eco_adq.match
+
+
+def parse_simulation(path: Path, canonical_name: str) -> Simulation:
+ modes = {"eco": "economy", "adq": "adequacy"}
+ match = match_eco_adq(canonical_name)
+ if match is None:
+ raise SimulationParsingError(
+ path,
+ reason=f"Filename '{canonical_name}' doesn't match {_regex_eco_adq.pattern}",
)
- areas = [a for a in areas if a != ""]
- return {
- transform_name_to_id(a): ConfigPathBuilder.parse_area(root, a)
- for a in areas
- }
- @staticmethod
- def _parse_outputs(output_path: Path) -> Dict[str, Simulation]:
- if not output_path.exists():
- return {}
-
- files = sorted(output_path.iterdir())
- sims = {
- f.stem
- if f.suffix == ".zip"
- else f.name: ConfigPathBuilder.parse_simulation(f)
- for i, f in enumerate(files)
- if (f / "about-the-study").exists() or f.suffix == ".zip"
- }
- return {k: v for k, v in sims.items() if v}
-
- @staticmethod
- def parse_simulation(path: Path) -> Optional["Simulation"]:
- modes = {"eco": "economy", "adq": "adequacy"}
- regex: Any = re.search(
- "^([0-9]{8}-[0-9]{4})(eco|adq)-?(.*)",
- path.stem if path.suffix == ".zip" else path.name,
- )
- try:
- if path.suffix == ".zip":
- zf = ZipFile(path, "r")
- error = str("checkIntegrity.txt") not in zf.namelist()
- xpansion = str("lp/lp_namer.log") in zf.namelist()
- else:
- error = not (path / "checkIntegrity.txt").exists()
- xpansion = (path / "lp" / "lp_namer.log").exists()
- (
- nbyears,
- by_year,
- synthesis,
- playlist,
- ) = ConfigPathBuilder._parse_outputs_parameters(path)
- return Simulation(
- date=regex.group(1),
- mode=modes[regex.group(2)],
- name=regex.group(3),
- nbyears=nbyears,
- by_year=by_year,
- synthesis=synthesis,
- error=error,
- playlist=playlist,
- archived=path.suffix == ".zip",
- xpansion=xpansion,
- )
- except Exception as e:
- logger.warning(
- f"Failed to parse simulation found at {path}", exc_info=e
- )
+ try:
+ xpansion = _parse_xpansion_version(path)
+ except XpansionParsingError as exc:
+ # There is something wrong with Xpansion, let's assume it is not used!
+ logger.warning(str(exc), exc_info=True)
+ xpansion = ""
+
+ ini_path = path / "about-the-study" / "parameters.ini"
+ reader = MultipleSameKeysIniReader(DUPLICATE_KEYS)
+ try:
+ obj: JSON = reader.read(ini_path)
+ except FileNotFoundError:
+ raise SimulationParsingError(
+ path,
+ f"Parameters file '{ini_path.relative_to(path)}' not found",
+ ) from None
+
+ error = not (path / "checkIntegrity.txt").exists()
+ return Simulation(
+ date=match.group(1),
+ mode=modes[match.group(2)],
+ name=match.group(3),
+ nbyears=obj["general"]["nbyears"],
+ by_year=obj["general"]["year-by-year"],
+ synthesis=obj["output"]["synthesis"],
+ error=error,
+ playlist=list(get_playlist(obj) or {}),
+ archived=False,
+ xpansion=xpansion,
+ )
+
+
+def get_playlist(config: JSON) -> Optional[Dict[int, float]]:
+ general_config = config.get("general", {})
+ nb_years = cast(int, general_config.get("nbyears"))
+ playlist_activated = cast(bool, general_config.get("user-playlist", False))
+ if not playlist_activated:
return None
-
- @staticmethod
- def get_playlist(config: JSON) -> Optional[Dict[int, float]]:
- general_config = config.get("general", {})
- nb_years = cast(int, general_config.get("nbyears"))
- playlist_activated = cast(
- bool, general_config.get("user-playlist", False)
- )
- if not playlist_activated:
- return None
- playlist_config = config.get("playlist", {})
- playlist_reset = playlist_config.get("playlist_reset", True)
- added = playlist_config.get("playlist_year +", [])
- removed = playlist_config.get("playlist_year -", [])
- weights = {}
- for year_weight in playlist_config.get("playlist_year_weight", []):
- year_weight_elements = year_weight.split(",")
- weights[int(year_weight_elements[0])] = float(
- year_weight_elements[1]
- )
- if playlist_reset:
- return {
- year + 1: weights.get(year, 1)
- for year in range(0, nb_years)
- if year not in removed
- }
+ playlist_config = config.get("playlist", {})
+ playlist_reset = playlist_config.get("playlist_reset", True)
+ added = playlist_config.get("playlist_year +", [])
+ removed = playlist_config.get("playlist_year -", [])
+ weights = {}
+ for year_weight in playlist_config.get("playlist_year_weight", []):
+ year_weight_elements = year_weight.split(",")
+ weights[int(year_weight_elements[0])] = float(year_weight_elements[1])
+ if playlist_reset:
return {
year + 1: weights.get(year, 1)
- for year in added
+ for year in range(nb_years)
if year not in removed
}
-
- @staticmethod
- def _parse_outputs_parameters(
- path: Path,
- ) -> Tuple[int, bool, bool, Optional[List[int]]]:
- parameters_path_inside_output = "about-the-study/parameters.ini"
- full_path_parameters = path / parameters_path_inside_output
- tmp_dir = None
-
- if path.suffix == ".zip":
- tmp_dir = tempfile.TemporaryDirectory()
- with ZipFile(path, "r") as zip_obj:
- zip_obj.extract(parameters_path_inside_output, tmp_dir.name)
- full_path_parameters = (
- Path(tmp_dir.name) / parameters_path_inside_output
- )
-
- par: JSON = MultipleSameKeysIniReader(DUPLICATE_KEYS).read(
- full_path_parameters
- )
-
- if tmp_dir:
- tmp_dir.cleanup()
-
- return (
- par["general"]["nbyears"],
- par["general"]["year-by-year"],
- par["output"]["synthesis"],
- [
- year
- for year in (ConfigPathBuilder.get_playlist(par) or {}).keys()
- ],
+ return {
+ year + 1: weights.get(year, 1) for year in added if year not in removed
+ }
+
+
+def parse_area(root: Path, area: str) -> "Area":
+ area_id = transform_name_to_id(area)
+ return Area(
+ name=area,
+ links=_parse_links(root, area_id),
+ thermals=_parse_thermal(root, area_id),
+ renewables=_parse_renewables(root, area_id),
+ filters_synthesis=_parse_filters_synthesis(root, area_id),
+ filters_year=_parse_filters_year(root, area_id),
+ )
+
+
+def _parse_thermal(root: Path, area: str) -> List[Cluster]:
+ list_ini = _extract_data_from_file(
+ root=root,
+ inside_root_path=Path(f"input/thermal/clusters/{area}/list.ini"),
+ file_type=FileType.SIMPLE_INI,
+ )
+ return [
+ Cluster(
+ id=transform_name_to_id(key),
+ enabled=list_ini.get(key, {}).get("enabled", True),
+ name=list_ini.get(key, {}).get("name", key),
)
+ for key in list(list_ini.keys())
+ ]
- @staticmethod
- def parse_area(root: Path, area: str) -> "Area":
- area_id = transform_name_to_id(area)
- return Area(
- name=area,
- links=ConfigPathBuilder._parse_links(root, area_id),
- thermals=ConfigPathBuilder._parse_thermal(root, area_id),
- renewables=ConfigPathBuilder._parse_renewables(root, area_id),
- filters_synthesis=ConfigPathBuilder._parse_filters_synthesis(
- root, area_id
- ),
- filters_year=ConfigPathBuilder._parse_filters_year(root, area_id),
- )
- @staticmethod
- def _parse_thermal(root: Path, area: str) -> List[Cluster]:
- list_ini = ConfigPathBuilder._extract_data_from_file(
+def _parse_renewables(root: Path, area: str) -> List[Cluster]:
+ try:
+ list_ini = _extract_data_from_file(
root=root,
- inside_root_path=Path(f"input/thermal/clusters/{area}/list.ini"),
+ inside_root_path=Path(
+ f"input/renewables/clusters/{area}/list.ini"
+ ),
file_type=FileType.SIMPLE_INI,
)
return [
Cluster(
id=transform_name_to_id(key),
enabled=list_ini.get(key, {}).get("enabled", True),
- name=list_ini.get(key, {}).get("name", key),
+ name=list_ini.get(key, {}).get("name", None),
)
for key in list(list_ini.keys())
]
-
- @staticmethod
- def _parse_renewables(root: Path, area: str) -> List[Cluster]:
- try:
- list_ini = ConfigPathBuilder._extract_data_from_file(
- root=root,
- inside_root_path=Path(
- f"input/renewables/clusters/{area}/list.ini"
- ),
- file_type=FileType.SIMPLE_INI,
- )
- return [
- Cluster(
- id=transform_name_to_id(key),
- enabled=list_ini.get(key, {}).get("enabled", True),
- name=list_ini.get(key, {}).get("name", None),
- )
- for key in list(list_ini.keys())
- ]
- except:
- return []
-
- @staticmethod
- def _parse_links(root: Path, area: str) -> Dict[str, Link]:
- properties_ini = ConfigPathBuilder._extract_data_from_file(
- root=root,
- inside_root_path=Path(f"input/links/{area}/properties.ini"),
- file_type=FileType.SIMPLE_INI,
- )
- return {
- link: Link.from_json(properties_ini[link])
- for link in list(properties_ini.keys())
- }
-
- @staticmethod
- def _parse_filters_synthesis(root: Path, area: str) -> List[str]:
- optimization = ConfigPathBuilder._extract_data_from_file(
- root=root,
- inside_root_path=Path(f"input/areas/{area}/optimization.ini"),
- file_type=FileType.SIMPLE_INI,
- )
- filters: str = optimization["filtering"]["filter-synthesis"]
- return Link.split(filters)
-
- @staticmethod
- def _parse_filters_year(root: Path, area: str) -> List[str]:
- optimization = ConfigPathBuilder._extract_data_from_file(
- root=root,
- inside_root_path=Path(f"input/areas/{area}/optimization.ini"),
- file_type=FileType.SIMPLE_INI,
- )
- filters: str = optimization["filtering"]["filter-year-by-year"]
- return Link.split(filters)
+ except Exception:
+ return []
+
+
+def _parse_links(root: Path, area: str) -> Dict[str, Link]:
+ properties_ini = _extract_data_from_file(
+ root=root,
+ inside_root_path=Path(f"input/links/{area}/properties.ini"),
+ file_type=FileType.SIMPLE_INI,
+ )
+ return {
+ link: Link.from_json(properties_ini[link])
+ for link in list(properties_ini.keys())
+ }
+
+
+def _parse_filters_synthesis(root: Path, area: str) -> List[str]:
+ optimization = _extract_data_from_file(
+ root=root,
+ inside_root_path=Path(f"input/areas/{area}/optimization.ini"),
+ file_type=FileType.SIMPLE_INI,
+ )
+ filters: str = optimization["filtering"]["filter-synthesis"]
+ return Link.split(filters)
+
+
+def _parse_filters_year(root: Path, area: str) -> List[str]:
+ optimization = _extract_data_from_file(
+ root=root,
+ inside_root_path=Path(f"input/areas/{area}/optimization.ini"),
+ file_type=FileType.SIMPLE_INI,
+ )
+ filters: str = optimization["filtering"]["filter-year-by-year"]
+ return Link.split(filters)
diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/model.py b/antarest/study/storage/rawstudy/model/filesystem/config/model.py
index 6ff8e4ae38..ca602fca0d 100644
--- a/antarest/study/storage/rawstudy/model/filesystem/config/model.py
+++ b/antarest/study/storage/rawstudy/model/filesystem/config/model.py
@@ -91,7 +91,7 @@ class Simulation(BaseModel):
error: bool
playlist: Optional[List[int]]
archived: bool = False
- xpansion: bool = False
+ xpansion: str
def get_file(self) -> str:
modes = {"economy": "eco", "adequacy": "adq", "draft": "dft"}
diff --git a/antarest/study/storage/rawstudy/model/filesystem/factory.py b/antarest/study/storage/rawstudy/model/filesystem/factory.py
index 66d532f26e..0030f31cdb 100644
--- a/antarest/study/storage/rawstudy/model/filesystem/factory.py
+++ b/antarest/study/storage/rawstudy/model/filesystem/factory.py
@@ -9,9 +9,7 @@
from antarest.matrixstore.uri_resolver_service import (
UriResolverService,
)
-from antarest.study.storage.rawstudy.model.filesystem.config.files import (
- ConfigPathBuilder,
-)
+from antarest.study.storage.rawstudy.model.filesystem.config.files import build
from antarest.study.storage.rawstudy.model.filesystem.config.model import (
FileStudyTreeConfig,
FileStudyTreeConfigDTO,
@@ -63,7 +61,7 @@ def create_from_fs(
).to_build_config()
return FileStudy(config, FileStudyTree(self.context, config))
start_time = time.time()
- config = ConfigPathBuilder.build(path, study_id, output_path)
+ config = build(path, study_id, output_path)
duration = "{:.3f}".format(time.time() - start_time)
logger.info(f"Study {study_id} config built in {duration}s")
result = FileStudy(config, FileStudyTree(self.context, config))
diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py b/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py
index 39b38c0ea7..2c1ed018ce 100644
--- a/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py
+++ b/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py
@@ -66,7 +66,10 @@ def async_denormalize(self) -> Thread:
logger.info(
f"Denormalizing (async) study data for study {self.config.study_id}"
)
- thread = Thread(target=self._threaded_denormalize)
+ thread = Thread(
+ target=self._threaded_denormalize,
+ name=f"{self.__class__.__name__}-Denormalizer",
+ )
thread.start()
return thread
diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py b/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py
index a5b035c68b..eaadcec4f3 100644
--- a/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py
+++ b/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py
@@ -106,36 +106,48 @@ class GeneralData(IniFileNode):
def __init__(self, context: ContextServer, config: FileStudyTreeConfig):
types = deepcopy(GeneralData.TYPES)
+ general = types["general"]
+ optimization = types["optimization"]
+ other_preferences = types["other preferences"]
if config.version >= 650:
- types["other preferences"]["initial-reservoir-levels"] = str
+ other_preferences["initial-reservoir-levels"] = str
if config.version >= 700:
- types["optimization"]["link-type"] = str
+ optimization["link-type"] = str
if config.version >= 710:
- types["general"]["thematic-trimming"] = bool
- types["general"]["geographic-trimming"] = bool
- del types["general"]["filtering"]
+ general["thematic-trimming"] = bool
+ general["geographic-trimming"] = bool
+ del general["filtering"]
if config.version >= 720:
- types["other preferences"]["hydro-pricing-mode"] = str
+ other_preferences["hydro-pricing-mode"] = str
if config.version >= 800:
- types["other preferences"]["hydro-heuristic-policy"] = str
- types["optimization"]["include-exportstructure"] = bool
- types["optimization"]["include-unfeasible-problem-behavior"] = str
- types["general"]["custom-scenario"] = bool
- del types["general"]["custom-ts-numbers"]
+ other_preferences["hydro-heuristic-policy"] = str
+ optimization["include-exportstructure"] = bool
+ optimization["include-unfeasible-problem-behavior"] = str
+ general["custom-scenario"] = bool
+ del general["custom-ts-numbers"]
if config.version >= 810:
- types["other preferences"]["renewable-generation-modelling"] = str
+ other_preferences["renewable-generation-modelling"] = str
if config.version >= 830:
types["adequacy patch"] = {
"include-adq-patch": bool,
"set-to-null-ntc-from-physical-out-to-physical-in-for-first-step": bool,
"set-to-null-ntc-between-physical-out-for-first-step": bool,
}
- types["optimization"]["include-split-exported-mps"] = bool
- types["optimization"][
- "include-exportmps"
- ] = str # none, optim-1, optim-2, both-optims
+ optimization["include-split-exported-mps"] = bool
+ # include-exportmps: none, optim-1, optim-2, both-optims
+ optimization["include-exportmps"] = str
if config.version >= 840:
- del types["optimization"]["include-split-exported-mps"]
+ del optimization["include-split-exported-mps"]
+ if config.version >= 850:
+ # fmt: off
+ adequacy = types["adequacy patch"]
+ adequacy["price-taking-order"] = str
+ adequacy["include-hurdle-cost-csr"] = bool
+ adequacy["check-csr-cost-function"] = bool
+ adequacy["threshold-initiate-curtailment-sharing-rule"] = float
+ adequacy["threshold-display-local-matching-rule-violations"] = float
+ adequacy["threshold-csr-variable-bounds-relaxation"] = int
+ # fmt: on
IniFileNode.__init__(
self,
diff --git a/antarest/study/storage/rawstudy/model/helpers.py b/antarest/study/storage/rawstudy/model/helpers.py
index 72a6caef0b..d7c302493c 100644
--- a/antarest/study/storage/rawstudy/model/helpers.py
+++ b/antarest/study/storage/rawstudy/model/helpers.py
@@ -3,7 +3,7 @@
from antarest.core.model import JSON
from antarest.core.utils.utils import assert_this
from antarest.study.storage.rawstudy.model.filesystem.config.files import (
- ConfigPathBuilder,
+ get_playlist,
)
from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy
@@ -32,7 +32,7 @@ def get_playlist(
study: FileStudy, output_id: Optional[str] = None
) -> Optional[Dict[int, float]]:
config = FileStudyHelpers.get_config(study, output_id)
- return ConfigPathBuilder.get_playlist(config)
+ return get_playlist(config)
@staticmethod
def set_playlist(
diff --git a/antarest/study/storage/rawstudy/raw_study_service.py b/antarest/study/storage/rawstudy/raw_study_service.py
index a5cbd0394a..c56ace5dc5 100644
--- a/antarest/study/storage/rawstudy/raw_study_service.py
+++ b/antarest/study/storage/rawstudy/raw_study_service.py
@@ -73,6 +73,7 @@ def __init__(
self.path_resources: Path = path_resources
self.cleanup_thread = Thread(
target=RawStudyService.cleanup_lazynode_zipfilelist_cache,
+ name=f"{self.__class__.__name__}-Cleaner",
daemon=True,
)
self.cleanup_thread.start()
diff --git a/antarest/study/storage/rawstudy/watcher.py b/antarest/study/storage/rawstudy/watcher.py
index fb7b960d1c..0d6e85045b 100644
--- a/antarest/study/storage/rawstudy/watcher.py
+++ b/antarest/study/storage/rawstudy/watcher.py
@@ -12,6 +12,7 @@
from filelock import FileLock
from antarest.core.config import Config
+from antarest.core.exceptions import CannotScanInternalWorkspace
from antarest.core.interfaces.service import IService
from antarest.core.requests import RequestParameters
from antarest.core.tasks.model import TaskResult, TaskType
@@ -204,6 +205,8 @@ def scan(
studies: List[StudyFolder] = list()
directory_path: Optional[Path] = None
if workspace_directory_path is not None and workspace_name:
+ if workspace_name == DEFAULT_WORKSPACE_NAME:
+ raise CannotScanInternalWorkspace
try:
workspace = self.config.storage.workspaces[workspace_name]
except KeyError:
diff --git a/antarest/study/storage/study_upgrader/__init__.py b/antarest/study/storage/study_upgrader/__init__.py
new file mode 100644
index 0000000000..fff88ee0d8
--- /dev/null
+++ b/antarest/study/storage/study_upgrader/__init__.py
@@ -0,0 +1,195 @@
+from http import HTTPStatus
+from http.client import HTTPException
+from pathlib import Path
+from typing import NamedTuple, Callable
+import logging
+import re
+import shutil
+import tempfile
+import time
+
+from antarest.core.exceptions import StudyValidationError
+
+from .upgrader_710 import upgrade_710
+from .upgrader_720 import upgrade_720
+from .upgrader_800 import upgrade_800
+from .upgrader_810 import upgrade_810
+from .upgrader_820 import upgrade_820
+from .upgrader_830 import upgrade_830
+from .upgrader_840 import upgrade_840
+from .upgrader_850 import upgrade_850
+
+
+logger = logging.getLogger(__name__)
+
+
+class UpgradeMethod(NamedTuple):
+ """Raw study upgrade method (old version, new version, upgrade function)."""
+
+ old: str
+ new: str
+ method: Callable[[Path], None]
+
+
+UPGRADE_METHODS = [
+ UpgradeMethod("700", "710", upgrade_710),
+ UpgradeMethod("710", "720", upgrade_720),
+ UpgradeMethod("720", "800", upgrade_800),
+ UpgradeMethod("800", "810", upgrade_810),
+ UpgradeMethod("810", "820", upgrade_820),
+ UpgradeMethod("820", "830", upgrade_830),
+ UpgradeMethod("830", "840", upgrade_840),
+ UpgradeMethod("840", "850", upgrade_850),
+]
+
+
+class InvalidUpgrade(HTTPException):
+ def __init__(self, message: str) -> None:
+ super().__init__(HTTPStatus.UNPROCESSABLE_ENTITY, message)
+
+
+def find_next_version(from_version: str) -> str:
+ """
+ Find the next study version from the given version.
+
+ Args:
+ from_version: The current version as a string.
+
+ Returns:
+ The next version as a string.
+ If no next version was found, returns an empty string.
+ """
+ return next(
+ (meth.new for meth in UPGRADE_METHODS if from_version == meth.old),
+ "",
+ )
+
+
+def upgrade_study(study_path: Path, target_version: str) -> None:
+ tmp_dir = Path(
+ tempfile.mkdtemp(
+ suffix=".upgrade.tmp", prefix="~", dir=study_path.parent
+ )
+ )
+ shutil.copytree(study_path, tmp_dir, dirs_exist_ok=True)
+ try:
+ src_version = get_current_version(tmp_dir)
+ can_upgrade_version(src_version, target_version)
+ _do_upgrade(tmp_dir, src_version, target_version)
+ except (StudyValidationError, InvalidUpgrade) as e:
+ shutil.rmtree(tmp_dir)
+ logger.warning(str(e))
+ raise
+ except Exception as e:
+ shutil.rmtree(tmp_dir)
+ logger.error(f"Unhandled exception : {e}", exc_info=True)
+ raise
+ else:
+ backup_dir = Path(
+ tempfile.mkdtemp(
+ suffix=".backup.tmp", prefix="~", dir=study_path.parent
+ )
+ )
+ backup_dir.rmdir()
+ study_path.rename(backup_dir)
+ tmp_dir.rename(study_path)
+ shutil.rmtree(backup_dir, ignore_errors=True)
+
+
+def get_current_version(study_path: Path) -> str:
+ """
+ Get the current version of a study.
+
+ Args:
+ study_path: Path to the study.
+
+ Returns:
+ The current version of the study.
+
+ Raises:
+ StudyValidationError: If the version number is not found in the
+ `study.antares` file or does not match the expected format.
+ """
+
+ antares_path = study_path / "study.antares"
+ pattern = r"version\s*=\s*([\w.-]+)\s*"
+ with antares_path.open(encoding="utf-8") as lines:
+ for line in lines:
+ if match := re.fullmatch(pattern, line):
+ return match[1].rstrip()
+ raise StudyValidationError(
+ f"File parsing error: the version number is not found in '{antares_path}'"
+ f" or does not match the expected '{pattern}' format."
+ )
+
+
+def can_upgrade_version(from_version: str, to_version: str) -> None:
+ """
+ Checks if upgrading from one version to another is possible.
+
+ Args:
+ from_version: The current version of the study.
+ to_version: The target version of the study.
+
+ Raises:
+ InvalidUpgrade: If the upgrade is not possible.
+ """
+ if from_version == to_version:
+ raise InvalidUpgrade(
+ f"Your study is already in version '{to_version}'"
+ )
+
+ sources = [u.old for u in UPGRADE_METHODS]
+ if from_version not in sources:
+ raise InvalidUpgrade(
+ f"Version '{from_version}' unknown: possible versions are {', '.join(sources)}"
+ )
+
+ targets = [u.new for u in UPGRADE_METHODS]
+ if to_version not in targets:
+ raise InvalidUpgrade(
+ f"Version '{to_version}' unknown: possible versions are {', '.join(targets)}"
+ )
+
+ curr_version = from_version
+ for src, dst in zip(sources, targets):
+ if curr_version == src:
+ curr_version = dst
+ if curr_version == to_version:
+ return
+
+ # This code must be unreachable!
+ raise InvalidUpgrade(
+ f"Impossible to upgrade from version '{from_version}'"
+ f" to version '{to_version}':"
+ f" missing value in `UPGRADE_METHODS`."
+ )
+
+
+def _update_study_antares_file(target_version: str, study_path: Path) -> None:
+ file = study_path / "study.antares"
+ content = file.read_text(encoding="utf-8")
+ content = re.sub(
+ r"^version\s*=.*$",
+ f"version = {target_version}",
+ content,
+ flags=re.MULTILINE,
+ )
+ content = re.sub(
+ r"^lastsave\s*=.*$",
+ f"lastsave = {int(time.time())}",
+ content,
+ flags=re.MULTILINE,
+ )
+ file.write_text(content, encoding="utf-8")
+
+
+def _do_upgrade(
+ study_path: Path, src_version: str, target_version: str
+) -> None:
+ _update_study_antares_file(target_version, study_path)
+ curr_version = src_version
+ for old, new, method in UPGRADE_METHODS:
+ if curr_version == old and curr_version != target_version:
+ method(study_path)
+ curr_version = new
diff --git a/antarest/study/storage/study_upgrader/upgrader_710.py b/antarest/study/storage/study_upgrader/upgrader_710.py
new file mode 100644
index 0000000000..2d3be91e39
--- /dev/null
+++ b/antarest/study/storage/study_upgrader/upgrader_710.py
@@ -0,0 +1,30 @@
+from pathlib import Path
+from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader
+from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter
+from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import (
+ DUPLICATE_KEYS,
+)
+
+GENERAL_DATA_PATH = "settings/generaldata.ini"
+
+
+def upgrade_710(study_path: Path) -> None:
+ """
+ Upgrade the study configuration to version 710.
+
+ NOTE:
+ The file `study.antares` is not upgraded here.
+
+ Args:
+ study_path: path to the study directory.
+ """
+
+ reader = MultipleSameKeysIniReader(DUPLICATE_KEYS)
+ data = reader.read(study_path / GENERAL_DATA_PATH)
+ data["general"]["geographic-trimming"] = data["general"]["filtering"]
+ data["general"]["thematic-trimming"] = False
+ data["optimization"]["link-type"] = "local"
+ data["other preferences"]["hydro-pricing-mode"] = "fast"
+ del data["general"]["filtering"]
+ writer = IniWriter(special_keys=DUPLICATE_KEYS)
+ writer.write(data, study_path / GENERAL_DATA_PATH)
diff --git a/antarest/study/storage/study_upgrader/upgrader_720.py b/antarest/study/storage/study_upgrader/upgrader_720.py
new file mode 100644
index 0000000000..25e740baed
--- /dev/null
+++ b/antarest/study/storage/study_upgrader/upgrader_720.py
@@ -0,0 +1,6 @@
+from pathlib import Path
+
+
+def upgrade_720(study_path: Path) -> None:
+ # There is no input modification between the 7.1.0 and the 7.2.0 version
+ pass
diff --git a/antarest/study/storage/study_upgrader/upgrader_800.py b/antarest/study/storage/study_upgrader/upgrader_800.py
new file mode 100644
index 0000000000..faf0074bb4
--- /dev/null
+++ b/antarest/study/storage/study_upgrader/upgrader_800.py
@@ -0,0 +1,34 @@
+from pathlib import Path
+from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader
+from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter
+from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import (
+ DUPLICATE_KEYS,
+)
+
+GENERAL_DATA_PATH = "settings/generaldata.ini"
+
+
+def upgrade_800(study_path: Path) -> None:
+ """
+ Upgrade the study configuration to version 800.
+
+ NOTE:
+ The file `study.antares` is not upgraded here.
+
+ Args:
+ study_path: path to the study directory.
+ """
+
+ reader = MultipleSameKeysIniReader(DUPLICATE_KEYS)
+ data = reader.read(study_path / GENERAL_DATA_PATH)
+ data["other preferences"][
+ "hydro-heuristic-policy"
+ ] = "accommodate rule curves"
+ data["optimization"]["include-exportstructure"] = False
+ data["optimization"][
+ "include-unfeasible-problem-behavior"
+ ] = "error-verbose"
+ data["general"]["custom-scenario"] = data["general"]["custom-ts-numbers"]
+ del data["general"]["custom-ts-numbers"]
+ writer = IniWriter(special_keys=DUPLICATE_KEYS)
+ writer.write(data, study_path / GENERAL_DATA_PATH)
diff --git a/antarest/study/storage/study_upgrader/upgrader_810.py b/antarest/study/storage/study_upgrader/upgrader_810.py
new file mode 100644
index 0000000000..a23d71922e
--- /dev/null
+++ b/antarest/study/storage/study_upgrader/upgrader_810.py
@@ -0,0 +1,28 @@
+from pathlib import Path
+from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader
+from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter
+from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import (
+ DUPLICATE_KEYS,
+)
+
+GENERAL_DATA_PATH = "settings/generaldata.ini"
+
+
+def upgrade_810(study_path: Path) -> None:
+ """
+ Upgrade the study configuration to version 810.
+
+ NOTE:
+ The file `study.antares` is not upgraded here.
+
+ Args:
+ study_path: path to the study directory.
+ """
+
+ reader = MultipleSameKeysIniReader(DUPLICATE_KEYS)
+ data = reader.read(study_path / GENERAL_DATA_PATH)
+ data["other preferences"]["renewable-generation-modelling"] = "aggregated"
+ writer = IniWriter(special_keys=DUPLICATE_KEYS)
+ writer.write(data, study_path / GENERAL_DATA_PATH)
+ study_path.joinpath("input", "renewables", "clusters").mkdir(parents=True)
+ study_path.joinpath("input", "renewables", "series").mkdir(parents=True)
diff --git a/antarest/study/storage/study_upgrader/upgrader_820.py b/antarest/study/storage/study_upgrader/upgrader_820.py
new file mode 100644
index 0000000000..f65d054047
--- /dev/null
+++ b/antarest/study/storage/study_upgrader/upgrader_820.py
@@ -0,0 +1,50 @@
+import glob
+from pathlib import Path
+
+import numpy
+import pandas # type: ignore
+
+
+def upgrade_820(study_path: Path) -> None:
+ """
+ Upgrade the study configuration to version 820.
+
+ NOTE:
+ The file `study.antares` is not upgraded here.
+
+ Args:
+ study_path: path to the study directory.
+ """
+
+ links = glob.glob(str(study_path / "input" / "links" / "*"))
+ if len(links) > 0:
+ for folder in links:
+ folder_path = Path(folder)
+ all_txt = glob.glob(str(folder_path / "*.txt"))
+ if len(all_txt) > 0:
+ (folder_path / "capacities").mkdir()
+ for txt in all_txt:
+ df = pandas.read_csv(txt, sep="\t", header=None)
+ df_parameters = df.iloc[:, 2:8]
+ df_direct = df.iloc[:, 0]
+ df_indirect = df.iloc[:, 1]
+ name = Path(txt).stem
+ numpy.savetxt(
+ folder_path / f"{name}_parameters.txt",
+ df_parameters.values,
+ delimiter="\t",
+ fmt="%.6f",
+ )
+ numpy.savetxt(
+ folder_path / "capacities" / f"{name}_direct.txt",
+ df_direct.values,
+ delimiter="\t",
+ fmt="%.6f",
+ )
+ numpy.savetxt(
+ folder_path / "capacities" / f"{name}_indirect.txt",
+ df_indirect.values,
+ delimiter="\t",
+ fmt="%.6f",
+ )
+ (folder_path / f"{name}.txt").unlink()
diff --git a/antarest/study/storage/study_upgrader/upgrader_830.py b/antarest/study/storage/study_upgrader/upgrader_830.py
new file mode 100644
index 0000000000..dbf75b1643
--- /dev/null
+++ b/antarest/study/storage/study_upgrader/upgrader_830.py
@@ -0,0 +1,42 @@
+import glob
+from pathlib import Path
+
+from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader
+from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter
+from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import (
+ DUPLICATE_KEYS,
+)
+
+GENERAL_DATA_PATH = "settings/generaldata.ini"
+
+
+def upgrade_830(study_path: Path) -> None:
+ """
+ Upgrade the study configuration to version 830.
+
+ NOTE:
+ The file `study.antares` is not upgraded here.
+
+ Args:
+ study_path: path to the study directory.
+ """
+
+ reader = MultipleSameKeysIniReader(DUPLICATE_KEYS)
+ data = reader.read(study_path / GENERAL_DATA_PATH)
+ data["adequacy patch"] = {
+ "include-adq-patch": False,
+ "set-to-null-ntc-between-physical-out-for-first-step": True,
+ "set-to-null-ntc-from-physical-out-to-physical-in-for-first-step": True,
+ }
+ data["optimization"]["include-split-exported-mps"] = False
+ writer = IniWriter(special_keys=DUPLICATE_KEYS)
+ writer.write(data, study_path / GENERAL_DATA_PATH)
+ areas = glob.glob(str(study_path / "input" / "areas" / "*"))
+ for folder in areas:
+ folder_path = Path(folder)
+ if folder_path.is_dir():
+ writer = IniWriter(special_keys=DUPLICATE_KEYS)
+ writer.write(
+ {"adequacy-patch": {"adequacy-patch-mode": "outside"}},
+ folder_path / "adequacy_patch.ini",
+ )
diff --git a/antarest/study/storage/study_upgrader/upgrader_840.py b/antarest/study/storage/study_upgrader/upgrader_840.py
new file mode 100644
index 0000000000..ed8a30be8a
--- /dev/null
+++ b/antarest/study/storage/study_upgrader/upgrader_840.py
@@ -0,0 +1,36 @@
+from pathlib import Path
+from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader
+from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter
+from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import (
+ DUPLICATE_KEYS,
+)
+
+GENERAL_DATA_PATH = "settings/generaldata.ini"
+MAPPING_TRANSMISSION_CAPACITIES = {
+ True: "local-values",
+ False: "null-for-all-links",
+ "infinite": "infinite-for-all-links",
+}
+
+
+def upgrade_840(study_path: Path) -> None:
+ """
+ Upgrade the study configuration to version 840.
+
+ NOTE:
+ The file `study.antares` is not upgraded here.
+
+ Args:
+ study_path: path to the study directory.
+ """
+
+ reader = MultipleSameKeysIniReader(DUPLICATE_KEYS)
+ data = reader.read(study_path / GENERAL_DATA_PATH)
+ data["optimization"][
+ "transmission-capacities"
+ ] = MAPPING_TRANSMISSION_CAPACITIES[
+ data["optimization"]["transmission-capacities"]
+ ]
+ del data["optimization"]["include-split-exported-mps"]
+ writer = IniWriter(special_keys=DUPLICATE_KEYS)
+ writer.write(data, study_path / GENERAL_DATA_PATH)
diff --git a/antarest/study/storage/study_upgrader/upgrader_850.py b/antarest/study/storage/study_upgrader/upgrader_850.py
new file mode 100644
index 0000000000..c47b69ed58
--- /dev/null
+++ b/antarest/study/storage/study_upgrader/upgrader_850.py
@@ -0,0 +1,34 @@
+from pathlib import Path
+from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader
+from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter
+from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import (
+ DUPLICATE_KEYS,
+)
+
+# noinspection SpellCheckingInspection
+GENERAL_DATA_PATH = "settings/generaldata.ini"
+
+
+def upgrade_850(study_path: Path) -> None:
+ """
+ Upgrade the study configuration to version 850.
+
+ NOTE:
+ The file `study.antares` is not upgraded here.
+
+ Args:
+ study_path: path to the study directory.
+ """
+
+ reader = MultipleSameKeysIniReader(DUPLICATE_KEYS)
+ data = reader.read(study_path / GENERAL_DATA_PATH)
+ # fmt: off
+ data["adequacy patch"]["price-taking-order"] = "DENS"
+ data["adequacy patch"]["include-hurdle-cost-csr"] = False
+ data["adequacy patch"]["check-csr-cost-function"] = False
+ data["adequacy patch"]["threshold-initiate-curtailment-sharing-rule"] = 0.0
+ data["adequacy patch"]["threshold-display-local-matching-rule-violations"] = 0.0
+ data["adequacy patch"]["threshold-csr-variable-bounds-relaxation"] = 3
+ # fmt: on
+ writer = IniWriter(special_keys=DUPLICATE_KEYS)
+ writer.write(data, study_path / GENERAL_DATA_PATH)
diff --git a/antarest/study/storage/study_version_upgrader.py b/antarest/study/storage/study_version_upgrader.py
index 41446e0374..e69de29bb2 100644
--- a/antarest/study/storage/study_version_upgrader.py
+++ b/antarest/study/storage/study_version_upgrader.py
@@ -1,358 +0,0 @@
-import glob
-import json
-import os
-import typing
-from datetime import datetime
-from http import HTTPStatus
-from http.client import HTTPException
-from pathlib import Path
-from typing import Optional
-
-import numpy
-import pandas # type: ignore
-
-from antarest.core.exceptions import StudyValidationError
-from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader
-from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter
-from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import (
- DUPLICATE_KEYS,
-)
-
-
-def modify_file(
- study_path: str,
- file_path: str,
- key: str,
- parameter_to_add: Optional[str],
- value: typing.Any,
- parameter_to_delete: Optional[str],
-) -> None:
- reader = MultipleSameKeysIniReader(DUPLICATE_KEYS)
- file = glob.glob(os.path.join(study_path, file_path))[0]
- path = Path(file)
- data = reader.read(path)
- if key in data:
- if parameter_to_add is not None:
- data[key][parameter_to_add] = value
- if parameter_to_delete is not None:
- del data[key][parameter_to_delete]
- else:
- if parameter_to_add is not None:
- data[key] = {parameter_to_add: value}
- writer = IniWriter(special_keys=DUPLICATE_KEYS)
- writer.write(data, path)
-
-
-def find_value_in_file(
- study_path: str, file_path: str, key: str, parameter_to_check: str
-) -> typing.Any:
- reader = MultipleSameKeysIniReader(DUPLICATE_KEYS)
- file = glob.glob(os.path.join(study_path, file_path))[0]
- path = Path(file)
- data = reader.read(path)
- return data[key][parameter_to_check]
-
-
-sep = os.sep
-other_preferencies = "other preferences"
-general_data_path = f"settings{sep}generaldata.ini"
-adequacy_patch = "adequacy patch"
-mapping_transmission_capacities = {
- True: "local-values",
- False: "null-for-all-links",
- "infinite": "infinite-for-all-links",
-}
-
-
-def upgrade_700(study_path: str) -> None:
- # It's the basecase study so we pass
- pass
-
-
-def upgrade_710(study_path: str) -> None:
- geographical_trimming = find_value_in_file(
- study_path, general_data_path, "general", "filtering"
- )
- modify_file(
- study_path,
- general_data_path,
- "optimization",
- "link-type",
- "local",
- None,
- )
- modify_file(
- study_path,
- general_data_path,
- "general",
- "geographic-trimming",
- geographical_trimming,
- "filtering",
- )
- modify_file(
- study_path,
- general_data_path,
- "general",
- "thematic-trimming",
- False,
- None,
- )
- modify_file(
- study_path,
- general_data_path,
- other_preferencies,
- "hydro-pricing-mode",
- "fast",
- None,
- )
-
-
-def upgrade_720(study_path: str) -> None:
- # There is no input modification between the 7.1.0 and the 7.2.0 version
- pass
-
-
-def upgrade_800(study_path: str) -> None:
- custom_ts_numbers_value = find_value_in_file(
- study_path, general_data_path, "general", "custom-ts-numbers"
- )
- modify_file(
- study_path,
- general_data_path,
- other_preferencies,
- "hydro-heuristic-policy",
- "accommodate rule curves",
- None,
- )
- modify_file(
- study_path,
- general_data_path,
- "optimization",
- "include-exportstructure",
- False,
- None,
- )
- modify_file(
- study_path,
- general_data_path,
- "optimization",
- "include-unfeasible-problem-behavior",
- "error-verbose",
- None,
- )
- modify_file(
- study_path,
- general_data_path,
- "general",
- "custom-scenario",
- custom_ts_numbers_value,
- "custom-ts-numbers",
- )
-
-
-def upgrade_810(study_path: str) -> None:
- modify_file(
- study_path,
- general_data_path,
- other_preferencies,
- "renewable-generation-modelling",
- "aggregated",
- None,
- )
- os.mkdir(os.path.join(study_path + f"{sep}input", "renewables"))
- os.mkdir(
- os.path.join(study_path + f"{sep}input{sep}renewables", "clusters")
- )
- os.mkdir(os.path.join(study_path + f"{sep}input{sep}renewables", "series"))
- # TODO Cannot update study with renewables clusters for the moment
-
-
-def upgrade_820(study_path: str) -> None:
- links = glob.glob(os.path.join(study_path, f"input{sep}links{sep}*"))
- if len(links) > 0:
- for folder in links:
- all_txt = glob.glob(os.path.join(folder, "*.txt"))
- if len(all_txt) > 0:
- os.mkdir(os.path.join(folder, "capacities"))
- for txt in all_txt:
- df = pandas.read_csv(txt, sep="\t", header=None)
- df_parameters = df.iloc[:, 2:8]
- df_direct = df.iloc[:, 0]
- df_indirect = df.iloc[:, 1]
- reversed_txt = txt[::-1]
- k = 0
- while reversed_txt[k] != sep:
- k += 1
- name = reversed_txt[4:k][::-1]
- numpy.savetxt(
- folder + f"{sep}{name}_parameters.txt",
- df_parameters.values,
- delimiter="\t",
- fmt="%.6f",
- )
- numpy.savetxt(
- folder + f"{sep}capacities{sep}{name}_direct.txt",
- df_direct.values,
- delimiter="\t",
- fmt="%.6f",
- )
- numpy.savetxt(
- folder + f"{sep}capacities{sep}{name}_indirect.txt",
- df_indirect.values,
- delimiter="\t",
- fmt="%.6f",
- )
- os.remove(folder + f"{sep}{name}.txt")
-
-
-def upgrade_830(study_path: str) -> None:
- modify_file(
- study_path,
- general_data_path,
- "optimization",
- "include-split-exported-mps",
- False,
- None,
- )
- modify_file(
- study_path,
- general_data_path,
- adequacy_patch,
- "include-adq-patch",
- False,
- None,
- )
- modify_file(
- study_path,
- general_data_path,
- adequacy_patch,
- "set-to-null-ntc-between-physical-out-for-first-step",
- True,
- None,
- )
- modify_file(
- study_path,
- general_data_path,
- adequacy_patch,
- "set-to-null-ntc-from-physical-out-to-physical-in-for-first-step",
- True,
- None,
- )
- areas = glob.glob(os.path.join(study_path, f"input{sep}areas{sep}*"))
- if len(areas) > 0:
- for folder in areas:
- if Path(folder).is_dir():
- writer = IniWriter()
- writer.write(
- {"adequacy-patch": {"adequacy-patch-mode": "outside"}},
- Path(folder) / "adequacy_patch.ini",
- )
-
-
-def upgrade_840(study_path: str) -> None:
- old_value = find_value_in_file(
- study_path,
- general_data_path,
- "optimization",
- "transmission-capacities",
- )
- modify_file(
- study_path,
- general_data_path,
- "optimization",
- None,
- None,
- "include-split-exported-mps",
- )
- modify_file(
- study_path,
- general_data_path,
- "optimization",
- "transmission-capacities",
- mapping_transmission_capacities[old_value],
- None,
- )
-
-
-upgrade_methods = {
- 700: upgrade_700,
- 710: upgrade_710,
- 720: upgrade_720,
- 800: upgrade_800,
- 810: upgrade_810,
- 820: upgrade_820,
- 830: upgrade_830,
- 840: upgrade_840,
-}
-
-
-class InvalidUpgrade(HTTPException):
- def __init__(self, message: str) -> None:
- super().__init__(HTTPStatus.UNPROCESSABLE_ENTITY, message)
-
-
-def upgrade_study(study_path: str, new_version: int) -> None:
- old_version = get_current_version(study_path)
- check_upgrade_is_possible(old_version, new_version)
- return do_upgrade(study_path, old_version, new_version)
-
-
-def get_current_version(study_path: str) -> int:
- file = glob.glob(os.path.join(study_path, "study.antares"))
- if len(file) != 1:
- raise StudyValidationError("The path of your study is not valid")
- f = open(file[0])
- for line in f:
- if "version" in line:
- return int(line[10:])
- raise StudyValidationError(
- "Your study.antares file is not in the good format"
- )
-
-
-def check_upgrade_is_possible(old_version: int, new_version: int) -> None:
- if new_version not in upgrade_methods.keys():
- raise InvalidUpgrade(f"The version {new_version} is not supported")
- if old_version < 700 or new_version < 700:
- raise InvalidUpgrade(
- "Sorry the first version we deal with is the 7.0.0"
- )
- elif old_version > new_version:
- raise InvalidUpgrade("Cannot downgrade your study version")
- elif old_version == new_version:
- raise InvalidUpgrade(
- "The version you asked for is the one you currently have"
- )
-
-
-def update_study_antares_file(new_version: int, study_path: str) -> None:
- epoch_time = datetime(1970, 1, 1)
- delta = int((datetime.now() - epoch_time).total_seconds())
- file = glob.glob(os.path.join(study_path, "study.antares"))[0]
- with open(file, "r") as f:
- lines = f.readlines()
- lines[1] = f"version = {new_version}\n"
- lines[4] = f"lastsave = {delta}\n"
- with open(file, "w") as f:
- for item in lines:
- f.write(item)
- f.close()
-
-
-def do_upgrade(study_path: str, old_version: int, new_version: int) -> None:
- update_study_antares_file(new_version, study_path)
- possibilities = list(upgrade_methods.keys())
- start = 0
- end = len(possibilities) - 1
- while possibilities[start] != old_version:
- start += 1
- while possibilities[end] != new_version:
- end -= 1
- return recursive_changes(possibilities[start + 1 : end + 1], study_path)
-
-
-def recursive_changes(update_list: typing.List[int], study_path: str) -> None:
- if len(update_list) > 0:
- elt = update_list[0]
- upgrade_methods[elt](study_path)
- recursive_changes(update_list[1:], study_path)
diff --git a/antarest/study/storage/utils.py b/antarest/study/storage/utils.py
index 6f5c8b5ef5..8fe7223edd 100644
--- a/antarest/study/storage/utils.py
+++ b/antarest/study/storage/utils.py
@@ -4,11 +4,11 @@
import shutil
import tempfile
import time
-from datetime import timedelta, datetime
+from datetime import datetime, timedelta
from math import ceil
from pathlib import Path
from time import strptime
-from typing import Optional, Union, cast, Callable, List
+from typing import Callable, List, Optional, Union, cast
from uuid import uuid4
from zipfile import ZipFile
@@ -19,17 +19,17 @@
)
from antarest.core.interfaces.cache import CacheConstants, ICache
from antarest.core.jwt import JWTUser
-from antarest.core.model import PermissionInfo, StudyPermissionType, PublicMode
+from antarest.core.model import PermissionInfo, PublicMode, StudyPermissionType
from antarest.core.permissions import check_permission
from antarest.core.requests import UserHasNotPermissionError
from antarest.core.utils.utils import StopWatch
from antarest.study.model import (
DEFAULT_WORKSPACE_NAME,
- Study,
STUDY_REFERENCE_TEMPLATES,
- StudyMetadataDTO,
MatrixIndex,
+ Study,
StudyDownloadLevelDTO,
+ StudyMetadataDTO,
)
from antarest.study.storage.rawstudy.io.reader import IniReader
from antarest.study.storage.rawstudy.io.writer.ini_writer import IniWriter
@@ -208,18 +208,6 @@ def create_new_empty_study(
zip_output.extractall(path=path_study)
-def create_permission_from_study(
- study: Union[Study, StudyMetadataDTO]
-) -> PermissionInfo:
- return PermissionInfo(
- owner=study.owner.id if study.owner is not None else None,
- groups=[g.id for g in study.groups if g.id is not None],
- public_mode=PublicMode(study.public_mode)
- if study.public_mode is not None
- else PublicMode.NONE,
- )
-
-
def study_matcher(
name: Optional[str], workspace: Optional[str], folder: Optional[str]
) -> Callable[[StudyMetadataDTO], bool]:
@@ -262,7 +250,7 @@ def assert_permission(
logger.error("FAIL permission: study not exist")
raise ValueError("Metadata is None")
- permission_info = create_permission_from_study(study)
+ permission_info = PermissionInfo.from_study(study)
ok = check_permission(user, permission_info, permission_type)
if raising and not ok:
logger.error(
diff --git a/antarest/study/storage/variantstudy/business/command_extractor.py b/antarest/study/storage/variantstudy/business/command_extractor.py
index 33f9d8d4a1..53a41b4a42 100644
--- a/antarest/study/storage/variantstudy/business/command_extractor.py
+++ b/antarest/study/storage/variantstudy/business/command_extractor.py
@@ -8,13 +8,12 @@
from antarest.matrixstore.service import ISimpleMatrixService
from antarest.study.storage.patch_service import PatchService
from antarest.study.storage.rawstudy.model.filesystem.config.files import (
- ConfigPathBuilder,
+ get_playlist,
)
from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy
from antarest.study.storage.rawstudy.model.filesystem.root.filestudytree import (
FileStudyTree,
)
-from antarest.study.storage.rawstudy.model.helpers import FileStudyHelpers
from antarest.study.storage.variantstudy.business.matrix_constants_generator import (
GeneratorMatrixConstants,
)
@@ -569,7 +568,7 @@ def generate_update_playlist(
study_tree: FileStudyTree,
) -> ICommand:
config = study_tree.get(["settings", "generaldata"])
- playlist = ConfigPathBuilder.get_playlist(config)
+ playlist = get_playlist(config)
return UpdatePlaylist(
items=playlist.keys() if playlist else None,
weights={year for year, weight in playlist.items() if weight != 1}
diff --git a/antarest/study/storage/variantstudy/variant_study_service.py b/antarest/study/storage/variantstudy/variant_study_service.py
index 9ee6181f20..f1b615aa31 100644
--- a/antarest/study/storage/variantstudy/variant_study_service.py
+++ b/antarest/study/storage/variantstudy/variant_study_service.py
@@ -6,7 +6,7 @@
from datetime import datetime
from functools import reduce
from pathlib import Path
-from typing import List, Optional, cast, Tuple, Callable
+from typing import Callable, List, Optional, Tuple, cast
from uuid import uuid4
from fastapi import HTTPException
@@ -14,33 +14,35 @@
from antarest.core.config import Config
from antarest.core.exceptions import (
+ CommandNotFoundError,
+ CommandNotValid,
+ CommandUpdateAuthorizationError,
+ NoParentStudyError,
StudyNotFoundError,
StudyTypeUnsupported,
- NoParentStudyError,
- CommandNotFoundError,
VariantGenerationError,
VariantStudyParentNotValid,
- CommandNotValid,
- CommandUpdateAuthorizationError,
-)
-from antarest.core.filetransfer.model import (
- FileDownloadDTO,
- FileDownloadTaskDTO,
)
+from antarest.core.filetransfer.model import FileDownloadTaskDTO
from antarest.core.interfaces.cache import ICache
from antarest.core.interfaces.eventbus import (
- IEventBus,
Event,
- EventType,
EventChannelDirectory,
+ EventType,
+ IEventBus,
)
from antarest.core.jwt import DEFAULT_ADMIN_USER
-from antarest.core.model import JSON, StudyPermissionType
+from antarest.core.model import (
+ JSON,
+ PermissionInfo,
+ PublicMode,
+ StudyPermissionType,
+)
from antarest.core.requests import RequestParameters, UserHasNotPermissionError
from antarest.core.tasks.model import (
- TaskResult,
- TaskDTO,
CustomTaskEventMessages,
+ TaskDTO,
+ TaskResult,
TaskType,
)
from antarest.core.tasks.service import (
@@ -50,50 +52,47 @@
)
from antarest.core.utils.utils import assert_this, suppress_exception
from antarest.matrixstore.service import MatrixService
-from antarest.study.storage.variantstudy.business.utils import (
- transform_command_to_dto,
-)
from antarest.study.model import (
+ RawStudy,
Study,
+ StudyAdditionalData,
StudyMetadataDTO,
StudySimResultDTO,
- RawStudy,
- StudyAdditionalData,
)
from antarest.study.storage.abstract_storage_service import (
AbstractStorageService,
)
from antarest.study.storage.patch_service import PatchService
from antarest.study.storage.rawstudy.model.filesystem.config.model import (
- FileStudyTreeConfigDTO,
FileStudyTreeConfig,
+ FileStudyTreeConfigDTO,
)
from antarest.study.storage.rawstudy.model.filesystem.factory import (
FileStudy,
StudyFactory,
)
-from antarest.study.storage.rawstudy.raw_study_service import (
- RawStudyService,
-)
+from antarest.study.storage.rawstudy.raw_study_service import RawStudyService
from antarest.study.storage.utils import (
+ assert_permission,
+ export_study_flat,
get_default_workspace_path,
is_managed,
remove_from_cache,
- assert_permission,
- create_permission_from_study,
- export_study_flat,
+)
+from antarest.study.storage.variantstudy.business.utils import (
+ transform_command_to_dto,
)
from antarest.study.storage.variantstudy.command_factory import CommandFactory
from antarest.study.storage.variantstudy.model.command.icommand import ICommand
from antarest.study.storage.variantstudy.model.dbmodel import (
- VariantStudy,
CommandBlock,
+ VariantStudy,
VariantStudySnapshot,
)
from antarest.study.storage.variantstudy.model.model import (
CommandDTO,
- GenerationResultInfoDTO,
CommandResultDTO,
+ GenerationResultInfoDTO,
VariantTreeDTO,
)
from antarest.study.storage.variantstudy.repository import (
@@ -252,7 +251,7 @@ def append_commands(
Event(
type=EventType.STUDY_DATA_EDITED,
payload=study.to_json_summary(),
- permissions=create_permission_from_study(study),
+ permissions=PermissionInfo.from_study(study),
)
)
return [c.id for c in new_commands]
@@ -642,7 +641,7 @@ def create_variant_study(
Event(
type=EventType.STUDY_CREATED,
payload=variant_study.to_json_summary(),
- permissions=create_permission_from_study(variant_study),
+ permissions=PermissionInfo.from_study(variant_study),
)
)
logger.info(
@@ -885,6 +884,7 @@ def _generate(
study = self.study_factory.create_from_fs(
self.get_study_path(variant_study),
study_id=variant_study.id,
+ output_path=Path(variant_study.path) / OUTPUT_RELATIVE_PATH,
)
variant_study.additional_data = (
self._read_additional_data_from_files(study)
@@ -951,6 +951,7 @@ def notify(
Event(
type=EventType.STUDY_VARIANT_GENERATION_COMMAND_RESULT,
payload=command_result_obj,
+ permissions=PermissionInfo.from_study(variant_study),
channel=EventChannelDirectory.STUDY_GENERATION
+ variant_study.id,
)
@@ -1266,6 +1267,8 @@ def initialize_additional_data(self, variant_study: VariantStudy) -> bool:
study = self.study_factory.create_from_fs(
self.get_study_path(variant_study),
study_id=variant_study.id,
+ output_path=Path(variant_study.path)
+ / OUTPUT_RELATIVE_PATH,
)
variant_study.additional_data = (
self._read_additional_data_from_files(study)
diff --git a/antarest/study/web/studies_blueprint.py b/antarest/study/web/studies_blueprint.py
index ee64eab7a5..d1fad04d04 100644
--- a/antarest/study/web/studies_blueprint.py
+++ b/antarest/study/web/studies_blueprint.py
@@ -139,17 +139,36 @@ def import_study(
"/studies/{uuid}/upgrade",
status_code=HTTPStatus.OK,
tags=[APITag.study_management],
- summary="Upgrade study to a new version",
+ summary="Upgrade study to the target version (or next version if not specified)",
)
def upgrade_study(
- uuid: str, current_user: JWTUser = Depends(auth.get_current_user)
- ) -> Any:
- logger.info(
- f"Upgrade study {uuid} to a new version",
- extra={"user": current_user.id},
- )
+ uuid: str,
+ target_version: str = "",
+ current_user: JWTUser = Depends(auth.get_current_user),
+ ) -> str:
+ """
+ This entry point allows you to upgrade a study to the target version
+ or the next version if the target version is not specified.
+
+ This method starts an upgrade task in the task manager.
+
+ Args:
+ uuid: UUID of the study to upgrade.
+ target_version: target study version, or "" to upgrade to the next version.
+ current_user: Current authenticated user.
+
+ Returns:
+ Upgrade task ID.
+ """
+ msg = (
+ f"Upgrade study {uuid} to the version {target_version}"
+ if target_version
+ else f"Upgrade study {uuid} to the next version"
+ )
+ logger.info(msg, extra={"user": current_user.id})
params = RequestParameters(user=current_user)
- return study_service.upgrade_study(uuid, params)
+ # returns the task ID
+ return study_service.upgrade_study(uuid, target_version, params)
@bp.post(
"/studies/{uuid}/copy",
diff --git a/antarest/study/web/study_data_blueprint.py b/antarest/study/web/study_data_blueprint.py
index 14ea1819d5..83ce875852 100644
--- a/antarest/study/web/study_data_blueprint.py
+++ b/antarest/study/web/study_data_blueprint.py
@@ -40,6 +40,7 @@
OptimizationFormFields,
)
from antarest.study.business.playlist_management import PlaylistColumns
+from antarest.study.business.renewable_management import RenewableFormFields
from antarest.study.business.table_mode_management import (
ColumnModelTypes,
TableTemplateType,
@@ -47,6 +48,7 @@
from antarest.study.business.thematic_trimming_management import (
ThematicTrimmingFormFields,
)
+from antarest.study.business.thermal_management import ThermalFormFields
from antarest.study.business.timeseries_config_management import TSFormFields
from antarest.study.model import PatchArea, PatchCluster
from antarest.study.service import StudyService
@@ -446,9 +448,7 @@ def set_hydro_form_values(
uuid, StudyPermissionType.WRITE, params
)
- return study_service.hydro_manager.set_field_values(
- study, data, area_id
- )
+ study_service.hydro_manager.set_field_values(study, data, area_id)
@bp.put(
"/studies/{uuid}/matrix",
@@ -1002,7 +1002,7 @@ def get_advanced_parameters(
tags=[APITag.study_data],
summary="Set Advanced parameters new values",
)
- def set_advanced_params(
+ def set_advanced_parameters(
uuid: str,
field_values: AdvancedParamsFormFields,
current_user: JWTUser = Depends(auth.get_current_user),
@@ -1040,4 +1040,112 @@ def generate_timeseries(
return study_service.generate_timeseries(study, params)
+ @bp.get(
+ path="/studies/{uuid}/areas/{area_id}/clusters/renewable/{cluster_id}/form",
+ tags=[APITag.study_data],
+ summary="Get renewable options for a given cluster",
+ response_model=RenewableFormFields,
+ response_model_exclude_none=True,
+ )
+ def get_renewable_form_values(
+ uuid: str,
+ area_id: str,
+ cluster_id: str,
+ current_user: JWTUser = Depends(auth.get_current_user),
+ ) -> RenewableFormFields:
+ logger.info(
+ "Getting renewable form values for study %s and cluster %s",
+ uuid,
+ cluster_id,
+ extra={"user": current_user.id},
+ )
+ params = RequestParameters(user=current_user)
+ study = study_service.check_study_access(
+ uuid, StudyPermissionType.READ, params
+ )
+ return study_service.renewable_manager.get_field_values(
+ study, area_id, cluster_id
+ )
+
+ @bp.put(
+ path="/studies/{uuid}/areas/{area_id}/clusters/renewable/{cluster_id}/form",
+ tags=[APITag.study_data],
+ summary="Set renewable form values for a given cluster",
+ )
+ def set_renewable_form_values(
+ uuid: str,
+ area_id: str,
+ cluster_id: str,
+ form_fields: RenewableFormFields,
+ current_user: JWTUser = Depends(auth.get_current_user),
+ ) -> None:
+ logger.info(
+ "Setting renewable form values for study %s and cluster %s",
+ uuid,
+ cluster_id,
+ extra={"user": current_user.id},
+ )
+ request_params = RequestParameters(user=current_user)
+ study = study_service.check_study_access(
+ uuid, StudyPermissionType.WRITE, request_params
+ )
+
+ study_service.renewable_manager.set_field_values(
+ study, area_id, cluster_id, form_fields
+ )
+
+ @bp.get(
+ path="/studies/{uuid}/areas/{area_id}/clusters/thermal/{cluster_id}/form",
+ tags=[APITag.study_data],
+ summary="Get thermal options for a given cluster",
+ response_model=ThermalFormFields,
+ response_model_exclude_none=True,
+ )
+ def get_thermal_form_values(
+ uuid: str,
+ area_id: str,
+ cluster_id: str,
+ current_user: JWTUser = Depends(auth.get_current_user),
+ ) -> ThermalFormFields:
+ logger.info(
+ "Getting thermal form values for study %s and cluster %s",
+ uuid,
+ cluster_id,
+ extra={"user": current_user.id},
+ )
+ params = RequestParameters(user=current_user)
+ study = study_service.check_study_access(
+ uuid, StudyPermissionType.READ, params
+ )
+ return study_service.thermal_manager.get_field_values(
+ study, area_id, cluster_id
+ )
+
+ @bp.put(
+ path="/studies/{uuid}/areas/{area_id}/clusters/thermal/{cluster_id}/form",
+ tags=[APITag.study_data],
+ summary="Set thermal form values for a given cluster",
+ )
+ def set_thermal_form_values(
+ uuid: str,
+ area_id: str,
+ cluster_id: str,
+ form_fields: ThermalFormFields,
+ current_user: JWTUser = Depends(auth.get_current_user),
+ ) -> None:
+ logger.info(
+ "Setting thermal form values for study %s and cluster %s",
+ uuid,
+ cluster_id,
+ extra={"user": current_user.id},
+ )
+ request_params = RequestParameters(user=current_user)
+ study = study_service.check_study_access(
+ uuid, StudyPermissionType.WRITE, request_params
+ )
+
+ study_service.thermal_manager.set_field_values(
+ study, area_id, cluster_id, form_fields
+ )
+
return bp
diff --git a/antarest/tools/cli.py b/antarest/tools/cli.py
index cc36fd9367..eb6edd31b9 100644
--- a/antarest/tools/cli.py
+++ b/antarest/tools/cli.py
@@ -10,7 +10,7 @@
extract_commands,
generate_study,
)
-from antarest.study.storage import study_version_upgrader
+from antarest.study.storage.study_upgrader import upgrade_study
logging.basicConfig(level=logging.INFO)
@@ -145,21 +145,24 @@ def generate_script_diff(
@commands.command()
-@click.option(
- "-study_path",
- required=True,
- type=click.Path(),
- help="The path of the study you want to update",
+@click.argument(
+ "study-path",
+ nargs=1,
+ type=click.Path(exists=True, dir_okay=True, readable=True, writable=True),
)
-@click.option(
- "-target_version",
- required=True,
- type=int,
- help="The version you want your study to be at (example : 6.0.0 -> you should type 600)",
+@click.argument(
+ "target-version",
+ nargs=1,
+ type=click.STRING,
)
-def update_study(study_path: str, target_version: int) -> None:
- """Upgrades study's version"""
- study_version_upgrader.upgrade_study(study_path, target_version)
+def update_study(study_path: Path, target_version: str) -> None:
+ """Upgrades study version
+
+ STUDY_PATH is the path of the study you want to update
+
+ TARGET_VERSION is the version you want your study to be at (example 8.4.0 or 840)
+ """
+ upgrade_study(Path(study_path), target_version.replace(".", ""))
if __name__ == "__main__":
diff --git a/antarest/worker/archive_worker.py b/antarest/worker/archive_worker.py
index 9a09e15821..83d56d9c7d 100644
--- a/antarest/worker/archive_worker.py
+++ b/antarest/worker/archive_worker.py
@@ -41,6 +41,7 @@ def __init__(
def execute_task(self, task_info: WorkerTaskCommand) -> TaskResult:
logger.info(f"Executing task {task_info.json()}")
try:
+ # sourcery skip: extract-method
archive_args = ArchiveTaskArgs.parse_obj(task_info.task_args)
dest = self.translate_path(Path(archive_args.dest))
src = self.translate_path(Path(archive_args.src))
diff --git a/antarest/worker/simulator_worker.py b/antarest/worker/simulator_worker.py
index 5dc9a6ee2d..e419a54178 100644
--- a/antarest/worker/simulator_worker.py
+++ b/antarest/worker/simulator_worker.py
@@ -118,13 +118,12 @@ def stop_reading() -> bool:
stop_reading,
None,
),
+ name=f"{self.__class__.__name__}-TS-Generator",
daemon=True,
)
thread.start()
- while True:
- if process.poll() is not None:
- break
+ while process.poll() is None:
time.sleep(1)
result.success = process.returncode == 0
diff --git a/antarest/worker/worker.py b/antarest/worker/worker.py
index bc6a7f1a2d..ced8b7d834 100644
--- a/antarest/worker/worker.py
+++ b/antarest/worker/worker.py
@@ -1,18 +1,14 @@
-import abc
import logging
import threading
import time
-from abc import abstractmethod
from concurrent.futures import ThreadPoolExecutor, Future
-from threading import Thread
-from typing import List, Dict, Union
+from typing import Dict, List, Union, Any
-from pydantic import BaseModel
-
-from antarest.core.interfaces.eventbus import IEventBus, Event, EventType
+from antarest.core.interfaces.eventbus import Event, EventType, IEventBus
from antarest.core.interfaces.service import IService
+from antarest.core.model import PermissionInfo, PublicMode
from antarest.core.tasks.model import TaskResult
-
+from pydantic import BaseModel
logger = logging.getLogger(__name__)
@@ -30,60 +26,96 @@ class WorkerTaskCommand(BaseModel):
task_args: Dict[str, Union[int, float, bool, str]]
+class _WorkerTaskEndedCallback:
+ """
+ Callback function which uses the event bus to notify
+ that the worker task is completed (or cancelled).
+ """
+
+ def __init__(
+ self,
+ event_bus: IEventBus,
+ task_id: str,
+ ) -> None:
+ self._event_bus = event_bus
+ self._task_id = task_id
+
+ # NOTE: it seems that mypy has an issue with `concurrent.futures.Future`,
+ # for this reason we have annotated the `future` parameter with a string.
+ def __call__(self, future: "Future[Any]") -> None:
+ result = future.result()
+ event = Event(
+ type=EventType.WORKER_TASK_ENDED,
+ payload=WorkerTaskResult(
+ task_id=self._task_id, task_result=result
+ ),
+ # Use `NONE` for internal events
+ permissions=PermissionInfo(public_mode=PublicMode.NONE),
+ )
+ self._event_bus.push(event)
+
+
+# fixme: `AbstractWorker` should not inherit from `IService`
class AbstractWorker(IService):
def __init__(
- self, name: str, event_bus: IEventBus, accept: List[str]
+ self,
+ name: str,
+ event_bus: IEventBus,
+ accept: List[str],
) -> None:
- super(AbstractWorker, self).__init__()
+ super().__init__()
+ # fixme: `AbstractWorker` should not have any `thread` attribute
+ del self.thread
self.name = name
self.event_bus = event_bus
- for task_type in accept:
- self.event_bus.add_queue_consumer(self.listen_for_tasks, task_type)
+ self.accept = accept
self.threadpool = ThreadPoolExecutor(
- max_workers=MAX_WORKERS, thread_name_prefix="workertask_"
+ max_workers=MAX_WORKERS,
+ thread_name_prefix="worker_task_",
)
- self.task_watcher = Thread(target=self._loop, daemon=True)
self.lock = threading.Lock()
- self.futures: Dict[str, Future[TaskResult]] = {}
- async def listen_for_tasks(self, event: Event) -> None:
+ # fixme: `AbstractWorker.start` should not have any `threaded` parameter
+ def start(self, threaded: bool = True) -> None:
+ for task_type in self.accept:
+ self.event_bus.add_queue_consumer(
+ self._listen_for_tasks, task_type
+ )
+ # Wait a short time to allow the event bus to have the opportunity
+ # to process the tasks as soon as possible
+ time.sleep(0.01)
+
+ # fixme: `AbstractWorker` should not have any `_loop` function
+ def _loop(self) -> None:
+ pass
+
+ async def _listen_for_tasks(self, event: Event) -> None:
logger.info(f"Accepting new task {event.json()}")
task_info = WorkerTaskCommand.parse_obj(event.payload)
self.event_bus.push(
- Event(type=EventType.WORKER_TASK_STARTED, payload=task_info)
+ Event(
+ type=EventType.WORKER_TASK_STARTED,
+ payload=task_info,
+ # Use `NONE` for internal events
+ permissions=PermissionInfo(public_mode=PublicMode.NONE),
+ )
)
with self.lock:
- self.futures[task_info.task_id] = self.threadpool.submit(
- self.safe_execute_task, task_info
- )
+ # fmt: off
+ future = self.threadpool.submit(self._safe_execute_task, task_info)
+ callback = _WorkerTaskEndedCallback(self.event_bus, task_info.task_id)
+ future.add_done_callback(callback)
+ # fmt: on
- def safe_execute_task(self, task_info: WorkerTaskCommand) -> TaskResult:
+ def _safe_execute_task(self, task_info: WorkerTaskCommand) -> TaskResult:
try:
return self.execute_task(task_info)
except Exception as e:
logger.error(
- f"Unexpected error occured when executing task {task_info.json()}",
+ f"Unexpected error occurred when executing task {task_info.json()}",
exc_info=e,
)
return TaskResult(success=False, message=repr(e))
- @abstractmethod
def execute_task(self, task_info: WorkerTaskCommand) -> TaskResult:
raise NotImplementedError()
-
- def _loop(self) -> None:
- while True:
- with self.lock:
- for task_id, future in list(self.futures.items()):
- if future.done():
- self.event_bus.push(
- Event(
- type=EventType.WORKER_TASK_ENDED,
- payload=WorkerTaskResult(
- task_id=task_id,
- task_result=future.result(),
- ),
- )
- )
- del self.futures[task_id]
- time.sleep(2)
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 7af33ec75a..3a3924f0a9 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -1,6 +1,68 @@
-Antares-Web Changelog
+Antares Web Changelog
=====================
-v2.0.0 (09/2021)
+v2.13.0 (unreleased)
--------------------
-Initial Version
\ No newline at end of file
+
+### Features
+
+* **ui-common:** add doc link on subsections (#1241) ([1331232](https://github.com/AntaresSimulatorTeam/AntaREST/commit/1331232e418ebfbf3cc1a82725b95cb11cf8b9bc))
+* **api-websocket:** better handle the events in eventbus braodcasting (#1240) ([99f2590](https://github.com/AntaresSimulatorTeam/AntaREST/commit/99f25906559f782bcad857650f1b8ebfcfe584c8))
+* **ui-commands:** add confirm dialog on delete command (#1258) ([0be70f8](https://github.com/AntaresSimulatorTeam/AntaREST/commit/0be70f87ec03c491faf1d29c8d78b29615d1da9a))
+* **redux:** extend left menu by default (#1266) ([1c042af](https://github.com/AntaresSimulatorTeam/AntaREST/commit/1c042af7d4c713bcbd530062cb9e31ead45e1517))
+* **ui-study:** add text ellipsis on study name (#1270) ([6938114](https://github.com/AntaresSimulatorTeam/AntaREST/commit/69381145ab1e4224e874a59dcec2297dae951b51))
+* **launcher:** integrate Antares Solver v8.5.0. (#1282) ([57bbd3d](https://github.com/AntaresSimulatorTeam/AntaREST/commit/57bbd3d0974b104dc4b58f0f1756e40f50b2189f))
+* **ui:** add tooltips to folded menu (#1279) ([b489dd9](https://github.com/AntaresSimulatorTeam/AntaREST/commit/b489dd9db8e5d5b3a8ab6a29721d292d3841dcce))
+* **github:** add feature request template (#1284) ([73aa920](https://github.com/AntaresSimulatorTeam/AntaREST/commit/73aa920fa15d5a3397d49e00319acf808678d021))
+* **github:** add bug report template (#1283) ([8e05370](https://github.com/AntaresSimulatorTeam/AntaREST/commit/8e05370c5b1ba212545515984eb379c7a7fe6f9d))
+* **ui-results:** add download button on results matrix (#1290) ([343df96](https://github.com/AntaresSimulatorTeam/AntaREST/commit/343df968fec3dc6658f1e41040bc656cd80a104c))
+* **ui-redux:** add menu state in local storage (#1297) ([3160f29](https://github.com/AntaresSimulatorTeam/AntaREST/commit/3160f295ffd06312f2a77ec0ea2dd7da0c04fbed))
+* **ui-study:** add path tooltip on study title (#1300) ([429d288](https://github.com/AntaresSimulatorTeam/AntaREST/commit/429d288ce5aa96c0c65724647b211639b4153417))
+* **ui-map:** add layers and districts French translations (#1292) ([12f4e92](https://github.com/AntaresSimulatorTeam/AntaREST/commit/12f4e9235d5cd2256a52d9e31ec440c0756272b4))
+
+
+### Code Refactoring
+
+* simplify the maintenance mode and service. ([1590f84](https://github.com/AntaresSimulatorTeam/AntaREST/commit/1590f840dbec5ca4fcd1eba2c125de3e4f40ebef))
+* change the `MaintenanceMode` class to implement a conversion from/to `bool`. ([a5a5689](https://github.com/AntaresSimulatorTeam/AntaREST/commit/a5a568984c9562e3eba67ba30c0a076b8f30190e))
+
+
+### Bug Fixes
+
+* **api-workers:** Prevent scanning of the default workspace (#1244) ([06fd2bc](https://github.com/AntaresSimulatorTeam/AntaREST/commit/06fd2bca478fc4f579ba0760e37969038e560f97))
+* **ui-study:** remove the create command button (#1251) ([463e7a7](https://github.com/AntaresSimulatorTeam/AntaREST/commit/463e7a789eebd2b28c33bd18e833bbd30dc9268a))
+* **ui-wording:** correct wording of user messages (#1271) ([7f66c1a](https://github.com/AntaresSimulatorTeam/AntaREST/commit/7f66c1aa518bea09c2db52ae87ef36e14cd5b9e0))
+* **ui-wording:** correct french translations (#1273) ([f4f62f2](https://github.com/AntaresSimulatorTeam/AntaREST/commit/f4f62f252d8b5556ba1cb2b6027360b9066327e0))
+* **api:** correct the way the task completion is notified to the event bus (#1301) ([b9cea1e](https://github.com/AntaresSimulatorTeam/AntaREST/commit/b9cea1ebd644869a459cbf002661c4a833389cb2))
+* **storage:** ignore zipped output if an unzipped version exists (#1269) ([032b581](https://github.com/AntaresSimulatorTeam/AntaREST/commit/032b58134a4e2e9da50848d6de438d23a0f00086))
+
+
+### Build System
+
+* update version to 2.13.0 ([a44a896](https://github.com/AntaresSimulatorTeam/AntaREST/commit/a44a8964da226931b7a67b95765abc7baf031eb4))
+* remove redundant call to `mypy` in GitHub actions. ([96e2b82](https://github.com/AntaresSimulatorTeam/AntaREST/commit/96e2b824eb348d1a3fe5bacf89de35e9cb7fc0fa))
+* upgrade Black version in `requirements-dev.txt` and `.github/workflows/main.yml`. ([464c7ff](https://github.com/AntaresSimulatorTeam/AntaREST/commit/464c7ff1ea877646815a3c70891e36b976b856d8))
+
+> IMPORTANT: The `antares-launcher` project (source files) is no longer needed,
+> because the `Antares-Launcher` Python library is now declared as a dependency
+> in the `requirements.txt` file.
+
+
+### Styles
+
+* fix mypy error: Unused "type: ignore" comment. ([86f9076](https://github.com/AntaresSimulatorTeam/AntaREST/commit/86f90764591e7b863db236891e2aba926d4b1ab1))
+* Reformat the source code and unit tests in accordance with the rules of black v23.1.0 (new release). ([73bc5b0](https://github.com/AntaresSimulatorTeam/AntaREST/commit/73bc5b0f7f858f589d525f39228b0af4963dd4be))
+
+
+### Continuous Integration
+
+* remove Create Issue Branch app file (#1299) ([4e81fa6](https://github.com/AntaresSimulatorTeam/AntaREST/commit/4e81fa646552a58d56984171c644104d4dd79ab7))
+
+
+### Contributors
+
+hdinia,
+laurent-laporte-pro,
+pl-buiquang,
+skamril,
+MartinBelthle
diff --git a/requirements-dev.txt b/requirements-dev.txt
index fe90d80f30..12e17251b0 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1,5 +1,4 @@
-r requirements-test.txt
-pytest~=6.2.5
# Version of Black should match the versions set in `.github/workflows/main.yml`
black~=23.1.0
mypy~=0.931
diff --git a/requirements-test.txt b/requirements-test.txt
index a51745b4d3..088f207160 100644
--- a/requirements-test.txt
+++ b/requirements-test.txt
@@ -1,2 +1,3 @@
-r requirements.txt
-pytest-cov
+pytest~=6.2.5
+pytest-cov~=4.0.0
diff --git a/requirements.txt b/requirements.txt
index 9bf8eb4e4f..06f220802c 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,4 @@
--r antares-launcher/requirements.txt
-# freezed
-mistune~=0.8.4
-m2r~=0.2.1
+Antares-Launcher~=1.2.2
aiofiles~=0.8.0
alembic~=1.7.5
diff --git a/resources/empty_study_613.zip b/resources/empty_study_613.zip
index 23e0f5913c..94c97776cf 100644
Binary files a/resources/empty_study_613.zip and b/resources/empty_study_613.zip differ
diff --git a/resources/empty_study_700.zip b/resources/empty_study_700.zip
index 483bbcb1db..897f88f746 100644
Binary files a/resources/empty_study_700.zip and b/resources/empty_study_700.zip differ
diff --git a/resources/empty_study_710.zip b/resources/empty_study_710.zip
index 6ee11415f4..49cccf8361 100644
Binary files a/resources/empty_study_710.zip and b/resources/empty_study_710.zip differ
diff --git a/resources/empty_study_720.zip b/resources/empty_study_720.zip
index 8f13baedef..e22fad96f0 100644
Binary files a/resources/empty_study_720.zip and b/resources/empty_study_720.zip differ
diff --git a/resources/empty_study_803.zip b/resources/empty_study_803.zip
index 507d8a97f3..c05872f3ff 100644
Binary files a/resources/empty_study_803.zip and b/resources/empty_study_803.zip differ
diff --git a/resources/empty_study_810.zip b/resources/empty_study_810.zip
index a3b1e7e3a2..5d354af139 100644
Binary files a/resources/empty_study_810.zip and b/resources/empty_study_810.zip differ
diff --git a/resources/empty_study_820.zip b/resources/empty_study_820.zip
index 1fd8241e8b..f5519dfa17 100644
Binary files a/resources/empty_study_820.zip and b/resources/empty_study_820.zip differ
diff --git a/resources/empty_study_830.zip b/resources/empty_study_830.zip
index ecced32a77..9732d3b580 100644
Binary files a/resources/empty_study_830.zip and b/resources/empty_study_830.zip differ
diff --git a/resources/empty_study_840.zip b/resources/empty_study_840.zip
index c9e017d096..6954ff5841 100644
Binary files a/resources/empty_study_840.zip and b/resources/empty_study_840.zip differ
diff --git a/resources/empty_study_850.zip b/resources/empty_study_850.zip
new file mode 100644
index 0000000000..0ec25dfbfa
Binary files /dev/null and b/resources/empty_study_850.zip differ
diff --git a/scripts/build-front.sh b/scripts/build-front.sh
index 5207edb1d1..110ff5d971 100755
--- a/scripts/build-front.sh
+++ b/scripts/build-front.sh
@@ -2,26 +2,28 @@
set -e
-CURDIR=$(cd `dirname $0` && pwd)
+CURR_DIR=$(cd "$(dirname "$0")" && pwd)
-cd $CURDIR/../webapp
+cd "$CURR_DIR"/../webapp
+# shellcheck disable=SC2016
if [[ "$OSTYPE" == "darwin"* ]]; then
-sed -i '' 's|"homepage".*|"homepage": "/static",|g' package.json
-sed -i '' 's|loadPath.*|loadPath: `/static/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js
+ sed -i '' 's|"homepage".*|"homepage": "/static",|g' package.json
+ sed -i '' 's|loadPath.*|loadPath: `/static/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js
else
-sed -i 's|"homepage".*|"homepage": "/static",|g' package.json
-sed -i 's|loadPath.*|loadPath: `/static/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js
+ sed -i 's|"homepage".*|"homepage": "/static",|g' package.json
+ sed -i 's|loadPath.*|loadPath: `/static/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js
fi
./node_modules/.bin/cross-env GENERATE_SOURCEMAP=false DISABLE_ESLINT_PLUGIN=true npm run build
+# shellcheck disable=SC2016
if [[ "$OSTYPE" == "darwin"* ]]; then
-sed -i '' 's|"homepage".*|"homepage": "/",|g' package.json
-sed -i '' 's|loadPath.*|loadPath: `/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js
+ sed -i '' 's|"homepage".*|"homepage": "/",|g' package.json
+ sed -i '' 's|loadPath.*|loadPath: `/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js
else
-sed -i 's|"homepage".*|"homepage": "/",|g' package.json
-sed -i 's|loadPath.*|loadPath: `/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js
+ sed -i 's|"homepage".*|"homepage": "/",|g' package.json
+ sed -i 's|loadPath.*|loadPath: `/locales/{{lng}}/{{ns}}.json?v=${version}`,|g' src/i18n.js
fi
cd ..
diff --git a/setup.cfg b/setup.cfg
index dc0780a6bb..2c39ba30ac 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -3,7 +3,7 @@ strict = True
files = antarest/**/*.py
[mypy-antareslauncher.*]
-ignore_errors = True
+ignore_missing_imports = True
[mypy-jsonschema.*]
ignore_missing_imports = True
diff --git a/setup.py b/setup.py
index f13c1e97cc..9f329df65e 100644
--- a/setup.py
+++ b/setup.py
@@ -5,7 +5,7 @@
setuptools.setup(
name="AntaREST",
- version="2.12.2",
+ version="2.13.0",
description="Antares Server",
long_description=long_description,
long_description_content_type="text/markdown",
diff --git a/sonar-project.properties b/sonar-project.properties
index 1367994b49..1f6f0c0f83 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -6,5 +6,5 @@ sonar.exclusions=antarest/gui.py,antarest/main.py
sonar.python.coverage.reportPaths=coverage.xml
sonar.python.version=3.8
sonar.javascript.lcov.reportPaths=webapp/coverage/lcov.info
-sonar.projectVersion=2.12.2
+sonar.projectVersion=2.13.0
sonar.coverage.exclusions=antarest/gui.py,antarest/main.py,antarest/singleton_services.py,antarest/worker/archive_worker_service.py,webapp/**/*
\ No newline at end of file
diff --git a/tests/conftest.py b/tests/conftest.py
index f8384538de..7eff60d0a1 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,6 +1,6 @@
import sys
import time
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
from functools import wraps
from pathlib import Path
from typing import Any, Callable
@@ -24,16 +24,17 @@ def project_path() -> Path:
def with_db_context(f):
@wraps(f)
- def wrapper(*args, **kwds):
+ def wrapper(*args, **kwargs):
engine = create_engine("sqlite:///:memory:", echo=True)
Base.metadata.create_all(engine)
+ # noinspection PyTypeChecker
DBSessionMiddleware(
Mock(),
custom_engine=engine,
session_args={"autocommit": False, "autoflush": False},
)
with db():
- return f(*args, **kwds)
+ return f(*args, **kwargs)
return wrapper
@@ -80,10 +81,12 @@ def assert_study(a: SUB_JSON, b: SUB_JSON) -> None:
_assert_others(a, b)
-def autoretry_assert(func: Callable[..., bool], timeout: int) -> None:
- threshold = datetime.utcnow() + timedelta(seconds=timeout)
- while datetime.utcnow() < threshold:
- if func():
+def auto_retry_assert(
+ predicate: Callable[..., bool], timeout: int = 2
+) -> None:
+ threshold = datetime.now(timezone.utc) + timedelta(seconds=timeout)
+ while datetime.now(timezone.utc) < threshold:
+ if predicate():
return
time.sleep(0.2)
raise AssertionError()
diff --git a/tests/core/test_file_transfer.py b/tests/core/test_file_transfer.py
index 94102d7e13..d7336da118 100644
--- a/tests/core/test_file_transfer.py
+++ b/tests/core/test_file_transfer.py
@@ -82,7 +82,7 @@ def test_lifecycle(tmp_path: Path):
permissions=PermissionInfo(
owner=1, groups=[], public_mode=PublicMode.NONE
),
- channel=None,
+ channel="",
)
)
filedownload_id = filedownload.id
@@ -94,7 +94,7 @@ def test_lifecycle(tmp_path: Path):
permissions=PermissionInfo(
owner=1, groups=[], public_mode=PublicMode.NONE
),
- channel=None,
+ channel="",
)
)
@@ -106,9 +106,9 @@ def test_lifecycle(tmp_path: Path):
params=RequestParameters(user=DEFAULT_ADMIN_USER)
)
assert len(downloads) == 1
- filedownload.expiration_date = (
- datetime.datetime.utcnow() - datetime.timedelta(seconds=5)
- )
+ filedownload.expiration_date = datetime.datetime.now(
+ datetime.timezone.utc
+ ) - datetime.timedelta(seconds=5)
ftm.repository.save(filedownload)
downloads = ftm.list_downloads(
params=RequestParameters(user=DEFAULT_ADMIN_USER)
diff --git a/tests/core/test_maintenance.py b/tests/core/test_maintenance.py
index 1ecc8cb2d0..152c395d5f 100644
--- a/tests/core/test_maintenance.py
+++ b/tests/core/test_maintenance.py
@@ -1,7 +1,6 @@
from unittest.mock import Mock
import pytest
-from fastapi import HTTPException
from sqlalchemy import create_engine
from antarest.core.config import Config
@@ -20,6 +19,7 @@
def test_service_without_cache() -> None:
engine = create_engine("sqlite:///:memory:", echo=True)
Base.metadata.create_all(engine)
+ # noinspection PyTypeChecker,SpellCheckingInspection
DBSessionMiddleware(
Mock(),
custom_engine=engine,
@@ -78,13 +78,14 @@ def test_service_without_cache() -> None:
# Set maintenance mode
mode = True
- data = MaintenanceMode.to_str(mode)
+ maintenance_mode = MaintenanceMode.from_bool(mode)
service.set_maintenance_status(
data=mode, request_params=RequestParameters(user=DEFAULT_ADMIN_USER)
)
- repo_mock.save_maintenance_mode.assert_called_with(data)
+ repo_mock.save_maintenance_mode.assert_called_with(maintenance_mode.value)
cache.put.assert_called_with(
- ConfigDataAppKeys.MAINTENANCE_MODE.value, {"content": data}
+ ConfigDataAppKeys.MAINTENANCE_MODE.value,
+ {"content": maintenance_mode.value},
)
event_bus.push.assert_called_with(
Event(
diff --git a/tests/core/test_tasks.py b/tests/core/test_tasks.py
index 7a2d84f8ec..5632f8c75f 100644
--- a/tests/core/test_tasks.py
+++ b/tests/core/test_tasks.py
@@ -1,23 +1,25 @@
import datetime
+import time
from pathlib import Path
from typing import Callable, List
-from unittest.mock import Mock, ANY, call
+from unittest.mock import ANY, Mock, call
import pytest
from sqlalchemy import create_engine
-from antarest.core.config import Config, TaskConfig, RemoteWorkerConfig
-from antarest.core.interfaces.eventbus import EventType, Event, IEventBus
+from antarest.core.config import Config, RemoteWorkerConfig, TaskConfig
+from antarest.core.interfaces.eventbus import Event, EventType, IEventBus
from antarest.core.jwt import DEFAULT_ADMIN_USER
+from antarest.core.model import PermissionInfo, PublicMode
from antarest.core.persistence import Base
from antarest.core.requests import RequestParameters, UserHasNotPermissionError
from antarest.core.tasks.model import (
+ TaskDTO,
TaskJob,
- TaskStatus,
- TaskListFilter,
TaskJobLog,
+ TaskListFilter,
TaskResult,
- TaskDTO,
+ TaskStatus,
TaskType,
)
from antarest.core.tasks.repository import TaskJobRepository
@@ -30,8 +32,10 @@
def test_service() -> None:
+ # sourcery skip: aware-datetime-for-utc
engine = create_engine("sqlite:///:memory:", echo=True)
Base.metadata.create_all(engine)
+ # noinspection PyTypeChecker
DBSessionMiddleware(
Mock(),
custom_engine=engine,
@@ -39,7 +43,7 @@ def test_service() -> None:
)
repo_mock = Mock(spec=TaskJobRepository)
- creation_date = datetime.datetime.utcnow()
+ creation_date = datetime.datetime.now(datetime.timezone.utc)
task = TaskJob(id="a", name="b", status=2, creation_date=creation_date)
repo_mock.list.return_value = [task]
repo_mock.get_or_raise.return_value = task
@@ -66,8 +70,8 @@ def test_service() -> None:
assert tasks[0].status == TaskStatus.FAILED
assert tasks[0].creation_date_utc == str(creation_date)
- start = datetime.datetime.utcnow()
- end = datetime.datetime.utcnow() + datetime.timedelta(seconds=1)
+ start = datetime.datetime.now(datetime.timezone.utc)
+ end = start + datetime.timedelta(seconds=1)
repo_mock.reset_mock()
repo_mock.get.return_value = TaskJob(
id="a",
@@ -91,6 +95,7 @@ def test_service() -> None:
status=TaskStatus.COMPLETED,
)
+ # noinspection PyUnusedLocal
def action_fail(update_msg: Callable[[str], None]) -> TaskResult:
raise NotImplementedError()
@@ -123,40 +128,41 @@ def action_ok(update_msg: Callable[[str], None]) -> TaskResult:
[
call(
TaskJob(
- name="failed action",
+ id=None,
+ logs=[],
owner_id=1,
+ creation_date=None,
+ completion_date=None,
+ name="failed action",
+ status=None,
+ result_msg=None,
+ result_status=None,
)
),
- # this is not called with that because the object is mutated, and mock seems to suck..
- # TaskJob(
- # id="a",
- # name="failed action",
- # owner_id=1,
- # status=TaskStatus.RUNNING.value,
- # creation_date=now,
- # ),
call(
TaskJob(
id="a",
+ logs=[],
+ owner_id=1,
+ creation_date=now,
completion_date=ANY,
name="failed action",
- owner_id=1,
- status=TaskStatus.FAILED.value,
+ status=4,
+ result_msg=ANY, # "Task a failed: Unhandled exception [...]"
result_status=False,
- result_msg="NotImplementedError()",
- creation_date=now,
)
),
call(
TaskJob(
id="a",
+ logs=[],
+ owner_id=1,
+ creation_date=now,
completion_date=ANY,
name="failed action",
- owner_id=1,
- status=TaskStatus.FAILED.value,
+ status=4,
+ result_msg=ANY, # "Task a failed: Unhandled exception [...]"
result_status=False,
- result_msg="NotImplementedError()",
- creation_date=now,
)
),
]
@@ -270,6 +276,8 @@ def __init__(
self.tmp_path = tmp_path
def execute_task(self, task_info: WorkerTaskCommand) -> TaskResult:
+ # simulate a "long" task ;-)
+ time.sleep(0.01)
relative_path = task_info.task_args["file"]
(self.tmp_path / relative_path).touch()
return TaskResult(success=True, message="")
@@ -345,8 +353,10 @@ def test_worker_tasks(tmp_path: Path):
def test_repository():
+ # sourcery skip: aware-datetime-for-utc
engine = create_engine("sqlite:///:memory:", echo=True)
Base.metadata.create_all(engine)
+ # noinspection PyTypeChecker
DBSessionMiddleware(
Mock(),
custom_engine=engine,
@@ -354,6 +364,7 @@ def test_repository():
)
with db():
+ # sourcery skip: extract-method
task_repository = TaskJobRepository()
new_task = TaskJob(name="foo", owner_id=0, type=TaskType.COPY)
@@ -447,8 +458,10 @@ def test_repository():
def test_cancel():
+ # sourcery skip: aware-datetime-for-utc
engine = create_engine("sqlite:///:memory:", echo=True)
Base.metadata.create_all(engine)
+ # noinspection PyTypeChecker
DBSessionMiddleware(
Mock(),
custom_engine=engine,
@@ -467,8 +480,13 @@ def test_cancel():
service.cancel_task(
"b", RequestParameters(user=DEFAULT_ADMIN_USER), dispatch=True
)
+ # noinspection PyUnresolvedReferences
service.event_bus.push.assert_called_with(
- Event(type=EventType.TASK_CANCEL_REQUEST, payload="b")
+ Event(
+ type=EventType.TASK_CANCEL_REQUEST,
+ payload="b",
+ permissions=PermissionInfo(public_mode=PublicMode.NONE),
+ )
)
creation_date = datetime.datetime.utcnow()
diff --git a/tests/eventbus/test_local_eventbus.py b/tests/eventbus/test_local_eventbus.py
index 5667a83ba6..a42b40a990 100644
--- a/tests/eventbus/test_local_eventbus.py
+++ b/tests/eventbus/test_local_eventbus.py
@@ -1,10 +1,15 @@
from antarest.core.interfaces.eventbus import Event, EventType
+from antarest.core.model import PermissionInfo, PublicMode
from antarest.eventbus.business.local_eventbus import LocalEventBus
def test_lifecycle():
eventbus = LocalEventBus()
- event = Event(type=EventType.STUDY_EDITED, payload="foo")
+ event = Event(
+ type=EventType.STUDY_EDITED,
+ payload="foo",
+ permissions=PermissionInfo(public_mode=PublicMode.READ),
+ )
eventbus.push_event(event)
assert eventbus.get_events() == [event]
eventbus.clear_events()
diff --git a/tests/eventbus/test_redis_event_bus.py b/tests/eventbus/test_redis_event_bus.py
index a7a45829a2..741ed3a309 100644
--- a/tests/eventbus/test_redis_event_bus.py
+++ b/tests/eventbus/test_redis_event_bus.py
@@ -3,9 +3,8 @@
from unittest.mock import Mock
from antarest.core.interfaces.eventbus import Event, EventType
-from antarest.eventbus.business.redis_eventbus import (
- RedisEventBus,
-)
+from antarest.core.model import PermissionInfo, PublicMode
+from antarest.eventbus.business.redis_eventbus import RedisEventBus
def test_lifecycle():
@@ -15,7 +14,11 @@ def test_lifecycle():
eventbus = RedisEventBus(redis_client)
pubsub_mock.subscribe.assert_called_once_with("events")
- event = Event(type=EventType.STUDY_EDITED, payload="foo")
+ event = Event(
+ type=EventType.STUDY_EDITED,
+ payload="foo",
+ permissions=PermissionInfo(public_mode=PublicMode.READ),
+ )
serialized = event.json()
pubsub_mock.get_message.return_value = {"data": serialized}
eventbus.push_event(event)
diff --git a/tests/eventbus/test_service.py b/tests/eventbus/test_service.py
index 9052b14249..542daa5bd3 100644
--- a/tests/eventbus/test_service.py
+++ b/tests/eventbus/test_service.py
@@ -1,13 +1,11 @@
-import asyncio
-import time
-from datetime import datetime, timedelta
-from typing import Callable, List, Awaitable
-from unittest.mock import Mock, MagicMock
+from typing import Awaitable, Callable, List
+from unittest.mock import MagicMock, Mock
from antarest.core.config import Config, EventBusConfig, RedisConfig
from antarest.core.interfaces.eventbus import Event, EventType
+from antarest.core.model import PermissionInfo, PublicMode
from antarest.eventbus.main import build_eventbus
-from tests.conftest import autoretry_assert
+from tests.conftest import auto_retry_assert
def test_service_factory():
@@ -41,15 +39,33 @@ async def _append_to_bucket(event: Event):
lid2 = event_bus.add_listener(
append_to_bucket(test_bucket), [EventType.STUDY_CREATED]
)
- event_bus.push(Event(type=EventType.STUDY_JOB_STARTED, payload="foo"))
- event_bus.push(Event(type=EventType.STUDY_CREATED, payload="foo"))
- autoretry_assert(lambda: len(test_bucket) == 3, 2)
+ event_bus.push(
+ Event(
+ type=EventType.STUDY_JOB_STARTED,
+ payload="foo",
+ permissions=PermissionInfo(public_mode=PublicMode.READ),
+ )
+ )
+ event_bus.push(
+ Event(
+ type=EventType.STUDY_CREATED,
+ payload="foo",
+ permissions=PermissionInfo(public_mode=PublicMode.READ),
+ )
+ )
+ auto_retry_assert(lambda: len(test_bucket) == 3, timeout=2)
event_bus.remove_listener(lid1)
event_bus.remove_listener(lid2)
test_bucket.clear()
- event_bus.push(Event(type=EventType.STUDY_JOB_STARTED, payload="foo"))
- autoretry_assert(lambda: len(test_bucket) == 0, 2)
+ event_bus.push(
+ Event(
+ type=EventType.STUDY_JOB_STARTED,
+ payload="foo",
+ permissions=PermissionInfo(public_mode=PublicMode.READ),
+ )
+ )
+ auto_retry_assert(lambda: len(test_bucket) == 0, timeout=2)
queue_name = "some work job"
event_bus.add_queue_consumer(append_to_bucket(test_bucket), queue_name)
@@ -57,6 +73,11 @@ async def _append_to_bucket(event: Event):
lambda event: test_bucket.append(event), queue_name
)
event_bus.queue(
- Event(type=EventType.WORKER_TASK, payload="worker task"), queue_name
+ Event(
+ type=EventType.WORKER_TASK,
+ payload="worker task",
+ permissions=PermissionInfo(public_mode=PublicMode.READ),
+ ),
+ queue_name,
)
- autoretry_assert(lambda: len(test_bucket) == 1, 2)
+ auto_retry_assert(lambda: len(test_bucket) == 1, timeout=2)
diff --git a/tests/eventbus/test_websocket_manager.py b/tests/eventbus/test_websocket_manager.py
index 5ae1044058..cf7151dd52 100644
--- a/tests/eventbus/test_websocket_manager.py
+++ b/tests/eventbus/test_websocket_manager.py
@@ -1,16 +1,14 @@
-import asyncio
from unittest import IsolatedAsyncioTestCase
-from unittest.mock import Mock, MagicMock
-
-from starlette.websockets import WebSocket
+from unittest.mock import MagicMock, call
from antarest.core.jwt import JWTUser
-from antarest.core.model import PermissionInfo, PublicMode
+from antarest.core.model import PermissionInfo
from antarest.eventbus.web import (
ConnectionManager,
WebsocketMessage,
WebsocketMessageAction,
)
+from starlette.websockets import WebSocket
class AsyncMock(MagicMock):
@@ -19,35 +17,39 @@ async def __call__(self, *args, **kwargs):
class ConnectionManagerTest(IsolatedAsyncioTestCase):
+ # noinspection PyMethodMayBeStatic
async def test_subscriptions(self):
ws_manager = ConnectionManager()
user = JWTUser(id=1, type="user", impersonator=1, groups=[])
- subscription_message = WebsocketMessage(
+ subscribe_message = WebsocketMessage(
action=WebsocketMessageAction.SUBSCRIBE, payload="foo"
)
- unsubscription_message = WebsocketMessage(
+ unsubscribe_message = WebsocketMessage(
action=WebsocketMessageAction.UNSUBSCRIBE, payload="foo"
)
mock_connection = AsyncMock(spec=WebSocket)
await ws_manager.connect(mock_connection, user)
assert len(ws_manager.active_connections) == 1
- ws_manager.process_message(
- subscription_message.json(), mock_connection, user
- )
- assert len(ws_manager.active_connections[0].channel_subscriptions) == 1
- assert (
- ws_manager.active_connections[0].channel_subscriptions[0] == "foo"
- )
+ ws_manager.process_message(subscribe_message.json(), mock_connection)
+ connections = ws_manager.active_connections[0]
+ assert len(connections.channel_subscriptions) == 1
+ assert connections.channel_subscriptions[0] == "foo"
- await ws_manager.broadcast("hello", PermissionInfo(), channel="foo")
- mock_connection.send_text.assert_called_with("hello")
+ # the event manager must send events if the channel is empty (i.e.: ""),
+ await ws_manager.broadcast("msg1", PermissionInfo(), channel="")
+ # the event manager must send events if the channel is a subscriber channel
+ await ws_manager.broadcast("msg2", PermissionInfo(), channel="foo")
+ # the event manager must not send events if the channel does not correspond to any subscriber channel
+ await ws_manager.broadcast("msg3", PermissionInfo(), channel="bar")
- ws_manager.process_message(
- unsubscription_message.json(), mock_connection, user
+ mock_connection.send_text.assert_has_calls(
+ [call("msg1"), call("msg2")]
)
- assert len(ws_manager.active_connections[0].channel_subscriptions) == 0
+
+ ws_manager.process_message(unsubscribe_message.json(), mock_connection)
+ assert len(connections.channel_subscriptions) == 0
ws_manager.disconnect(mock_connection)
assert len(ws_manager.active_connections) == 0
diff --git a/tests/integration/test_integration.py b/tests/integration/test_integration.py
index 452f09b449..f0fc467202 100644
--- a/tests/integration/test_integration.py
+++ b/tests/integration/test_integration.py
@@ -15,6 +15,9 @@
TableTemplateType,
TimeSeriesGenerationOption,
TransmissionCapacity,
+ TimeSeriesInterpretation,
+ BindingConstraintType,
+ BindingConstraintOperator,
)
from antarest.study.model import MatrixIndex, StudyDownloadLevelDTO
from antarest.study.storage.variantstudy.model.command.common import (
@@ -690,6 +693,78 @@ def test_area_management(app: FastAPI):
],
)
+ client.post(
+ f"/v1/studies/{study_id}/commands",
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ json=[
+ {
+ "action": CommandName.CREATE_RENEWABLES_CLUSTER.value,
+ "args": {
+ "area_id": "area 1",
+ "cluster_name": "cluster renewable 1",
+ "parameters": {},
+ },
+ }
+ ],
+ )
+
+ client.post(
+ f"/v1/studies/{study_id}/commands",
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ json=[
+ {
+ "action": CommandName.CREATE_RENEWABLES_CLUSTER.value,
+ "args": {
+ "area_id": "area 2",
+ "cluster_name": "cluster renewable 2",
+ "parameters": {},
+ },
+ }
+ ],
+ )
+
+ client.post(
+ f"/v1/studies/{study_id}/commands",
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ json=[
+ {
+ "action": CommandName.CREATE_BINDING_CONSTRAINT.value,
+ "args": {
+ "name": "binding constraint 1",
+ "enabled": True,
+ "time_step": BindingConstraintType.HOURLY.value,
+ "operator": BindingConstraintOperator.LESS.value,
+ "coeffs": {"area 1.cluster 1": [2.0, 4]},
+ },
+ }
+ ],
+ )
+
+ client.post(
+ f"/v1/studies/{study_id}/commands",
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ json=[
+ {
+ "action": CommandName.CREATE_BINDING_CONSTRAINT.value,
+ "args": {
+ "name": "binding constraint 2",
+ "enabled": True,
+ "time_step": BindingConstraintType.HOURLY.value,
+ "operator": BindingConstraintOperator.LESS.value,
+ "coeffs": {},
+ },
+ }
+ ],
+ )
+
res_areas = client.get(
f"/v1/studies/{study_id}/areas",
headers={
@@ -942,6 +1017,12 @@ def test_area_management(app: FastAPI):
"enableAdequacyPatch": False,
"ntcFromPhysicalAreasOutToPhysicalAreasInAdequacyPatch": True,
"ntcBetweenPhysicalAreasOutAdequacyPatch": True,
+ "checkCsrCostFunction": False,
+ "includeHurdleCostCsr": False,
+ "priceTakingOrder": "DENS",
+ "thresholdInitiateCurtailmentSharingRule": 0.0,
+ "thresholdDisplayLocalMatchingRuleViolations": 0.0,
+ "thresholdCsrVariableBoundsRelaxation": 3,
}
client.put(
@@ -980,6 +1061,12 @@ def test_area_management(app: FastAPI):
"enableAdequacyPatch": False,
"ntcFromPhysicalAreasOutToPhysicalAreasInAdequacyPatch": True,
"ntcBetweenPhysicalAreasOutAdequacyPatch": False,
+ "checkCsrCostFunction": False,
+ "includeHurdleCostCsr": False,
+ "priceTakingOrder": "DENS",
+ "thresholdInitiateCurtailmentSharingRule": 0.0,
+ "thresholdDisplayLocalMatchingRuleViolations": 0.0,
+ "thresholdCsrVariableBoundsRelaxation": 3,
}
res_general_config = client.get(
@@ -1262,6 +1349,8 @@ def test_area_management(app: FastAPI):
"profit": True,
}
+ # Hydro form
+
res_hydro_config = client.put(
f"/v1/studies/{study_id}/areas/area1/hydro/form",
headers={
@@ -1301,6 +1390,8 @@ def test_area_management(app: FastAPI):
"pumpingEfficiency": 1,
}
+ # Time-series form
+
res_ts_config = client.get(
f"/v1/studies/{study_id}/config/timeseries/form",
headers={
@@ -1730,8 +1821,277 @@ def test_area_management(app: FastAPI):
},
}
+ # Table Mode - Renewable
+
+ res_table_data = client.get(
+ table_mode_url,
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ params={
+ "table_type": TableTemplateType.RENEWABLE,
+ "columns": ",".join(
+ FIELDS_INFO_BY_TYPE[TableTemplateType.RENEWABLE]
+ ),
+ },
+ )
+ res_table_data_json = res_table_data.json()
+ assert res_table_data_json == {
+ "area 1 / cluster renewable 1": {
+ "group": "",
+ "tsInterpretation": TimeSeriesInterpretation.POWER_GENERATION.value,
+ "enabled": True,
+ "unitCount": 0,
+ "nominalCapacity": 0,
+ },
+ "area 2 / cluster renewable 2": {
+ "group": "",
+ "tsInterpretation": TimeSeriesInterpretation.POWER_GENERATION.value,
+ "enabled": True,
+ "unitCount": 0,
+ "nominalCapacity": 0,
+ },
+ }
+
+ client.put(
+ table_mode_url,
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ params={
+ "table_type": TableTemplateType.RENEWABLE,
+ },
+ json={
+ "area 1 / cluster renewable 1": {
+ "tsInterpretation": TimeSeriesInterpretation.PRODUCTION_FACTOR.value,
+ "enabled": False,
+ },
+ "area 2 / cluster renewable 2": {
+ "unitCount": 2,
+ "nominalCapacity": 13,
+ },
+ },
+ )
+ res_table_data = client.get(
+ table_mode_url,
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ params={
+ "table_type": TableTemplateType.RENEWABLE,
+ "columns": ",".join(
+ FIELDS_INFO_BY_TYPE[TableTemplateType.RENEWABLE]
+ ),
+ },
+ )
+ res_table_data_json = res_table_data.json()
+ assert res_table_data_json == {
+ "area 1 / cluster renewable 1": {
+ "group": "",
+ "tsInterpretation": TimeSeriesInterpretation.PRODUCTION_FACTOR.value,
+ "enabled": False,
+ "unitCount": 0,
+ "nominalCapacity": 0,
+ },
+ "area 2 / cluster renewable 2": {
+ "group": "",
+ "tsInterpretation": TimeSeriesInterpretation.POWER_GENERATION.value,
+ "enabled": True,
+ "unitCount": 2,
+ "nominalCapacity": 13,
+ },
+ }
+
+ # Table Mode - Binding Constraint
+
+ res_table_data = client.get(
+ table_mode_url,
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ params={
+ "table_type": TableTemplateType.BINDING_CONSTRAINT,
+ "columns": ",".join(
+ FIELDS_INFO_BY_TYPE[TableTemplateType.BINDING_CONSTRAINT]
+ ),
+ },
+ )
+ res_table_data_json = res_table_data.json()
+ assert res_table_data_json == {
+ "binding constraint 1": {
+ "enabled": True,
+ "type": BindingConstraintType.HOURLY.value,
+ "operator": BindingConstraintOperator.LESS.value,
+ },
+ "binding constraint 2": {
+ "enabled": True,
+ "type": BindingConstraintType.HOURLY.value,
+ "operator": BindingConstraintOperator.LESS.value,
+ },
+ }
+
+ client.put(
+ table_mode_url,
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ params={
+ "table_type": TableTemplateType.BINDING_CONSTRAINT,
+ },
+ json={
+ "binding constraint 1": {
+ "enabled": False,
+ "operator": BindingConstraintOperator.BOTH.value,
+ },
+ "binding constraint 2": {
+ "type": BindingConstraintType.WEEKLY.value,
+ "operator": BindingConstraintOperator.EQUAL.value,
+ },
+ },
+ )
+ res_table_data = client.get(
+ table_mode_url,
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ params={
+ "table_type": TableTemplateType.BINDING_CONSTRAINT,
+ "columns": ",".join(
+ FIELDS_INFO_BY_TYPE[TableTemplateType.BINDING_CONSTRAINT]
+ ),
+ },
+ )
+ res_table_data_json = res_table_data.json()
+ assert res_table_data_json == {
+ "binding constraint 1": {
+ "enabled": False,
+ "type": BindingConstraintType.HOURLY.value,
+ "operator": BindingConstraintOperator.BOTH.value,
+ },
+ "binding constraint 2": {
+ "enabled": True,
+ "type": BindingConstraintType.WEEKLY.value,
+ "operator": BindingConstraintOperator.EQUAL.value,
+ },
+ }
+
+ res = client.get(
+ f"/v1/studies/{study_id}/bindingconstraints/binding constraint 1",
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ )
+ binding_constraint_1 = res.json()
+ assert res.status_code == 200
+
+ constraint = binding_constraint_1["constraints"][0]
+ assert constraint["id"] == "area 1.cluster 1"
+ assert constraint["weight"] == 2.0
+ assert constraint["offset"] == 4.0
+
# --- TableMode END ---
+ # Renewable form
+
+ res_renewable_config = client.put(
+ f"/v1/studies/{study_id}/areas/area 1/clusters/renewable/cluster renewable 1/form",
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ json={
+ "name": "cluster renewable 1 renamed",
+ "tsInterpretation": TimeSeriesInterpretation.PRODUCTION_FACTOR.value,
+ "unitCount": 9,
+ "enabled": False,
+ "nominalCapacity": 3,
+ },
+ )
+ assert res_renewable_config.status_code == 200
+
+ res_renewable_config = client.get(
+ f"/v1/studies/{study_id}/areas/area 1/clusters/renewable/cluster renewable 1/form",
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ )
+ res_renewable_config_json = res_renewable_config.json()
+
+ assert res_renewable_config_json == {
+ "group": "",
+ "tsInterpretation": TimeSeriesInterpretation.PRODUCTION_FACTOR.value,
+ "name": "cluster renewable 1 renamed",
+ "unitCount": 9,
+ "enabled": False,
+ "nominalCapacity": 3,
+ }
+
+ # Thermal form
+
+ res_thermal_config = client.put(
+ f"/v1/studies/{study_id}/areas/area 1/clusters/thermal/cluster 1/form",
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ json={
+ "group": "Lignite",
+ "name": "cluster 1 renamed",
+ "unitCount": 3,
+ "enabled": False,
+ "nominalCapacity": 3,
+ "genTs": "use global parameter",
+ "minStablePower": 3,
+ "minUpTime": 3,
+ "minDownTime": 3,
+ "mustRun": False,
+ "spinning": 3,
+ "co2": 3,
+ "volatilityForced": 3,
+ "volatilityPlanned": 3,
+ "lawForced": "uniform",
+ "lawPlanned": "uniform",
+ "marginalCost": 3,
+ "spreadCost": 3,
+ "fixedCost": 3,
+ "startupCost": 3,
+ "marketBidCost": 3,
+ },
+ )
+ assert res_thermal_config.status_code == 200
+
+ res_thermal_config = client.get(
+ f"/v1/studies/{study_id}/areas/area 1/clusters/thermal/cluster 1/form",
+ headers={
+ "Authorization": f'Bearer {admin_credentials["access_token"]}'
+ },
+ )
+ res_thermal_config_json = res_thermal_config.json()
+
+ assert res_thermal_config_json == {
+ "group": "Lignite",
+ "name": "cluster 1 renamed",
+ "unitCount": 3,
+ "enabled": False,
+ "nominalCapacity": 3,
+ "genTs": TimeSeriesGenerationOption.USE_GLOBAL_PARAMETER.value,
+ "minStablePower": 3,
+ "minUpTime": 3,
+ "minDownTime": 3,
+ "mustRun": False,
+ "spinning": 3,
+ "co2": 3,
+ "volatilityForced": 3,
+ "volatilityPlanned": 3,
+ "lawForced": LawOption.UNIFORM.value,
+ "lawPlanned": LawOption.UNIFORM.value,
+ "marginalCost": 3,
+ "spreadCost": 3,
+ "fixedCost": 3,
+ "startupCost": 3,
+ "marketBidCost": 3,
+ }
+
+ # Links
+
client.delete(
f"/v1/studies/{study_id}/links/area%201/area%202",
headers={
diff --git a/tests/integration/test_studies_upgrade.py b/tests/integration/test_studies_upgrade.py
new file mode 100644
index 0000000000..644efbc6e2
--- /dev/null
+++ b/tests/integration/test_studies_upgrade.py
@@ -0,0 +1,134 @@
+import time
+
+import pytest
+from antarest.core.tasks.model import TaskDTO, TaskStatus
+from fastapi import FastAPI
+from starlette.testclient import TestClient
+
+
+def wait_task_completion(
+ client: TestClient,
+ access_token: str,
+ task_id: str,
+ *,
+ timeout: float = 10,
+) -> TaskDTO:
+ end_time = time.time() + timeout
+ while time.time() < end_time:
+ time.sleep(0.1)
+ res = client.get(
+ f"/v1/tasks/{task_id}",
+ headers={"Authorization": f"Bearer {access_token}"},
+ json={"wait_for_completion": True},
+ )
+ assert res.status_code == 200
+ task = TaskDTO(**res.json())
+ if task.status not in {TaskStatus.PENDING, TaskStatus.RUNNING}:
+ return task
+ raise TimeoutError(f"{timeout} seconds")
+
+
+class TestStudyUpgrade:
+ @pytest.fixture(name="client")
+ def fixture_client(self, app: FastAPI) -> TestClient:
+ """Get the webservice client used for unit testing"""
+ return TestClient(app, raise_server_exceptions=False)
+
+ @pytest.fixture(name="admin_access_token")
+ def fixture_admin_access_token(self, client: TestClient) -> str:
+ """Get the admin user access token used for authentication"""
+ res = client.post(
+ "/v1/login",
+ json={"username": "admin", "password": "admin"},
+ )
+ assert res.status_code == 200
+ credentials = res.json()
+ return credentials["access_token"]
+
+ @pytest.fixture(name="user_access_token")
+ def fixture_user_access_token(
+ self,
+ client: TestClient,
+ admin_access_token: str,
+ ) -> str:
+ """Get a classic user access token used for authentication"""
+ res = client.post(
+ "/v1/users",
+ headers={"Authorization": f"Bearer {admin_access_token}"},
+ json={"name": "George", "password": "mypass"},
+ )
+ assert res.status_code == 200
+ res = client.post(
+ "/v1/login",
+ json={"username": "George", "password": "mypass"},
+ )
+ assert res.status_code == 200
+ credentials = res.json()
+ return credentials["access_token"]
+
+ @pytest.fixture(name="study_id")
+ def fixture_study_id(
+ self,
+ client: TestClient,
+ user_access_token: str,
+ ) -> str:
+ """Get the ID of the study to upgrade"""
+ res = client.get(
+ "/v1/studies",
+ headers={"Authorization": f"Bearer {user_access_token}"},
+ )
+ assert res.status_code == 200
+ study_ids = res.json()
+ return next(iter(study_ids))
+
+ def test_upgrade_study__next_version(
+ self, client: TestClient, user_access_token: str, study_id: str
+ ):
+ res = client.put(
+ f"/v1/studies/{study_id}/upgrade",
+ headers={"Authorization": f"Bearer {user_access_token}"},
+ )
+ assert res.status_code == 200
+ task_id = res.json()
+ assert task_id
+ task = wait_task_completion(client, user_access_token, task_id)
+ assert task.status == TaskStatus.COMPLETED
+ assert (
+ "710" in task.result.message
+ ), f"Version not in {task.result.message=}"
+
+ def test_upgrade_study__target_version(
+ self, client: TestClient, user_access_token: str, study_id: str
+ ):
+ target_version = "720"
+ res = client.put(
+ f"/v1/studies/{study_id}/upgrade",
+ headers={"Authorization": f"Bearer {user_access_token}"},
+ params={"target_version": target_version},
+ )
+ assert res.status_code == 200
+ task_id = res.json()
+ assert task_id
+ task = wait_task_completion(client, user_access_token, task_id)
+ assert task.status == TaskStatus.COMPLETED
+ assert (
+ target_version in task.result.message
+ ), f"Version not in {task.result.message=}"
+
+ def test_upgrade_study__bad_target_version(
+ self, client: TestClient, user_access_token: str, study_id: str
+ ):
+ target_version = "999"
+ res = client.put(
+ f"/v1/studies/{study_id}/upgrade",
+ headers={"Authorization": f"Bearer {user_access_token}"},
+ params={"target_version": target_version},
+ )
+ assert res.status_code == 200
+ task_id = res.json()
+ assert task_id
+ task = wait_task_completion(client, user_access_token, task_id)
+ assert task.status == TaskStatus.FAILED
+ assert (
+ target_version in task.result.message
+ ), f"Version not in {task.result.message=}"
diff --git a/tests/launcher/test_local_launcher.py b/tests/launcher/test_local_launcher.py
index afc5708013..a63e79ea0c 100644
--- a/tests/launcher/test_local_launcher.py
+++ b/tests/launcher/test_local_launcher.py
@@ -3,15 +3,29 @@
from uuid import uuid4
import pytest
-from sqlalchemy import create_engine
-
from antarest.core.config import Config, LauncherConfig, LocalConfig
from antarest.core.persistence import Base
from antarest.core.utils.fastapi_sqlalchemy import DBSessionMiddleware
+from antarest.launcher.adapters.abstractlauncher import LauncherInitException
from antarest.launcher.adapters.local_launcher.local_launcher import (
LocalLauncher,
)
from antarest.launcher.model import JobStatus
+from sqlalchemy import create_engine
+
+
+@pytest.mark.unit_test
+def test_local_launcher__launcher_init_exception():
+ with pytest.raises(
+ LauncherInitException,
+ match="Missing parameter 'launcher.local'",
+ ):
+ LocalLauncher(
+ config=Config(launcher=LauncherConfig(local=None)),
+ callbacks=Mock(),
+ event_bus=Mock(),
+ cache=Mock(),
+ )
@pytest.mark.unit_test
diff --git a/tests/launcher/test_slurm_launcher.py b/tests/launcher/test_slurm_launcher.py
index e365e826dd..940ebe0759 100644
--- a/tests/launcher/test_slurm_launcher.py
+++ b/tests/launcher/test_slurm_launcher.py
@@ -1,33 +1,35 @@
import os
import shutil
+import textwrap
import uuid
from argparse import Namespace
from pathlib import Path
-from unittest.mock import Mock, ANY, patch
+from unittest.mock import ANY, Mock, patch
import pytest
-from sqlalchemy import create_engine
-
from antareslauncher.data_repo.data_repo_tinydb import DataRepoTinydb
from antareslauncher.main import MainParameters
from antareslauncher.study_dto import StudyDTO
from antarest.core.config import Config, LauncherConfig, SlurmConfig
from antarest.core.persistence import Base
from antarest.core.utils.fastapi_sqlalchemy import DBSessionMiddleware
+from antarest.launcher.adapters.abstractlauncher import LauncherInitException
from antarest.launcher.adapters.slurm_launcher.slurm_launcher import (
- SlurmLauncher,
- WORKSPACE_LOCK_FILE_NAME,
LOG_DIR_NAME,
MAX_TIME_LIMIT,
MIN_TIME_LIMIT,
+ WORKSPACE_LOCK_FILE_NAME,
+ SlurmLauncher,
+ VersionNotSupportedError,
)
from antarest.launcher.model import JobStatus, LauncherParametersDTO
from antarest.tools.admin_lib import clean_locks_from_config
+from sqlalchemy import create_engine
@pytest.fixture
def launcher_config(tmp_path: Path) -> Config:
- config = Config(
+ return Config(
launcher=LauncherConfig(
slurm=SlurmConfig(
local_workspace=tmp_path,
@@ -43,7 +45,20 @@ def launcher_config(tmp_path: Path) -> Config:
)
)
)
- return config
+
+
+@pytest.mark.unit_test
+def test_slurm_launcher__launcher_init_exception():
+ with pytest.raises(
+ LauncherInitException,
+ match="Missing parameter 'launcher.slurm'",
+ ):
+ SlurmLauncher(
+ config=Config(launcher=LauncherConfig(slurm=None)),
+ callbacks=Mock(),
+ event_bus=Mock(),
+ cache=Mock(),
+ )
@pytest.mark.unit_test
@@ -221,8 +236,9 @@ def test_extra_parameters(launcher_config: Config):
assert launcher_params.post_processing
+# noinspection PyUnresolvedReferences
@pytest.mark.parametrize(
- "version,job_status",
+ "version, job_status",
[(42, JobStatus.RUNNING), (99, JobStatus.FAILED), (45, JobStatus.FAILED)],
)
@pytest.mark.unit_test
@@ -234,6 +250,7 @@ def test_run_study(
):
engine = create_engine("sqlite:///:memory:", echo=True)
Base.metadata.create_all(engine)
+ # noinspection PyTypeChecker
DBSessionMiddleware(
Mock(),
custom_engine=engine,
@@ -247,7 +264,6 @@ def test_run_study(
)
study_uuid = "study_uuid"
- params = Mock()
argument = Mock()
argument.studies_in = (
launcher_config.launcher.slurm.local_workspace / "studies_in"
@@ -261,19 +277,30 @@ def test_run_study(
study_dir = argument.studies_in / job_id
study_dir.mkdir(parents=True)
(study_dir / "study.antares").write_text(
- """[antares]
-version=1
- """
+ textwrap.dedent(
+ """\
+ [antares]
+ version=1
+ """
+ )
)
+ # noinspection PyUnusedLocal
def call_launcher_mock(arguments: Namespace, parameters: MainParameters):
if version != 45:
slurm_launcher.data_repo_tinydb.save_study(StudyDTO(job_id))
slurm_launcher._call_launcher = call_launcher_mock
- slurm_launcher._run_study(
- study_uuid, job_id, LauncherParametersDTO(), str(version)
- )
+
+ if version == 99:
+ with pytest.raises(VersionNotSupportedError):
+ slurm_launcher._run_study(
+ study_uuid, job_id, LauncherParametersDTO(), str(version)
+ )
+ else:
+ slurm_launcher._run_study(
+ study_uuid, job_id, LauncherParametersDTO(), str(version)
+ )
assert (
version
@@ -286,8 +313,8 @@ def call_launcher_mock(arguments: Namespace, parameters: MainParameters):
slurm_launcher.callbacks.update_status.assert_called_once_with(
ANY, job_status, ANY, None
)
- slurm_launcher.start.assert_called_once()
if job_status == JobStatus.RUNNING:
+ slurm_launcher.start.assert_called_once()
slurm_launcher._delete_workspace_file.assert_called_once()
@@ -325,6 +352,7 @@ def test_check_state(tmp_path: Path, launcher_config: Config):
slurm_launcher._check_studies_state()
+ # noinspection PyUnresolvedReferences
assert slurm_launcher.callbacks.update_status.call_count == 2
assert slurm_launcher._import_study_output.call_count == 2
assert slurm_launcher._delete_workspace_file.call_count == 4
@@ -336,13 +364,13 @@ def test_check_state(tmp_path: Path, launcher_config: Config):
def test_clean_local_workspace(tmp_path: Path, launcher_config: Config):
engine = create_engine("sqlite:///:memory:", echo=True)
Base.metadata.create_all(engine)
+ # noinspection PyTypeChecker
DBSessionMiddleware(
Mock(),
custom_engine=engine,
session_args={"autocommit": False, "autoflush": False},
)
- storage_service = Mock()
slurm_launcher = SlurmLauncher(
config=launcher_config,
callbacks=Mock(),
@@ -358,6 +386,7 @@ def test_clean_local_workspace(tmp_path: Path, launcher_config: Config):
assert not os.listdir(launcher_config.launcher.slurm.local_workspace)
+# noinspection PyUnresolvedReferences
@pytest.mark.unit_test
def test_import_study_output(launcher_config, tmp_path):
slurm_launcher = SlurmLauncher(
@@ -518,9 +547,9 @@ def test_launcher_workspace_init(
retrieve_existing_jobs=True,
cache=Mock(),
)
- workspaces = list(
- filter(lambda x: x.name != LOG_DIR_NAME, tmp_path.iterdir())
- )
+ workspaces = [
+ p for p in tmp_path.iterdir() if p.is_dir() and p.name != LOG_DIR_NAME
+ ]
assert len(workspaces) == 1
assert (workspaces[0] / WORKSPACE_LOCK_FILE_NAME).exists()
@@ -535,30 +564,30 @@ def test_launcher_workspace_init(
run_with_mock.assert_not_called()
# will use existing private workspace
- slurm_launcher = SlurmLauncher(
+ SlurmLauncher(
config=launcher_config,
callbacks=callbacks,
event_bus=Mock(),
retrieve_existing_jobs=True,
cache=Mock(),
)
- assert (
- len(list(filter(lambda x: x.name != LOG_DIR_NAME, tmp_path.iterdir())))
- == 1
- )
+ workspaces = [
+ p for p in tmp_path.iterdir() if p.is_dir() and p.name != LOG_DIR_NAME
+ ]
+ assert len(workspaces) == 1
run_with_mock.assert_called()
run_with_mock.reset_mock()
# will create a new one since there is a lock on previous one
- slurm_launcher = SlurmLauncher(
+ SlurmLauncher(
config=launcher_config,
callbacks=callbacks,
event_bus=Mock(),
retrieve_existing_jobs=True,
cache=Mock(),
)
- assert (
- len(list(filter(lambda x: x.name != LOG_DIR_NAME, tmp_path.iterdir())))
- == 2
- )
+ workspaces = [
+ p for p in tmp_path.iterdir() if p.is_dir() and p.name != LOG_DIR_NAME
+ ]
+ assert len(workspaces) == 2
run_with_mock.assert_not_called()
diff --git a/tests/storage/business/assets/__init__.py b/tests/storage/business/assets/__init__.py
new file mode 100644
index 0000000000..773f16ec60
--- /dev/null
+++ b/tests/storage/business/assets/__init__.py
@@ -0,0 +1,3 @@
+from pathlib import Path
+
+ASSETS_DIR = Path(__file__).parent.resolve()
diff --git a/tests/storage/business/assets/broken_study_720.zip b/tests/storage/business/assets/broken_study_720.zip
new file mode 100644
index 0000000000..f65c226e20
Binary files /dev/null and b/tests/storage/business/assets/broken_study_720.zip differ
diff --git a/tests/storage/business/assets/test_output_zip_not_zipped.zip b/tests/storage/business/assets/test_output_zip_not_zipped.zip
new file mode 100644
index 0000000000..62da946957
Binary files /dev/null and b/tests/storage/business/assets/test_output_zip_not_zipped.zip differ
diff --git a/tests/storage/business/test_antares_configparser.py b/tests/storage/business/test_antares_configparser.py
new file mode 100644
index 0000000000..8e0d7e0597
--- /dev/null
+++ b/tests/storage/business/test_antares_configparser.py
@@ -0,0 +1,52 @@
+import textwrap
+from pathlib import Path
+from typing import cast
+
+from antarest.study.storage.antares_configparser import (
+ AntaresConfigParser,
+ AntaresSectionProxy,
+)
+
+
+def test_configparser(tmp_path: Path):
+ config = AntaresConfigParser()
+ config["general"] = {}
+ general_section = cast(AntaresSectionProxy, config["general"])
+ general_section["mode"] = "Economy"
+ general_section["horizon"] = None # converted to ""
+ general_section["nbyears"] = 2 # converted to str
+ general_section["leapyear"] = False # converted to "false"
+ general_section["pi"] = 3.1415926535_8979323846 # converted to str
+
+ config.add_section("output")
+ config.set("output", "synthesis", True)
+
+ config_path = tmp_path.joinpath("config.ini")
+ with config_path.open(mode="w", encoding="utf-8") as f:
+ config.write(f)
+
+ actual = config_path.read_text(encoding="utf-8")
+ expected = textwrap.dedent(
+ """\
+ [general]
+ mode = Economy
+ horizon =
+ nbyears = 2
+ leapyear = false
+ pi = 3.141592653589793
+
+ [output]
+ synthesis = true
+ """
+ )
+ assert actual.strip() == expected.strip()
+
+ config = AntaresConfigParser()
+ config.read(config_path)
+ general_section = cast(AntaresSectionProxy, config["general"])
+ assert general_section["mode"] == "Economy"
+ assert general_section["horizon"] == ""
+ assert general_section.getint("nbyears") == 2
+ assert general_section.getboolean("leapyear") is False
+ assert general_section.getfloat("pi") == 3.1415926535_8979323846
+ assert config.getboolean("output", "synthesis") is True
diff --git a/tests/storage/business/test_arealink_manager.py b/tests/storage/business/test_arealink_manager.py
index dcc744e234..23fcf9be04 100644
--- a/tests/storage/business/test_arealink_manager.py
+++ b/tests/storage/business/test_arealink_manager.py
@@ -18,7 +18,6 @@
AreaType,
AreaCreationDTO,
AreaUI,
- LayerInfoDTO,
)
from antarest.study.business.link_management import LinkManager, LinkInfoDTO
from antarest.study.model import (
@@ -30,9 +29,7 @@
)
from antarest.study.repository import StudyMetadataRepository
from antarest.study.storage.patch_service import PatchService
-from antarest.study.storage.rawstudy.model.filesystem.config.files import (
- ConfigPathBuilder,
-)
+from antarest.study.storage.rawstudy.model.filesystem.config.files import build
from antarest.study.storage.rawstudy.model.filesystem.config.model import (
FileStudyTreeConfig,
Area,
@@ -70,7 +67,7 @@ def empty_study(tmpdir: Path) -> FileStudy:
os.mkdir(study_path)
with ZipFile(cur_dir / "assets" / "empty_study_810.zip") as zip_output:
zip_output.extractall(path=study_path)
- config = ConfigPathBuilder.build(study_path, "1")
+ config = build(study_path, "1")
return FileStudy(config, FileStudyTree(Mock(), config))
diff --git a/tests/storage/business/test_patch_service.py b/tests/storage/business/test_patch_service.py
index 6f1b7087dc..93820d23f8 100644
--- a/tests/storage/business/test_patch_service.py
+++ b/tests/storage/business/test_patch_service.py
@@ -1,17 +1,26 @@
+import contextlib
import json
+import uuid
+from datetime import datetime, timezone
from pathlib import Path
from unittest.mock import Mock
import pytest
-
+from antarest.core.model import PublicMode
+from antarest.core.utils.fastapi_sqlalchemy import db
from antarest.study.model import (
+ DEFAULT_WORKSPACE_NAME,
Patch,
- PatchStudy,
PatchArea,
PatchOutputs,
+ PatchStudy,
+ RawStudy,
+ Study,
+ StudyAdditionalData,
)
from antarest.study.repository import StudyMetadataRepository
from antarest.study.storage.patch_service import PatchService
+from tests.conftest import with_db_context
PATCH_CONTENT = """
{
@@ -37,60 +46,204 @@
@pytest.mark.unit_test
-def test_get(tmp_path: str):
- patch_json_path = Path(tmp_path) / "patch.json"
- patch_json_path.write_text(PATCH_CONTENT)
- raw_study = Mock()
- raw_study.path = tmp_path
-
- expected_patch = Patch(
- study=PatchStudy(scenario="BAU2025"),
- areas={"a1": PatchArea(country="FR")},
- outputs=PatchOutputs(reference="20210588-eco-1532"),
- )
-
- patch_service = PatchService(repository=Mock(spec=StudyMetadataRepository))
- patch = patch_service.get(raw_study)
- assert patch == expected_patch
-
-
-@pytest.mark.unit_test
-def test_save(tmp_path: str):
- patch = Patch(
- study=PatchStudy(scenario="BAU2025"),
- areas={"a1": PatchArea(country="FR")},
- outputs=PatchOutputs(reference="20210588-eco-1532"),
- )
- expected_json = json.dumps(json.loads(PATCH_CONTENT))
-
- raw_study = Mock()
- raw_study.path = tmp_path
-
- patch_service = PatchService(repository=Mock(spec=StudyMetadataRepository))
- patch_service.save(raw_study, patch)
-
- assert (Path(tmp_path) / "patch.json").read_text() == expected_json
-
-
-@pytest.mark.unit_test
-def test_set_output_ref(tmp_path: str):
- patch = Patch(
- study=PatchStudy(scenario="BAU2025"),
- areas={"a1": PatchArea(country="FR")},
- outputs=PatchOutputs(reference="20210588-eco-1532"),
- )
-
- raw_study = Mock()
- raw_study_patch = Patch(outputs=PatchOutputs(reference="some id"))
-
- patch_service = PatchService(repository=Mock(spec=StudyMetadataRepository))
- patch_service.get = Mock(return_value=raw_study_patch)
- patch_service.save = Mock()
-
- expected = Patch(outputs=PatchOutputs(reference="output-id"))
- patch_service.set_reference_output(raw_study, "output-id", True)
- patch_service.save.assert_called_with(raw_study, expected)
-
- expected = Patch(outputs=PatchOutputs(reference=None))
- patch_service.set_reference_output(raw_study, "output-id", False)
- patch_service.save.assert_called_with(raw_study, expected)
+class TestPatchService:
+ @with_db_context
+ @pytest.mark.parametrize("get_from_file", [True, False])
+ @pytest.mark.parametrize("file_data", ["", PATCH_CONTENT])
+ @pytest.mark.parametrize("patch_data", ["", PATCH_CONTENT])
+ def test_get(
+ self,
+ tmp_path: Path,
+ get_from_file: bool,
+ file_data: str,
+ patch_data: str,
+ ):
+ study_id = str(uuid.uuid4())
+
+ if file_data:
+ # create a "patch.json" file
+ patch_json = tmp_path.joinpath("patch.json")
+ patch_json.write_text(file_data, encoding="utf-8")
+
+ # Prepare a RAW study
+ # noinspection PyArgumentList
+ raw_study = RawStudy(
+ id=study_id,
+ name="my_study",
+ workspace=DEFAULT_WORKSPACE_NAME,
+ path=str(tmp_path),
+ created_at=datetime.now(timezone.utc),
+ updated_at=datetime.now(timezone.utc),
+ version="840",
+ additional_data=StudyAdditionalData(
+ author="john.doe",
+ horizon="foo-horizon",
+ patch=patch_data,
+ ),
+ archived=False,
+ owner=None,
+ groups=[],
+ public_mode=PublicMode.NONE,
+ )
+
+ # Make sure the session is closed to avoid reusing DB objects
+ with contextlib.closing(db.session):
+ db.session.add(raw_study)
+ db.session.commit()
+
+ # The study must be fetched from the database
+ raw_study: RawStudy = db.session.query(Study).get(study_id)
+
+ # Create a PatchService which use a StudyMetadataRepository with a mocked cache
+ patch_service = PatchService(
+ repository=StudyMetadataRepository(Mock())
+ )
+ patch = patch_service.get(raw_study, get_from_file=get_from_file)
+
+ # check the result
+ if (get_from_file and file_data) or (
+ not get_from_file and (patch_data or file_data)
+ ):
+ expected_patch = Patch(
+ study=PatchStudy(scenario="BAU2025"),
+ areas={"a1": PatchArea(country="FR")},
+ outputs=PatchOutputs(reference="20210588-eco-1532"),
+ )
+ else:
+ expected_patch = Patch()
+
+ assert patch == expected_patch
+
+ @with_db_context
+ def test_save(self, tmp_path):
+ study_id = str(uuid.uuid4())
+
+ # Prepare a RAW study
+ # noinspection PyArgumentList
+ raw_study = RawStudy(
+ id=study_id,
+ name="my_study",
+ workspace=DEFAULT_WORKSPACE_NAME,
+ path=str(tmp_path),
+ created_at=datetime.now(timezone.utc),
+ updated_at=datetime.now(timezone.utc),
+ version="840",
+ additional_data=StudyAdditionalData(
+ author="john.doe",
+ horizon="foo-horizon",
+ patch="",
+ ),
+ archived=False,
+ owner=None,
+ groups=[],
+ public_mode=PublicMode.NONE,
+ )
+
+ # Make sure the session is closed to avoid reusing DB objects
+ with contextlib.closing(db.session):
+ db.session.add(raw_study)
+ db.session.commit()
+
+ # The study must be fetched from the database
+ raw_study: RawStudy = db.session.query(Study).get(study_id)
+
+ # Create a PatchService which use a StudyMetadataRepository with a mocked cache
+ patch_service = PatchService(
+ repository=StudyMetadataRepository(Mock())
+ )
+
+ patch = Patch(
+ study=PatchStudy(scenario="BAU2025"),
+ areas={"a1": PatchArea(country="FR")},
+ outputs=PatchOutputs(reference="20210588-eco-1532"),
+ )
+ patch_service.save(raw_study, patch)
+
+ # check the result
+ actual_obj = json.loads(
+ tmp_path.joinpath("patch.json").read_text(encoding="utf-8")
+ )
+ expected_obj = json.loads(PATCH_CONTENT)
+ assert actual_obj == expected_obj
+
+ @with_db_context
+ def test_set_output_ref(self, tmp_path: Path):
+ study_id = str(uuid.uuid4())
+
+ patch_outputs = PatchOutputs(reference="some id")
+
+ # Prepare a RAW study
+ # noinspection PyArgumentList
+ raw_study = RawStudy(
+ id=study_id,
+ name="my_study",
+ workspace=DEFAULT_WORKSPACE_NAME,
+ path=str(tmp_path),
+ created_at=datetime.now(timezone.utc),
+ updated_at=datetime.now(timezone.utc),
+ version="840",
+ additional_data=StudyAdditionalData(
+ author="john.doe",
+ horizon="foo-horizon",
+ patch=patch_outputs.json(),
+ ),
+ archived=False,
+ owner=None,
+ groups=[],
+ public_mode=PublicMode.NONE,
+ )
+
+ # Make sure the session is closed to avoid reusing DB objects
+ with contextlib.closing(db.session):
+ db.session.add(raw_study)
+ db.session.commit()
+
+ # The study must be fetched from the database
+ raw_study: RawStudy = db.session.query(Study).get(study_id)
+
+ # Create a PatchService which use a StudyMetadataRepository with a mocked cache
+ patch_service = PatchService(
+ repository=StudyMetadataRepository(Mock())
+ )
+
+ # run with status=True
+ patch_service.set_reference_output(raw_study, "output-id", status=True)
+
+ # check the result
+ actual_obj = json.loads(
+ tmp_path.joinpath("patch.json").read_text(encoding="utf-8")
+ )
+ expected_obj = json.loads(
+ """
+ {
+ "areas": null,
+ "outputs": {
+ "reference": "output-id"
+ },
+ "study": null,
+ "thermal_clusters": null
+ }
+ """
+ )
+ assert actual_obj == expected_obj
+
+ # run with status=False
+ patch_service.set_reference_output(
+ raw_study, "output-id", status=False
+ )
+ actual_obj = json.loads(
+ tmp_path.joinpath("patch.json").read_text(encoding="utf-8")
+ )
+ expected_obj = json.loads(
+ """
+ {
+ "areas": null,
+ "outputs": {
+ "reference": null
+ },
+ "study": null,
+ "thermal_clusters": null
+ }
+ """
+ )
+ assert actual_obj == expected_obj
diff --git a/tests/storage/business/test_raw_study_service.py b/tests/storage/business/test_raw_study_service.py
index c455542ff4..83205a9337 100644
--- a/tests/storage/business/test_raw_study_service.py
+++ b/tests/storage/business/test_raw_study_service.py
@@ -287,6 +287,7 @@ def create_study(version: str):
md720 = create_study("720")
md803 = create_study("800")
md810 = create_study("810")
+ md850 = create_study("850")
path_study = path_studies / md613.id
general_data_file = path_study / "settings" / "generaldata.ini"
@@ -382,6 +383,58 @@ def create_study(version: str):
is None
)
+ path_study = path_studies / md850.id
+ general_data_file = path_study / "settings" / "generaldata.ini"
+ general_data = general_data_file.read_text()
+ assert (
+ re.search(
+ "^price-taking-order = DENS",
+ general_data,
+ flags=re.MULTILINE,
+ )
+ is not None
+ )
+ assert (
+ re.search(
+ "^include-hurdle-cost-csr = false",
+ general_data,
+ flags=re.MULTILINE,
+ )
+ is not None
+ )
+ assert (
+ re.search(
+ "^check-csr-cost-function = false",
+ general_data,
+ flags=re.MULTILINE,
+ )
+ is not None
+ )
+ assert (
+ re.search(
+ "^threshold-initiate-curtailment-sharing-rule = 0.0",
+ general_data,
+ flags=re.MULTILINE,
+ )
+ is not None
+ )
+ assert (
+ re.search(
+ "^threshold-display-local-matching-rule-violations = 0.0",
+ general_data,
+ flags=re.MULTILINE,
+ )
+ is not None
+ )
+ assert (
+ re.search(
+ "^threshold-csr-variable-bounds-relaxation = 3",
+ general_data,
+ flags=re.MULTILINE,
+ )
+ is not None
+ )
+
@pytest.mark.unit_test
def test_copy_study(
diff --git a/tests/storage/business/test_study_version_upgrader.py b/tests/storage/business/test_study_version_upgrader.py
index 1c137b1750..9f14f57789 100644
--- a/tests/storage/business/test_study_version_upgrader.py
+++ b/tests/storage/business/test_study_version_upgrader.py
@@ -1,5 +1,8 @@
+import filecmp
import glob
-import os
+import re
+import shutil
+import tempfile
from pathlib import Path
from typing import List
from zipfile import ZipFile
@@ -7,76 +10,106 @@
import pandas
import pytest
-from antarest.study.storage import study_version_upgrader
+
from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader
from antarest.study.storage.rawstudy.model.filesystem.root.settings.generaldata import (
DUPLICATE_KEYS,
)
-from antarest.study.storage.study_version_upgrader import InvalidUpgrade
-from antarest.study.storage.study_version_upgrader import (
- mapping_transmission_capacities,
+from antarest.study.storage.study_upgrader import (
+ upgrade_study,
+ InvalidUpgrade,
+ UPGRADE_METHODS,
+)
+from antarest.study.storage.study_upgrader.upgrader_840 import (
+ MAPPING_TRANSMISSION_CAPACITIES,
)
-
-sep = os.sep
-def test_study_version_upgrader(tmp_path: Path):
+def test_end_to_end_upgrades(tmp_path: Path):
cur_dir: Path = Path(__file__).parent
path_study = cur_dir / "assets" / "little_study_700.zip"
with ZipFile(path_study) as zip_output:
zip_output.extractall(path=tmp_path)
+ tmp_dir_before_upgrade = tempfile.mkdtemp(
+ suffix=".before_upgrade.tmp", prefix="~", dir=cur_dir / "assets"
+ )
+ shutil.copytree(tmp_path, tmp_dir_before_upgrade, dirs_exist_ok=True)
old_values = get_old_settings_values(tmp_path)
old_areas_values = get_old_area_values(tmp_path)
- study_version_upgrader.upgrade_study(str(tmp_path), 840)
- assert_study_antares_file_is_updated(tmp_path)
+ # Only checks if the study_upgrader can go from the first supported version to the last one
+ target_version = "850"
+ upgrade_study(tmp_path, target_version)
+ with open(tmp_path / "settings" / "generaldata.ini", "r") as f:
+ print(f.readlines())
+ assert_study_antares_file_is_updated(tmp_path, target_version)
assert_settings_are_updated(tmp_path, old_values)
assert_inputs_are_updated(tmp_path, old_areas_values)
+ assert (False, are_same_dir(tmp_path, tmp_dir_before_upgrade))
+ shutil.rmtree(tmp_dir_before_upgrade)
-def test_study_version_upgrader_fails(tmp_path: Path):
+def test_fails_because_of_versions_asked(tmp_path: Path):
cur_dir: Path = Path(__file__).parent
- path_study = cur_dir / "assets" / "little_study_700.zip"
+ path_study = cur_dir / "assets" / "little_study_720.zip"
with ZipFile(path_study) as zip_output:
zip_output.extractall(path=tmp_path)
with pytest.raises(
- expected_exception=InvalidUpgrade,
- match=f"The version {600} is not supported",
+ InvalidUpgrade,
+ match=f"Version '600' unknown: possible versions are {', '.join([u[1] for u in UPGRADE_METHODS])}",
+ ):
+ upgrade_study(tmp_path, "600")
+ with pytest.raises(
+ InvalidUpgrade, match="Your study is already in version '720'"
+ ):
+ upgrade_study(tmp_path, "720")
+ with pytest.raises(
+ InvalidUpgrade,
+ match="Impossible to upgrade from version '720' to version '710'",
):
- study_version_upgrader.upgrade_study(str(tmp_path), 600)
+ upgrade_study(tmp_path, "710")
with pytest.raises(
- expected_exception=InvalidUpgrade,
- match="The version you asked for is the one you currently have",
+ InvalidUpgrade,
+ match=f"Version '820.rc' unknown: possible versions are {', '.join([u[1] for u in UPGRADE_METHODS])}",
):
- study_version_upgrader.upgrade_study(str(tmp_path), 700)
- path_other_study = cur_dir / "assets" / "little_study_720.zip"
- target_other_study = tmp_path / "other_study_for_test"
- with ZipFile(path_other_study) as zip_output:
- zip_output.extractall(path=target_other_study)
+ upgrade_study(tmp_path, "820.rc")
+
+
+def test_fallback_if_study_input_broken(tmp_path):
+ cur_dir: Path = Path(__file__).parent
+ path_study = cur_dir / "assets" / "broken_study_720.zip"
+ with ZipFile(path_study) as zip_output:
+ zip_output.extractall(path=tmp_path)
+ tmp_dir_before_upgrade = tempfile.mkdtemp(
+ suffix=".before_upgrade.tmp", prefix="~", dir=cur_dir / "assets"
+ )
+ shutil.copytree(tmp_path, tmp_dir_before_upgrade, dirs_exist_ok=True)
with pytest.raises(
- expected_exception=InvalidUpgrade,
- match="Cannot downgrade your study version",
+ expected_exception=pandas.errors.EmptyDataError,
+ match="No columns to parse from file",
):
- study_version_upgrader.upgrade_study(str(target_other_study), 700)
+ upgrade_study(tmp_path, "850")
+ assert are_same_dir(tmp_path, tmp_dir_before_upgrade)
+ shutil.rmtree(tmp_dir_before_upgrade)
-def assert_study_antares_file_is_updated(tmp_path: Path) -> None:
- with open(str(tmp_path) + f"{sep}study.antares") as study_antares:
- lines = study_antares.readlines()
- assert lines[1] == "version = 840\n"
- assert len(lines) == 7
+def assert_study_antares_file_is_updated(
+ tmp_path: Path, target_version: str
+) -> None:
+ lines = (tmp_path / "study.antares").read_text(encoding="utf-8")
+ assert re.search(r"version\s*=\s*(\d+)", lines)[1] == target_version
def assert_settings_are_updated(tmp_path: Path, old_values: List[str]) -> None:
- general_data_path = str(tmp_path) + f"{sep}settings{sep}generaldata.ini"
+ general_data_path = tmp_path / "settings" / "generaldata.ini"
reader = MultipleSameKeysIniReader(DUPLICATE_KEYS)
- data = reader.read(Path(general_data_path))
+ data = reader.read(general_data_path)
general = data["general"]
optimization = data["optimization"]
adequacy_patch = data["adequacy patch"]
other_preferences = data["other preferences"]
assert general["geographic-trimming"] == old_values[0]
assert general["custom-scenario"] == old_values[1]
- assert general["thematic-trimming"] is False
+ assert general["geographic-trimming"] is False
assert optimization["include-exportstructure"] is False
assert (
optimization["include-unfeasible-problem-behavior"] == "error-verbose"
@@ -87,27 +120,32 @@ def assert_settings_are_updated(tmp_path: Path, old_values: List[str]) -> None:
)
assert other_preferences["renewable-generation-modelling"] == "aggregated"
assert adequacy_patch["include-adq-patch"] is False
- assert (
- adequacy_patch["set-to-null-ntc-between-physical-out-for-first-step"]
- is True
- )
- assert (
- adequacy_patch[
- "set-to-null-ntc-from-physical-out-to-physical-in-for-first-step"
- ]
- is True
- )
+ assert adequacy_patch[
+ "set-to-null-ntc-between-physical-out-for-first-step"
+ ]
+ assert adequacy_patch[
+ "set-to-null-ntc-from-physical-out-to-physical-in-for-first-step"
+ ]
assert (
optimization["transmission-capacities"]
- == mapping_transmission_capacities[old_values[2]]
+ == MAPPING_TRANSMISSION_CAPACITIES[old_values[2]]
)
assert "include-split-exported-mps" not in optimization
+ assert adequacy_patch["price-taking-order"] == "DENS"
+ assert adequacy_patch["include-hurdle-cost-csr"] is False
+ assert adequacy_patch["check-csr-cost-function"] is False
+ assert adequacy_patch["threshold-initiate-curtailment-sharing-rule"] == 0.0
+ assert (
+ adequacy_patch["threshold-display-local-matching-rule-violations"]
+ == 0.0
+ )
+ assert adequacy_patch["threshold-csr-variable-bounds-relaxation"] == 3
def get_old_settings_values(tmp_path: Path) -> List[str]:
- general_data_path = str(tmp_path) + f"{sep}settings{sep}generaldata.ini"
+ general_data_path = tmp_path / "settings" / "generaldata.ini"
reader = MultipleSameKeysIniReader(DUPLICATE_KEYS)
- data = reader.read(Path(general_data_path))
+ data = reader.read(general_data_path)
filtering_value = data["general"]["filtering"]
custom_ts_value = data["general"]["custom-ts-numbers"]
transmission_capa_value = data["optimization"]["transmission-capacities"]
@@ -115,55 +153,84 @@ def get_old_settings_values(tmp_path: Path) -> List[str]:
def get_old_area_values(tmp_path: Path) -> dict:
- links = glob.glob(os.path.join(tmp_path, f"input{sep}links{sep}*"))
+ links = glob.glob(str(tmp_path / "input" / "links" / "*"))
dico = {}
for folder in links:
- all_txt = glob.glob(os.path.join(folder, "*.txt"))
+ all_txt = glob.glob(str(Path(folder) / "*.txt"))
if len(all_txt) > 0:
for txt in all_txt:
- new_txt = txt.replace(
- str(tmp_path) + f"{sep}input{sep}links{sep}", ""
- ).replace(".txt", "")
+ path_txt = Path(txt)
+ new_txt = Path(path_txt.parent.name).joinpath(path_txt.stem)
df = pandas.read_csv(txt, sep="\t", header=None)
- dico[new_txt] = df
+ dico[str(new_txt)] = df
return dico
def assert_inputs_are_updated(tmp_path: Path, dico: dict) -> None:
- input_path = str(tmp_path) + f"{sep}input"
- assert os.path.isdir(input_path + f"{sep}renewables") is True
- assert os.path.isdir(input_path + f"{sep}renewables{sep}clusters") is True
- assert os.path.isdir(input_path + f"{sep}renewables{sep}series") is True
- links = glob.glob(os.path.join(tmp_path, f"input{sep}links{sep}*"))
+ input_path = tmp_path / "input"
+ assert (input_path / "renewables").is_dir()
+ assert (input_path / "renewables" / "clusters").is_dir()
+ assert (input_path / "renewables" / "series").is_dir()
+ links = glob.glob(str(tmp_path / "input" / "links" / "*"))
for folder in links:
- all_txt = glob.glob(os.path.join(folder, "*.txt"))
+ folder_path = Path(folder)
+ all_txt = glob.glob(str(folder_path / "*.txt"))
if len(all_txt) > 0:
for txt in all_txt:
+ path_txt = Path(txt)
+ old_txt = str(
+ Path(path_txt.parent.name).joinpath(path_txt.stem)
+ ).replace("_parameters", "")
df = pandas.read_csv(txt, sep="\t", header=None)
- old_txt = (
- txt.replace(input_path + f"{sep}links{sep}", "")
- .replace(".txt", "")
- .replace("_parameters", "")
+ assert (
+ df.values.all() == dico[old_txt].iloc[:, 2:8].values.all()
)
- assert (df.values == dico[old_txt].iloc[:, 2:8].values).all()
- capacities = glob.glob(os.path.join(folder, f"capacities{sep}*"))
- if len(capacities) > 0:
- for direction_txt in capacities:
- df_capacities = pandas.read_csv(
- direction_txt, sep="\t", header=None
+ capacities = glob.glob(str(folder_path / "capacities" / "*"))
+ for direction_txt in capacities:
+ df_capacities = pandas.read_csv(
+ direction_txt, sep="\t", header=None
+ )
+ direction_path = Path(direction_txt)
+ old_txt = str(
+ Path(direction_path.parent.parent.name).joinpath(
+ direction_path.name
)
- old_txt = direction_txt.replace(
- input_path + f"{sep}links{sep}", ""
- ).replace(f"capacities{sep}", "")
- if "indirect" in old_txt:
- new_txt = old_txt.replace("_indirect.txt", "")
- assert (
- df_capacities[0].values
- == dico[new_txt].iloc[:, 0].values
- ).all()
- else:
- new_txt = old_txt.replace("_direct.txt", "")
- assert (
- df_capacities[0].values
- == dico[new_txt].iloc[:, 1].values
- ).all()
+ )
+ if "indirect" in old_txt:
+ new_txt = old_txt.replace("_indirect.txt", "")
+ assert (
+ df_capacities[0].values.all()
+ == dico[new_txt].iloc[:, 0].values.all()
+ )
+ else:
+ new_txt = old_txt.replace("_direct.txt", "")
+ assert (
+ df_capacities[0].values.all()
+ == dico[new_txt].iloc[:, 1].values.all()
+ )
+ areas = glob.glob(str(tmp_path / "input" / "areas" / "*"))
+ for folder in areas:
+ folder_path = Path(folder)
+ if folder_path.is_dir():
+ reader = MultipleSameKeysIniReader(DUPLICATE_KEYS)
+ data = reader.read(folder_path / "adequacy_patch.ini")
+ assert data["adequacy-patch"]["adequacy-patch-mode"] == "outside"
+
+
+def are_same_dir(dir1, dir2) -> bool:
+ dirs_cmp = filecmp.dircmp(dir1, dir2)
+ if (
+ len(dirs_cmp.left_only) > 0
+ or len(dirs_cmp.right_only) > 0
+ or len(dirs_cmp.funny_files) > 0
+ ):
+ return False
+ for common_dir in dirs_cmp.common_dirs:
+ path_dir1 = Path(dir1)
+ path_dir2 = Path(dir2)
+ path_common_dir = Path(common_dir)
+ new_dir1 = path_dir1 / path_common_dir
+ new_dir2 = path_dir2 / path_common_dir
+ if not are_same_dir(new_dir1, new_dir2):
+ return False
+ return True
diff --git a/tests/storage/business/test_timeseries_config_manager.py b/tests/storage/business/test_timeseries_config_manager.py
index 11e070cc97..692e5d8206 100644
--- a/tests/storage/business/test_timeseries_config_manager.py
+++ b/tests/storage/business/test_timeseries_config_manager.py
@@ -6,19 +6,13 @@
import pytest
-from antarest.study.business.config_management import ConfigManager
from antarest.study.business.timeseries_config_management import (
TimeSeriesConfigManager,
TSFormFields,
TSFormFieldsForType,
SeasonCorrelation,
)
-from antarest.study.storage.rawstudy.model.filesystem.config.files import (
- ConfigPathBuilder,
-)
-from antarest.study.storage.rawstudy.model.filesystem.config.model import (
- FileStudyTreeConfig,
-)
+from antarest.study.storage.rawstudy.model.filesystem.config.files import build
from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy
from antarest.study.storage.rawstudy.model.filesystem.root.filestudytree import (
FileStudyTree,
@@ -42,7 +36,7 @@ def get_file_study(version: int, tmpdir: Path) -> FileStudy:
cur_dir / "assets" / f"empty_study_{version}.zip"
) as zip_output:
zip_output.extractall(path=study_path)
- config = ConfigPathBuilder.build(study_path, "1")
+ config = build(study_path, "1")
return FileStudy(config, FileStudyTree(Mock(), config))
diff --git a/tests/storage/business/test_watcher.py b/tests/storage/business/test_watcher.py
index 54b9d98cb6..80f15bfec7 100644
--- a/tests/storage/business/test_watcher.py
+++ b/tests/storage/business/test_watcher.py
@@ -7,6 +7,7 @@
from sqlalchemy import create_engine
from antarest.core.config import Config, StorageConfig, WorkspaceConfig
+from antarest.core.exceptions import CannotScanInternalWorkspace
from antarest.core.persistence import Base
from antarest.core.utils.fastapi_sqlalchemy import DBSessionMiddleware
from antarest.login.model import Group
@@ -27,6 +28,11 @@ def build_config(root: Path) -> Config:
groups=["tata"],
filter_out=["to_skip.*"],
),
+ "test": WorkspaceConfig(
+ path=root / "test",
+ groups=["toto"],
+ filter_out=["to_skip.*"],
+ ),
}
)
)
@@ -105,7 +111,7 @@ def test_partial_scan(tmp_path: Path):
clean_files()
- default = tmp_path / "default"
+ default = tmp_path / "test"
default.mkdir()
a = default / "studyA"
a.mkdir()
@@ -122,11 +128,16 @@ def test_partial_scan(tmp_path: Path):
build_config(tmp_path), service, task_service=SimpleSyncTaskService()
)
- watcher.scan(workspace_name="default", workspace_directory_path=default)
+ with pytest.raises(CannotScanInternalWorkspace):
+ watcher.scan(
+ workspace_name="default", workspace_directory_path=default
+ )
+
+ watcher.scan(workspace_name="test", workspace_directory_path=default)
service.sync_studies_on_disk.assert_called_once_with(
[
- StudyFolder(a, "default", [Group(id="toto", name="toto")]),
+ StudyFolder(a, "test", [Group(id="toto", name="toto")]),
],
default,
)
diff --git a/tests/storage/business/test_xpansion_manager.py b/tests/storage/business/test_xpansion_manager.py
index 0c8683dfb6..e7091b3d97 100644
--- a/tests/storage/business/test_xpansion_manager.py
+++ b/tests/storage/business/test_xpansion_manager.py
@@ -15,15 +15,13 @@
XpansionSettingsDTO,
XpansionCandidateDTO,
LinkNotFound,
- ConstraintsNotFoundError,
XpansionFileNotFoundError,
XpansionResourceFileType,
FileCurrentlyUsedInSettings,
+ XpansionSensitivitySettingsDTO,
)
from antarest.study.model import RawStudy
-from antarest.study.storage.rawstudy.model.filesystem.config.files import (
- ConfigPathBuilder,
-)
+from antarest.study.storage.rawstudy.model.filesystem.config.files import build
from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy
from antarest.study.storage.rawstudy.model.filesystem.folder_node import (
ChildNotFoundError,
@@ -55,7 +53,7 @@ def make_empty_study(tmpdir: Path, version: int) -> FileStudy:
cur_dir / "assets" / f"empty_study_{version}.zip"
) as zip_output:
zip_output.extractall(path=study_path)
- config = ConfigPathBuilder.build(study_path, "1")
+ config = build(study_path, "1")
return FileStudy(config, FileStudyTree(Mock(), config))
@@ -257,6 +255,41 @@ def test_get_xpansion_settings(
assert xpansion_manager.get_xpansion_settings(study) == expected_output
+@pytest.mark.unit_test
+def test_xpansion_sensitivity_settings(tmp_path: Path):
+ """
+ Test that attribute projection in sensitivity_config is optional
+ """
+
+ empty_study = make_empty_study(tmp_path, 720)
+ study = RawStudy(id="1", path=empty_study.config.study_path, version=720)
+ xpansion_manager = make_xpansion_manager(empty_study)
+
+ xpansion_manager.create_xpansion_configuration(study)
+ expected_settings = XpansionSettingsDTO.parse_obj(
+ {
+ "optimality_gap": 1,
+ "max_iteration": "+Inf",
+ "uc_type": "expansion_fast",
+ "master": "integer",
+ "yearly_weight": None,
+ "additional-constraints": None,
+ "relaxed-optimality-gap": None,
+ "cut-type": None,
+ "ampl.solver": None,
+ "ampl.presolve": None,
+ "ampl.solve_bounds_frequency": None,
+ "relative_gap": 1e-12,
+ "solver": "Cbc",
+ "sensitivity_config": XpansionSensitivitySettingsDTO(
+ epsilon=0.1, capex=False
+ ),
+ }
+ )
+ xpansion_manager.update_xpansion_settings(study, expected_settings)
+ assert xpansion_manager.get_xpansion_settings(study) == expected_settings
+
+
@pytest.mark.unit_test
def test_update_xpansion_settings(tmp_path: Path):
"""
diff --git a/tests/storage/rawstudies/test_factory.py b/tests/storage/rawstudies/test_factory.py
index dccf1209e0..9fa4051c2c 100644
--- a/tests/storage/rawstudies/test_factory.py
+++ b/tests/storage/rawstudies/test_factory.py
@@ -2,9 +2,7 @@
from unittest.mock import Mock
from antarest.core.interfaces.cache import CacheConstants
-from antarest.study.storage.rawstudy.model.filesystem.config.files import (
- ConfigPathBuilder,
-)
+from antarest.study.storage.rawstudy.model.filesystem.config.files import build
from antarest.study.storage.rawstudy.model.filesystem.config.model import (
FileStudyTreeConfigDTO,
)
@@ -22,7 +20,7 @@
def test_renewable_subtree():
path = Path(__file__).parent / "samples/v810/sample1"
context: ContextServer = Mock(specs=ContextServer)
- config = ConfigPathBuilder.build(path, "")
+ config = build(path, "")
assert config.get_renewable_names("area") == ["la_rochelle", "oleron"]
tree = FileStudyTree(context, config)
@@ -60,7 +58,7 @@ def test_factory_cache():
factory = StudyFactory(matrix=Mock(), resolver=Mock(), cache=cache)
study_id = "study-id"
cache_id = f"{CacheConstants.STUDY_FACTORY}/{study_id}"
- config = ConfigPathBuilder.build(path, study_id)
+ config = build(path, study_id)
cache.get.return_value = None
study = factory.create_from_fs(path, study_id)
diff --git a/tests/storage/repository/antares_io/reader/test_ini_reader.py b/tests/storage/repository/antares_io/reader/test_ini_reader.py
index a14b73eb9f..c9bdfed186 100644
--- a/tests/storage/repository/antares_io/reader/test_ini_reader.py
+++ b/tests/storage/repository/antares_io/reader/test_ini_reader.py
@@ -1,5 +1,5 @@
+import textwrap
from pathlib import Path
-from typing import Callable
import pytest
@@ -10,49 +10,78 @@
@pytest.mark.unit_test
-def test_read(tmp_path: str, clean_ini_writer: Callable) -> None:
+def test_read(tmp_path: Path) -> None:
path = Path(tmp_path) / "test.ini"
+ path.write_text(
+ textwrap.dedent(
+ """
+ [part1]
+ key_int = 1
+ key_float = 2.1
+ key_str = value1
+
+ [part2]
+ key_bool = True
+ key_bool2 = False
+ """
+ )
+ )
- ini_content = """
- [part1]
- key_int = 1
- key_float = 2.1
- key_str = value1
-
- [part2]
- key_bool = True
- key_bool2 = False
- """
-
- clean_ini_writer(path, ini_content)
+ reader = IniReader()
+ actual = reader.read(path)
- expected_json = {
+ expected = {
"part1": {"key_int": 1, "key_str": "value1", "key_float": 2.1},
"part2": {"key_bool": True, "key_bool2": False},
}
- reader = IniReader()
- assert reader.read(path) == expected_json
+ assert actual == expected
-def test_read_sets_init(tmp_path: str, clean_ini_writer) -> None:
+def test_read_sets_init(tmp_path: Path) -> None:
path = Path(tmp_path) / "test.ini"
+ path.write_text(
+ textwrap.dedent(
+ """
+ [part1]
+ key_int = 1
+ key_float = 2.1
+ key_str = value1
- ini_content = """
- [part1]
- key_int = 1
- key_float = 2.1
- key_str = value1
-
- [part2]
- key_bool = true
- key_bool = false
- """
+ [part2]
+ key_bool = true
+ key_bool = false
+ """
+ )
+ )
- clean_ini_writer(path, ini_content)
+ reader = MultipleSameKeysIniReader()
+ actual = reader.read(path)
- exp_data = {
+ expected = {
"part1": {"key_int": 1, "key_str": "value1", "key_float": 2.1},
"part2": {"key_bool": [True, False]},
}
- assert MultipleSameKeysIniReader().read(path) == exp_data
+ assert actual == expected
+
+
+def test_read__with_special_keys(tmp_path: Path) -> None:
+ path = Path(tmp_path) / "test.ini"
+ path.write_text(
+ textwrap.dedent(
+ """
+ [chap]
+ + = areaA
+ + = areaB
+ """
+ )
+ )
+
+ reader = MultipleSameKeysIniReader(special_keys=["+"])
+ actual = reader.read(path)
+
+ expected = {
+ "chap": {"+": ["areaA", "areaB"]},
+ }
+
+ assert actual == expected
diff --git a/tests/storage/repository/filesystem/config/test_config_files.py b/tests/storage/repository/filesystem/config/test_config_files.py
index a9c6c2a017..9ccf4c34ac 100644
--- a/tests/storage/repository/filesystem/config/test_config_files.py
+++ b/tests/storage/repository/filesystem/config/test_config_files.py
@@ -1,8 +1,16 @@
from pathlib import Path
+from zipfile import ZipFile
+
+import pytest
from antarest.study.storage.rawstudy.model.filesystem.config.files import (
- ConfigPathBuilder,
+ build,
+ _parse_outputs,
+ _parse_thermal,
+ _parse_sets,
+ _parse_links,
)
+
from antarest.study.storage.rawstudy.model.filesystem.config.model import (
FileStudyTreeConfig,
Area,
@@ -12,6 +20,7 @@
Cluster,
BindingConstraintDTO,
)
+from tests.storage.business.assets import ASSETS_DIR
def build_empty_files(tmp: Path) -> Path:
@@ -50,7 +59,7 @@ def test_parse_output_parmeters(tmp_path) -> None:
study_id="id",
output_path=study / "output",
)
- assert ConfigPathBuilder.build(study, "id") == config
+ assert build(study, "id") == config
def test_parse_bindings(tmp_path: Path) -> None:
@@ -79,7 +88,7 @@ def test_parse_bindings(tmp_path: Path) -> None:
output_path=study_path / "output",
)
- assert ConfigPathBuilder.build(study_path, "id") == config
+ assert build(study_path, "id") == config
def test_parse_outputs(tmp_path: Path) -> None:
@@ -121,10 +130,85 @@ def test_parse_outputs(tmp_path: Path) -> None:
by_year=True,
error=False,
playlist=[1],
+ xpansion="",
)
},
)
- assert ConfigPathBuilder.build(study_path, "id") == config
+ assert build(study_path, "id") == config
+
+
+@pytest.mark.parametrize(
+ "assets_name, expected",
+ [
+ (
+ "test_output_zip_not_zipped.zip",
+ {
+ "20230127-1550eco": Simulation(
+ name="",
+ date="20230127-1550",
+ mode="economy",
+ nbyears=1,
+ synthesis=True,
+ by_year=False,
+ error=False,
+ playlist=[],
+ archived=False,
+ xpansion="",
+ ),
+ "20230203-1530eco": Simulation(
+ name="",
+ date="20230203-1530",
+ mode="economy",
+ nbyears=1,
+ synthesis=False,
+ by_year=False,
+ error=False,
+ playlist=[],
+ archived=False,
+ xpansion="1.0.2",
+ ),
+ "20230203-1531eco": Simulation(
+ name="",
+ date="20230203-1531",
+ mode="economy",
+ nbyears=1,
+ synthesis=False,
+ by_year=False,
+ error=False,
+ playlist=[],
+ archived=True,
+ xpansion="",
+ ),
+ "20230203-1600eco": Simulation(
+ name="",
+ date="20230203-1600",
+ mode="economy",
+ nbyears=1,
+ synthesis=True,
+ by_year=False,
+ error=True,
+ playlist=[],
+ archived=False,
+ xpansion="",
+ ),
+ },
+ ),
+ ],
+)
+def test_parse_outputs__nominal(
+ tmp_path: Path, assets_name: str, expected: dict
+) -> None:
+ """
+ This test decompresses a zipped study (stored in the `assets` directory)
+ into a temporary directory and executes the parsing of the outputs.
+ The result of the analysis is checked to match the expected output data.
+ """
+ pkg_dir = ASSETS_DIR.joinpath(assets_name)
+ with ZipFile(pkg_dir) as zf:
+ zf.extractall(tmp_path)
+ output_path = tmp_path.joinpath("output")
+ actual = _parse_outputs(output_path)
+ assert actual == expected
def test_parse_sets(tmp_path: Path) -> None:
@@ -137,7 +221,7 @@ def test_parse_sets(tmp_path: Path) -> None:
"""
(study_path / "input/areas/sets.ini").write_text(content)
- assert ConfigPathBuilder._parse_sets(study_path) == {
+ assert _parse_sets(study_path) == {
"hello": DistrictSet(areas=["a", "b"], output=True, inverted_set=False)
}
@@ -170,7 +254,7 @@ def test_parse_area(tmp_path: Path) -> None:
)
},
)
- assert ConfigPathBuilder.build(study_path, "id") == config
+ assert build(study_path, "id") == config
def test_parse_thermal(tmp_path: Path) -> None:
@@ -190,7 +274,7 @@ def test_parse_thermal(tmp_path: Path) -> None:
"""
(study_path / "input/thermal/clusters/fr/list.ini").write_text(content)
- assert ConfigPathBuilder._parse_thermal(study_path, "fr") == [
+ assert _parse_thermal(study_path, "fr") == [
Cluster(id="t1", name="t1", enabled=True),
Cluster(id="t2", name="t2", enabled=False),
Cluster(id="t3", name="t3", enabled=True),
@@ -208,4 +292,4 @@ def test_parse_links(tmp_path: Path) -> None:
(study_path / "input/links/fr/properties.ini").write_text(content)
link = Link(filters_synthesis=["annual"], filters_year=["hourly"])
- assert ConfigPathBuilder._parse_links(study_path, "fr") == {"l1": link}
+ assert _parse_links(study_path, "fr") == {"l1": link}
diff --git a/tests/storage/study_upgrader/conftest.py b/tests/storage/study_upgrader/conftest.py
new file mode 100644
index 0000000000..6b0f28147d
--- /dev/null
+++ b/tests/storage/study_upgrader/conftest.py
@@ -0,0 +1,71 @@
+import typing
+import zipfile
+from pathlib import Path
+
+import pytest
+
+
+class AssetNotFoundError(FileNotFoundError):
+ def __init__(self, asset_dir: Path, reason: str):
+ msg = (
+ f"Asset not found in '{asset_dir}': {reason}."
+ f"\nMake sure that the resource files are available in the unit tests"
+ f" and that you have named them correctly according to the module"
+ f" name and the test function name (without the `test_` prefix)."
+ )
+ super().__init__(msg)
+
+
+class StudyAssets(typing.NamedTuple):
+ study_dir: Path
+ expected_dir: Path
+
+
+@pytest.fixture(name="study_assets", scope="function")
+def study_assets(
+ request: pytest.FixtureRequest,
+ tmp_path: Path,
+) -> StudyAssets:
+ """
+ Fixture that provides study assets for a test function.
+ Extract `{study}.zip` and `{study}.expected.zip` assets in the temporary path.
+
+ Args:
+ request: Fixture request object for the test function.
+ tmp_path: Path to a temporary directory for the test session.
+
+ Returns:
+ StudyAssets: An object that contains the paths to directories
+ for the study and expected study assets.
+
+ Raises:
+ AssetNotFoundError: If the study or expected study assets are not found
+ in the resource directory.
+ """
+ module_path = Path(request.fspath)
+ assets_dir = module_path.parent.joinpath(
+ module_path.stem.replace("test_", "")
+ )
+ asset_dir = assets_dir.joinpath(request.node.name.replace("test_", ""))
+ zip_files = list(asset_dir.glob("*.zip"))
+ # find the study ZIP and uncompress it
+ try:
+ zip_path = next(iter(p for p in zip_files if p.suffixes == [".zip"]))
+ except StopIteration:
+ raise AssetNotFoundError(asset_dir, "no '{study}.zip' file") from None
+ study_dir = tmp_path.joinpath(zip_path.stem)
+ with zipfile.ZipFile(zip_path) as zf:
+ zf.extractall(study_dir)
+ # find the expected study ZIP and uncompress it
+ try:
+ zip_path = next(
+ iter(p for p in zip_files if p.suffixes == [".expected", ".zip"])
+ )
+ except StopIteration:
+ raise AssetNotFoundError(
+ asset_dir, "no '{study}.expected.zip' file"
+ ) from None
+ expected_dir = tmp_path.joinpath(zip_path.stem)
+ with zipfile.ZipFile(zip_path) as zf:
+ zf.extractall(expected_dir)
+ return StudyAssets(study_dir, expected_dir)
diff --git a/tests/storage/study_upgrader/test_upgrade_710.py b/tests/storage/study_upgrader/test_upgrade_710.py
new file mode 100644
index 0000000000..752e277432
--- /dev/null
+++ b/tests/storage/study_upgrader/test_upgrade_710.py
@@ -0,0 +1,21 @@
+from antarest.study.storage.rawstudy.io.reader import IniReader
+from antarest.study.storage.study_upgrader import upgrade_710
+from tests.storage.study_upgrader.conftest import StudyAssets
+
+
+def test_nominal_case(study_assets: StudyAssets):
+ """
+ Check that `settings/generaldata.ini` is upgraded to version 710.
+ """
+
+ # upgrade the study
+ upgrade_710(study_assets.study_dir)
+
+ # compare generaldata.ini
+ actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini")
+ actual = IniReader().read(actual_path)
+ expected_path = study_assets.expected_dir.joinpath(
+ "settings/generaldata.ini"
+ )
+ expected = IniReader().read(expected_path)
+ assert actual == expected
diff --git a/tests/storage/study_upgrader/test_upgrade_720.py b/tests/storage/study_upgrader/test_upgrade_720.py
new file mode 100644
index 0000000000..43eb2009f1
--- /dev/null
+++ b/tests/storage/study_upgrader/test_upgrade_720.py
@@ -0,0 +1,15 @@
+from antarest.study.storage.study_upgrader import upgrade_720
+from tests.storage.business.test_study_version_upgrader import are_same_dir
+from tests.storage.study_upgrader.conftest import StudyAssets
+
+
+def test_nominal_case(study_assets: StudyAssets):
+ """
+ Check that `settings/generaldata.ini` is upgraded to version 720.
+ """
+
+ # upgrade the study
+ upgrade_720(study_assets.study_dir)
+
+ # compare folder
+ assert are_same_dir(study_assets.study_dir, study_assets.expected_dir)
diff --git a/tests/storage/study_upgrader/test_upgrade_800.py b/tests/storage/study_upgrader/test_upgrade_800.py
new file mode 100644
index 0000000000..08399dcb0f
--- /dev/null
+++ b/tests/storage/study_upgrader/test_upgrade_800.py
@@ -0,0 +1,21 @@
+from antarest.study.storage.rawstudy.io.reader import IniReader
+from antarest.study.storage.study_upgrader import upgrade_800
+from tests.storage.study_upgrader.conftest import StudyAssets
+
+
+def test_nominal_case(study_assets: StudyAssets):
+ """
+ Check that `settings/generaldata.ini` is upgraded to version 800.
+ """
+
+ # upgrade the study
+ upgrade_800(study_assets.study_dir)
+
+ # compare generaldata.ini
+ actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini")
+ actual = IniReader().read(actual_path)
+ expected_path = study_assets.expected_dir.joinpath(
+ "settings/generaldata.ini"
+ )
+ expected = IniReader().read(expected_path)
+ assert actual == expected
diff --git a/tests/storage/study_upgrader/test_upgrade_810.py b/tests/storage/study_upgrader/test_upgrade_810.py
new file mode 100644
index 0000000000..69156ca2e7
--- /dev/null
+++ b/tests/storage/study_upgrader/test_upgrade_810.py
@@ -0,0 +1,28 @@
+from antarest.study.storage.rawstudy.io.reader import IniReader
+from antarest.study.storage.study_upgrader import upgrade_810
+from tests.storage.business.test_study_version_upgrader import are_same_dir
+from tests.storage.study_upgrader.conftest import StudyAssets
+
+
+def test_nominal_case(study_assets: StudyAssets):
+ """
+ Check that `settings/generaldata.ini` is upgraded to version 810.
+ """
+
+ # upgrade the study
+ upgrade_810(study_assets.study_dir)
+
+ # compare generaldata.ini
+ actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini")
+ actual = IniReader().read(actual_path)
+ expected_path = study_assets.expected_dir.joinpath(
+ "settings/generaldata.ini"
+ )
+ expected = IniReader().read(expected_path)
+ assert actual == expected
+
+ # compare folders (because the upgrade should create empty "renewables" folder)
+ assert are_same_dir(
+ study_assets.study_dir.joinpath("input"),
+ study_assets.expected_dir.joinpath("input"),
+ )
diff --git a/tests/storage/study_upgrader/test_upgrade_820.py b/tests/storage/study_upgrader/test_upgrade_820.py
new file mode 100644
index 0000000000..6098ca7ea6
--- /dev/null
+++ b/tests/storage/study_upgrader/test_upgrade_820.py
@@ -0,0 +1,27 @@
+from antarest.study.storage.rawstudy.io.reader import IniReader
+from antarest.study.storage.study_upgrader import upgrade_820
+from tests.storage.business.test_study_version_upgrader import are_same_dir
+from tests.storage.study_upgrader.conftest import StudyAssets
+
+
+def test_nominal_case(study_assets: StudyAssets):
+ """
+ Check that `settings/generaldata.ini` is upgraded to version 820.
+ """
+
+ # upgrade the study
+ upgrade_820(study_assets.study_dir)
+
+ # compare generaldata.ini
+ actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini")
+ actual = IniReader().read(actual_path)
+ expected_path = study_assets.expected_dir.joinpath(
+ "settings/generaldata.ini"
+ )
+ expected = IniReader().read(expected_path)
+ assert actual == expected
+
+ # compare links
+ actual_link_path = study_assets.study_dir.joinpath("input/links")
+ expected_link_path = study_assets.expected_dir.joinpath("input/links")
+ assert are_same_dir(actual_link_path, expected_link_path)
diff --git a/tests/storage/study_upgrader/test_upgrade_830.py b/tests/storage/study_upgrader/test_upgrade_830.py
new file mode 100644
index 0000000000..5e444b94b9
--- /dev/null
+++ b/tests/storage/study_upgrader/test_upgrade_830.py
@@ -0,0 +1,27 @@
+from antarest.study.storage.rawstudy.io.reader import IniReader
+from antarest.study.storage.study_upgrader import upgrade_830
+from tests.storage.business.test_study_version_upgrader import are_same_dir
+from tests.storage.study_upgrader.conftest import StudyAssets
+
+
+def test_nominal_case(study_assets: StudyAssets):
+ """
+ Check that `settings/generaldata.ini` is upgraded to version 830.
+ """
+
+ # upgrade the study
+ upgrade_830(study_assets.study_dir)
+
+ # compare generaldata.ini
+ actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini")
+ actual = IniReader().read(actual_path)
+ expected_path = study_assets.expected_dir.joinpath(
+ "settings/generaldata.ini"
+ )
+ expected = IniReader().read(expected_path)
+ assert actual == expected
+
+ # compare areas
+ actual_area_path = study_assets.study_dir.joinpath("input/areas")
+ expected_area_path = study_assets.expected_dir.joinpath("input/areas")
+ assert are_same_dir(actual_area_path, expected_area_path)
diff --git a/tests/storage/study_upgrader/test_upgrade_840.py b/tests/storage/study_upgrader/test_upgrade_840.py
new file mode 100644
index 0000000000..2225dbd20c
--- /dev/null
+++ b/tests/storage/study_upgrader/test_upgrade_840.py
@@ -0,0 +1,21 @@
+from antarest.study.storage.rawstudy.io.reader import IniReader
+from antarest.study.storage.study_upgrader import upgrade_840
+from tests.storage.study_upgrader.conftest import StudyAssets
+
+
+def test_nominal_case(study_assets: StudyAssets):
+ """
+ Check that `settings/generaldata.ini` is upgraded to version 840.
+ """
+
+ # upgrade the study
+ upgrade_840(study_assets.study_dir)
+
+ # compare generaldata.ini
+ actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini")
+ actual = IniReader().read(actual_path)
+ expected_path = study_assets.expected_dir.joinpath(
+ "settings/generaldata.ini"
+ )
+ expected = IniReader().read(expected_path)
+ assert actual == expected
diff --git a/tests/storage/study_upgrader/test_upgrade_850.py b/tests/storage/study_upgrader/test_upgrade_850.py
new file mode 100644
index 0000000000..6e626450a6
--- /dev/null
+++ b/tests/storage/study_upgrader/test_upgrade_850.py
@@ -0,0 +1,22 @@
+from antarest.study.storage.rawstudy.io.reader import IniReader
+from antarest.study.storage.study_upgrader import upgrade_850
+from tests.storage.study_upgrader.conftest import StudyAssets
+
+
+# noinspection SpellCheckingInspection
+def test_nominal_case(study_assets: StudyAssets):
+ """
+ Check that `settings/generaldata.ini` is upgraded to version 850.
+ """
+
+ # upgrade the study
+ upgrade_850(study_assets.study_dir)
+
+ # compare generaldata.ini
+ actual_path = study_assets.study_dir.joinpath("settings/generaldata.ini")
+ actual = IniReader().read(actual_path)
+ expected_path = study_assets.expected_dir.joinpath(
+ "settings/generaldata.ini"
+ )
+ expected = IniReader().read(expected_path)
+ assert actual == expected
diff --git a/tests/storage/study_upgrader/upgrade_710/nominal_case/empty_study_700.expected.zip b/tests/storage/study_upgrader/upgrade_710/nominal_case/empty_study_700.expected.zip
new file mode 100644
index 0000000000..6ee11415f4
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_710/nominal_case/empty_study_700.expected.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_710/nominal_case/empty_study_700.zip b/tests/storage/study_upgrader/upgrade_710/nominal_case/empty_study_700.zip
new file mode 100644
index 0000000000..483bbcb1db
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_710/nominal_case/empty_study_700.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_720/nominal_case/empty_study_710.expected.zip b/tests/storage/study_upgrader/upgrade_720/nominal_case/empty_study_710.expected.zip
new file mode 100644
index 0000000000..6ee11415f4
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_720/nominal_case/empty_study_710.expected.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_720/nominal_case/empty_study_710.zip b/tests/storage/study_upgrader/upgrade_720/nominal_case/empty_study_710.zip
new file mode 100644
index 0000000000..6ee11415f4
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_720/nominal_case/empty_study_710.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_800/nominal_case/empty_study_720.expected.zip b/tests/storage/study_upgrader/upgrade_800/nominal_case/empty_study_720.expected.zip
new file mode 100644
index 0000000000..507d8a97f3
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_800/nominal_case/empty_study_720.expected.zip differ
diff --git a/resources/templates/empty_study_840.zip b/tests/storage/study_upgrader/upgrade_800/nominal_case/empty_study_720.zip
similarity index 83%
rename from resources/templates/empty_study_840.zip
rename to tests/storage/study_upgrader/upgrade_800/nominal_case/empty_study_720.zip
index fec7f7a7a4..b1eb6ee06f 100644
Binary files a/resources/templates/empty_study_840.zip and b/tests/storage/study_upgrader/upgrade_800/nominal_case/empty_study_720.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_810/nominal_case/empty_study_800.expected.zip b/tests/storage/study_upgrader/upgrade_810/nominal_case/empty_study_800.expected.zip
new file mode 100644
index 0000000000..4b5f52b66f
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_810/nominal_case/empty_study_800.expected.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_810/nominal_case/empty_study_800.zip b/tests/storage/study_upgrader/upgrade_810/nominal_case/empty_study_800.zip
new file mode 100644
index 0000000000..507d8a97f3
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_810/nominal_case/empty_study_800.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_820/nominal_case/little_study_810.expected.zip b/tests/storage/study_upgrader/upgrade_820/nominal_case/little_study_810.expected.zip
new file mode 100644
index 0000000000..b1aade240b
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_820/nominal_case/little_study_810.expected.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_820/nominal_case/little_study_810.zip b/tests/storage/study_upgrader/upgrade_820/nominal_case/little_study_810.zip
new file mode 100644
index 0000000000..3c0642d416
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_820/nominal_case/little_study_810.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_830/nominal_case/little_study_820.expected.zip b/tests/storage/study_upgrader/upgrade_830/nominal_case/little_study_820.expected.zip
new file mode 100644
index 0000000000..17a885d7a5
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_830/nominal_case/little_study_820.expected.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_830/nominal_case/little_study_820.zip b/tests/storage/study_upgrader/upgrade_830/nominal_case/little_study_820.zip
new file mode 100644
index 0000000000..007b06e663
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_830/nominal_case/little_study_820.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_840/nominal_case/empty_study_830.expected.zip b/tests/storage/study_upgrader/upgrade_840/nominal_case/empty_study_830.expected.zip
new file mode 100644
index 0000000000..b1e47107e1
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_840/nominal_case/empty_study_830.expected.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_840/nominal_case/empty_study_830.zip b/tests/storage/study_upgrader/upgrade_840/nominal_case/empty_study_830.zip
new file mode 100644
index 0000000000..ecced32a77
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_840/nominal_case/empty_study_830.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_850/nominal_case/empty_study_840.expected.zip b/tests/storage/study_upgrader/upgrade_850/nominal_case/empty_study_840.expected.zip
new file mode 100644
index 0000000000..a402011e16
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_850/nominal_case/empty_study_840.expected.zip differ
diff --git a/tests/storage/study_upgrader/upgrade_850/nominal_case/empty_study_840.zip b/tests/storage/study_upgrader/upgrade_850/nominal_case/empty_study_840.zip
new file mode 100644
index 0000000000..c9e017d096
Binary files /dev/null and b/tests/storage/study_upgrader/upgrade_850/nominal_case/empty_study_840.zip differ
diff --git a/tests/storage/test_model.py b/tests/storage/test_model.py
index ced31303b4..08f2e182ce 100644
--- a/tests/storage/test_model.py
+++ b/tests/storage/test_model.py
@@ -38,6 +38,7 @@ def test_file_study_tree_config_dto():
by_year=True,
error=True,
playlist=[0],
+ xpansion="",
)
},
bindings=[BindingConstraintDTO(id="b1", areas=[], clusters=[])],
diff --git a/tests/storage/test_service.py b/tests/storage/test_service.py
index 42205819ab..e5d38e2e82 100644
--- a/tests/storage/test_service.py
+++ b/tests/storage/test_service.py
@@ -1,61 +1,62 @@
+import contextlib
import os
-from datetime import datetime, timedelta
+import uuid
+from datetime import datetime, timedelta, timezone
from pathlib import Path
from typing import Union
-from unittest.mock import Mock, seal, call, ANY, patch
+from unittest.mock import ANY, Mock, call, patch, seal
from uuid import uuid4
import pytest
from antarest.core.config import Config, StorageConfig, WorkspaceConfig
from antarest.core.exceptions import TaskAlreadyRunning
-from antarest.core.filetransfer.model import FileDownloadTaskDTO, FileDownload
+from antarest.core.filetransfer.model import FileDownload, FileDownloadTaskDTO
from antarest.core.interfaces.cache import ICache
-from antarest.core.jwt import JWTUser, JWTGroup, DEFAULT_ADMIN_USER
-from antarest.core.model import JSON, SUB_JSON
-from antarest.core.permissions import (
- StudyPermissionType,
-)
-from antarest.core.requests import (
- RequestParameters,
-)
+from antarest.core.interfaces.eventbus import Event, EventType
+from antarest.core.jwt import DEFAULT_ADMIN_USER, JWTGroup, JWTUser
+from antarest.core.model import JSON, SUB_JSON, PermissionInfo
+from antarest.core.permissions import StudyPermissionType
+from antarest.core.requests import RequestParameters
from antarest.core.roles import RoleType
-from antarest.core.tasks.model import TaskType, TaskDTO, TaskStatus, TaskResult
-from antarest.login.model import User, Group, GroupDTO
+from antarest.core.tasks.model import TaskDTO, TaskStatus, TaskType
+from antarest.core.utils.fastapi_sqlalchemy import db
+from antarest.login.model import Group, GroupDTO, User
from antarest.login.service import LoginService
from antarest.matrixstore.service import MatrixService
from antarest.study.model import (
- Study,
- StudyContentStatus,
- StudyFolder,
DEFAULT_WORKSPACE_NAME,
- RawStudy,
+ ExportFormat,
+ MatrixAggregationResultDTO,
+ MatrixIndex,
+ OwnerInfo,
PublicMode,
+ RawStudy,
+ Study,
+ StudyAdditionalData,
+ StudyContentStatus,
StudyDownloadDTO,
- MatrixIndex,
+ StudyDownloadLevelDTO,
StudyDownloadType,
+ StudyFolder,
StudyMetadataDTO,
- OwnerInfo,
- StudyDownloadLevelDTO,
- ExportFormat,
- MatrixAggregationResultDTO,
TimeSerie,
TimeSeriesData,
- StudyAdditionalData,
)
from antarest.study.repository import StudyMetadataRepository
from antarest.study.service import (
+ MAX_MISSING_STUDY_TIMEOUT,
StudyService,
+ StudyUpgraderTask,
UserHasNotPermissionError,
- MAX_MISSING_STUDY_TIMEOUT,
)
from antarest.study.storage.patch_service import PatchService
from antarest.study.storage.rawstudy.model.filesystem.config.model import (
Area,
+ DistrictSet,
FileStudyTreeConfig,
- Simulation,
Link,
- DistrictSet,
+ Simulation,
)
from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy
from antarest.study.storage.rawstudy.model.filesystem.ini_file_node import (
@@ -109,6 +110,7 @@ def build_study_service(
)
+# noinspection PyArgumentList
@pytest.mark.unit_test
def test_get_studies_uuid() -> None:
bob = User(id=2, name="bob")
@@ -163,6 +165,7 @@ def study_to_dto(study: Study) -> StudyMetadataDTO:
)
+# noinspection PyArgumentList
@pytest.mark.unit_test
def test_study_listing() -> None:
bob = User(id=2, name="bob")
@@ -268,6 +271,7 @@ def test_study_listing() -> None:
assert expected_result == studies
+# noinspection PyArgumentList
@pytest.mark.unit_test
def test_sync_studies_from_disk() -> None:
now = datetime.utcnow()
@@ -333,6 +337,7 @@ def test_sync_studies_from_disk() -> None:
)
+# noinspection PyArgumentList
@pytest.mark.unit_test
def test_partial_sync_studies_from_disk() -> None:
now = datetime.utcnow()
@@ -411,6 +416,7 @@ def test_remove_duplicate() -> None:
repository.delete.assert_called_once_with(mb.id)
+# noinspection PyArgumentList
@pytest.mark.unit_test
def test_create_study() -> None:
# Mock
@@ -485,6 +491,7 @@ def test_create_study() -> None:
repository.save.assert_called_once_with(expected)
+# noinspection PyArgumentList
@pytest.mark.unit_test
def test_save_metadata() -> None:
# Mock
@@ -536,6 +543,7 @@ def test_save_metadata() -> None:
repository.save.assert_called_once_with(study)
+# noinspection PyArgumentList
@pytest.mark.unit_test
def test_download_output() -> None:
study_service = Mock()
@@ -579,6 +587,7 @@ def test_download_output() -> None:
by_year=True,
error=False,
playlist=[0],
+ xpansion="",
)
file_config = FileStudyTreeConfig(
study_path=input_study.path,
@@ -762,6 +771,7 @@ def test_download_output() -> None:
assert MatrixAggregationResultDTO.parse_raw(result.body) == res_matrix
+# noinspection PyArgumentList
@pytest.mark.unit_test
def test_change_owner() -> None:
uuid = str(uuid4())
@@ -815,6 +825,7 @@ def test_change_owner() -> None:
)
+# noinspection PyArgumentList
@pytest.mark.unit_test
def test_manage_group() -> None:
uuid = str(uuid4())
@@ -897,6 +908,7 @@ def test_manage_group() -> None:
)
+# noinspection PyArgumentList
@pytest.mark.unit_test
def test_set_public_mode() -> None:
uuid = str(uuid4())
@@ -934,6 +946,7 @@ def test_set_public_mode() -> None:
)
+# noinspection PyArgumentList
@pytest.mark.unit_test
def test_check_errors():
study_service = Mock()
@@ -980,6 +993,7 @@ def test_study_match() -> None:
)
+# noinspection PyArgumentList
@pytest.mark.unit_test
def test_assert_permission() -> None:
uuid = str(uuid4())
@@ -1106,6 +1120,7 @@ def test_delete_with_prefetch(tmp_path: Path):
Mock(),
Mock(),
)
+ # noinspection PyArgumentList
service = build_study_service(
raw_study_service,
study_metadata_repository,
@@ -1173,6 +1188,7 @@ def test_delete_with_prefetch(tmp_path: Path):
)
+# noinspection PyArgumentList
def test_delete_recursively(tmp_path: Path):
study_metadata_repository = Mock()
raw_study_service = RawStudyService(
@@ -1365,7 +1381,7 @@ def test_unarchive_output(tmp_path: Path):
service.task_service.add_worker_task.assert_called_once_with(
TaskType.UNARCHIVE,
- f"unarchive_other_workspace",
+ "unarchive_other_workspace",
ArchiveTaskArgs(
src=str(tmp_path / "output" / f"{output_id}.zip"),
dest=str(tmp_path / "output" / output_id),
@@ -1495,7 +1511,7 @@ def test_archive_output_locks(tmp_path: Path):
service.task_service.add_worker_task.assert_called_once_with(
TaskType.UNARCHIVE,
- f"unarchive_other_workspace",
+ "unarchive_other_workspace",
ArchiveTaskArgs(
src=str(tmp_path / "output" / f"{output_id}.zip"),
dest=str(tmp_path / "output" / output_id),
@@ -1648,11 +1664,13 @@ def test_task_upgrade_study(tmp_path: Path):
with pytest.raises(TaskAlreadyRunning):
service.upgrade_study(
study_id,
+ target_version="",
params=RequestParameters(user=DEFAULT_ADMIN_USER),
)
service.upgrade_study(
study_id,
+ target_version="",
params=RequestParameters(user=DEFAULT_ADMIN_USER),
)
@@ -1668,77 +1686,259 @@ def test_task_upgrade_study(tmp_path: Path):
@with_db_context
@patch("antarest.study.service.upgrade_study")
-def test_upgrade_study(upgrade_study_mock: Mock, tmp_path: Path):
- service = build_study_service(
- raw_study_service=Mock(),
- repository=Mock(),
- config=Mock(),
- )
-
- raw_study_mock = Mock(
- spec=RawStudy,
- archived=False,
- id="my_study",
- name="my_study",
- path=tmp_path,
+@pytest.mark.parametrize(
+ "workspace", ["other_workspace", DEFAULT_WORKSPACE_NAME]
+)
+def test_upgrade_study__raw_study__nominal(
+ upgrade_study_mock: Mock,
+ tmp_path: Path,
+ workspace: str,
+):
+ study_id = str(uuid.uuid4())
+ study_name = "my_study"
+ target_version = "800"
+
+ # Prepare a RAW study
+ # noinspection PyArgumentList
+ raw_study = RawStudy(
+ id=study_id,
+ name=study_name,
+ workspace=workspace,
+ path=str(tmp_path),
+ created_at=datetime.now(timezone.utc),
+ updated_at=datetime.now(timezone.utc),
version="720",
+ additional_data=StudyAdditionalData(),
+ archived=False,
owner=None,
groups=[],
public_mode=PublicMode.NONE,
- workspace="other_workspace",
)
- raw_study_mock.name = "my_study"
- service.repository.get.return_value = raw_study_mock
- study_id = "my_study"
+ # Make sure the session is closed to avoid reusing DB objects
+ with contextlib.closing(db.session):
+ db.session.add(raw_study)
+ db.session.commit()
+
+ # The `ICache` is used to invalidate the cache of the study with `invalidate_all`
+ cache_service = Mock()
+
+ # The `StudyMetadataRepository` is used to store the study in database.
+ repository = StudyMetadataRepository(cache_service)
+
+ # The `StudyStorageService` is used to retrieve:
+ # - the `RawStudyService` of a RAW study, or
+ # - the `VariantStudyService` of a variant study.
+ # It is used to `denormalize`/`normalize` the study.
+ # For a variant study, the `clear_snapshot` is also called
+ storage_service = Mock()
+
+ # The `IEventBus` service is used to send event notifications.
+ # An event of type `STUDY_EDITED` must be pushed when the upgrade is done.
+ event_bus = Mock()
- res = service._upgrade_study(
+ # Prepare the task for an upgrade
+ task = StudyUpgraderTask(
study_id,
- 800,
+ target_version,
+ repository=repository,
+ storage_service=storage_service,
+ cache_service=cache_service,
+ event_bus=event_bus,
+ )
+
+ # The task is called with a `TaskUpdateNotifier` a parameter.
+ # Some messages could be emitted using the notifier (not a requirement).
+ notifier = Mock()
+ actual = task(notifier)
+
+ # The `upgrade_study()` function must be called with the right parameters
+ upgrade_study_mock.assert_called_with(tmp_path, target_version)
+
+ # The study must be updated in the database
+ actual_study: RawStudy = db.session.query(Study).get(study_id)
+ assert actual_study is not None, "Not in database"
+ assert actual_study.version == target_version
+
+ # An event of type `STUDY_EDITED` must be pushed when the upgrade is done.
+ event = Event(
+ type=EventType.STUDY_EDITED,
+ payload={"id": study_id, "name": study_name},
+ permissions=PermissionInfo(
+ owner=None,
+ groups=[],
+ public_mode=PublicMode.NONE,
+ ),
)
+ event_bus.push.assert_called_once_with(event)
- upgrade_study_mock.assert_called_with(
- tmp_path,
- 800,
- )
- assert res == TaskResult(
- success=True,
- message=f"Sucessfuly upgraded study {raw_study_mock.name} ({study_id}) to 800",
- )
+ # The function must return a successful result
+ assert actual.success
+ assert study_id in actual.message, f"{actual.message=}"
+ assert target_version in actual.message, f"{actual.message=}"
- raw_managed_study_mock = Mock(
- spec=RawStudy,
- archived=False,
- id="my_study",
- name="my_study",
- path=tmp_path,
+
+@with_db_context
+@patch("antarest.study.service.upgrade_study")
+def test_upgrade_study__variant_study__nominal(
+ upgrade_study_mock: Mock,
+ tmp_path: Path,
+):
+ study_id = str(uuid.uuid4())
+ study_name = "my_study"
+ target_version = "800"
+
+ # Prepare a RAW study
+ # noinspection PyArgumentList
+ variant_study = VariantStudy(
+ id=study_id,
+ name=study_name,
+ path=str(tmp_path),
+ created_at=datetime.now(timezone.utc),
+ updated_at=datetime.now(timezone.utc),
version="720",
+ additional_data=StudyAdditionalData(),
+ archived=False,
owner=None,
groups=[],
public_mode=PublicMode.NONE,
- workspace=DEFAULT_WORKSPACE_NAME,
)
- raw_managed_study_mock.name = "my_study"
- service.repository.get.return_value = raw_managed_study_mock
- service.storage_service.raw_study_service.reset_mock()
- file_study = Mock()
- service.storage_service.raw_study_service.get_raw.return_value = file_study
- file_study.tree = Mock()
- study_id = "my_study"
+ # Make sure the session is closed to avoid reusing DB objects
+ with contextlib.closing(db.session):
+ db.session.add(variant_study)
+ db.session.commit()
- res = service._upgrade_study(
+ # The `ICache` is used to invalidate the cache of the study with `invalidate_all`
+ cache_service = Mock()
+
+ # The `StudyMetadataRepository` is used to store the study in database.
+ repository = StudyMetadataRepository(cache_service)
+
+ # The `StudyStorageService` is used to retrieve:
+ # - the `RawStudyService` of a RAW study, or
+ # - the `VariantStudyService` of a variant study.
+ # It is used to `denormalize`/`normalize` the study.
+ # For a variant study, the `clear_snapshot` is also called
+ storage_service = Mock()
+
+ # The `IEventBus` service is used to send event notifications.
+ # An event of type `STUDY_EDITED` must be pushed when the upgrade is done.
+ event_bus = Mock()
+
+ # Prepare the task for an upgrade
+ task = StudyUpgraderTask(
study_id,
- 800,
+ target_version,
+ repository=repository,
+ storage_service=storage_service,
+ cache_service=cache_service,
+ event_bus=event_bus,
+ )
+
+ # The task is called with a `TaskUpdateNotifier` a parameter.
+ # Some messages could be emitted using the notifier (not a requirement).
+ notifier = Mock()
+ actual = task(notifier)
+
+ # The `upgrade_study()` function is not called for a variant study.
+ upgrade_study_mock.assert_not_called()
+
+ # The study must be updated in the database
+ actual_study: RawStudy = db.session.query(Study).get(study_id)
+ assert actual_study is not None, "Not in database"
+ assert actual_study.version == target_version
+
+ # An event of type `STUDY_EDITED` must be pushed when the upgrade is done.
+ event = Event(
+ type=EventType.STUDY_EDITED,
+ payload={"id": study_id, "name": study_name},
+ permissions=PermissionInfo(
+ owner=None,
+ groups=[],
+ public_mode=PublicMode.NONE,
+ ),
)
+ event_bus.push.assert_called_once_with(event)
+
+ # The function must return a successful result
+ assert actual.success
+ assert study_id in actual.message, f"{actual.message=}"
+ assert target_version in actual.message, f"{actual.message=}"
- upgrade_study_mock.assert_called_with(
- tmp_path,
- 800,
+
+@with_db_context
+@patch("antarest.study.service.upgrade_study")
+def test_upgrade_study__raw_study__failed(
+ upgrade_study_mock: Mock, tmp_path: Path
+):
+ study_id = str(uuid.uuid4())
+ study_name = "my_study"
+ target_version = "800"
+ old_version = "720"
+
+ # Prepare a RAW study
+ # noinspection PyArgumentList
+ raw_study = RawStudy(
+ id=study_id,
+ name=study_name,
+ workspace=DEFAULT_WORKSPACE_NAME,
+ path=str(tmp_path),
+ created_at=datetime.now(timezone.utc),
+ updated_at=datetime.now(timezone.utc),
+ version=old_version,
+ additional_data=StudyAdditionalData(),
+ archived=False,
+ owner=None,
+ groups=[],
+ public_mode=PublicMode.NONE,
)
- file_study.tree.denormalize.assert_called_once()
- file_study.tree.normalize.assert_called_once()
- assert res == TaskResult(
- success=True,
- message=f"Sucessfuly upgraded study {raw_managed_study_mock.name} ({study_id}) to 800",
+
+ # Make sure the session is closed to avoid reusing DB objects
+ with contextlib.closing(db.session):
+ db.session.add(raw_study)
+ db.session.commit()
+
+ # The `ICache` is used to invalidate the cache of the study with `invalidate_all`
+ cache_service = Mock()
+
+ # The `StudyMetadataRepository` is used to store the study in database.
+ repository = StudyMetadataRepository(cache_service)
+
+ # The `StudyStorageService` is used to retrieve:
+ # - the `RawStudyService` of a RAW study, or
+ # - the `VariantStudyService` of a variant study.
+ # It is used to `denormalize`/`normalize` the study.
+ # For a variant study, the `clear_snapshot` is also called
+ storage_service = Mock()
+
+ # The `IEventBus` service is used to send event notifications.
+ # An event of type `STUDY_EDITED` must be pushed when the upgrade is done.
+ event_bus = Mock()
+
+ # The `upgrade_study()` function raise an exception
+ upgrade_study_mock.side_effect = Exception("INVALID_UPGRADE")
+
+ # Prepare the task for an upgrade
+ task = StudyUpgraderTask(
+ study_id,
+ target_version,
+ repository=repository,
+ storage_service=storage_service,
+ cache_service=cache_service,
+ event_bus=event_bus,
)
+
+ # The task is called with a `TaskUpdateNotifier` a parameter.
+ # Some messages could be emitted using the notifier (not a requirement).
+ notifier = Mock()
+ with pytest.raises(Exception, match="INVALID_UPGRADE"):
+ task(notifier)
+
+ # The study must not be updated in the database
+ actual_study: RawStudy = db.session.query(Study).get(study_id)
+ assert actual_study is not None, "Not in database"
+ assert actual_study.version == old_version
+
+ # No event must be emitted
+ event_bus.push.assert_not_called()
diff --git a/tests/storage/web/test_studies_bp.py b/tests/storage/web/test_studies_bp.py
index bd589e684e..2d99096d2f 100644
--- a/tests/storage/web/test_studies_bp.py
+++ b/tests/storage/web/test_studies_bp.py
@@ -1,51 +1,47 @@
import io
import shutil
+import uuid
from datetime import datetime
from http import HTTPStatus
from pathlib import Path
from unittest.mock import Mock, call
import pytest
-from fastapi import FastAPI
-from markupsafe import Markup
-from starlette.testclient import TestClient
-
from antarest.core.config import (
Config,
SecurityConfig,
StorageConfig,
WorkspaceConfig,
)
-from antarest.core.exceptions import (
- UrlNotMatchJsonDataError,
-)
+from antarest.core.exceptions import UrlNotMatchJsonDataError
from antarest.core.filetransfer.model import (
- FileDownloadTaskDTO,
FileDownloadDTO,
+ FileDownloadTaskDTO,
)
-from antarest.core.jwt import JWTUser, JWTGroup
-from antarest.core.requests import (
- RequestParameters,
-)
+from antarest.core.jwt import JWTGroup, JWTUser
+from antarest.core.requests import RequestParameters
from antarest.core.roles import RoleType
from antarest.matrixstore.service import MatrixService
from antarest.study.main import build_study_service
from antarest.study.model import (
DEFAULT_WORKSPACE_NAME,
+ STUDY_REFERENCE_TEMPLATES,
+ MatrixAggregationResultDTO,
+ MatrixIndex,
+ OwnerInfo,
PublicMode,
StudyDownloadDTO,
- MatrixIndex,
- StudySimResultDTO,
- StudySimSettingsDTO,
- STUDY_REFERENCE_TEMPLATES,
- StudyDownloadType,
StudyDownloadLevelDTO,
+ StudyDownloadType,
StudyMetadataDTO,
- OwnerInfo,
- MatrixAggregationResultDTO,
+ StudySimResultDTO,
+ StudySimSettingsDTO,
TimeSerie,
TimeSeriesData,
)
+from fastapi import FastAPI
+from markupsafe import Markup
+from starlette.testclient import TestClient
from tests.storage.conftest import SimpleFileTransferManager
ADMIN = JWTUser(
@@ -107,10 +103,10 @@ def test_404() -> None:
)
client = TestClient(app, raise_server_exceptions=False)
result = client.get("/v1/studies/study1/raw?path=settings/general/params")
- assert result.status_code == 404
+ assert result.status_code == HTTPStatus.NOT_FOUND
result = client.get("/v1/studies/WRONG_STUDY/raw")
- assert result.status_code == 404
+ assert result.status_code == HTTPStatus.NOT_FOUND
@pytest.mark.unit_test
@@ -134,16 +130,16 @@ def test_server_with_parameters() -> None:
parameters = RequestParameters(user=ADMIN)
- assert result.status_code == 200
+ assert result.status_code == HTTPStatus.OK
mock_storage_service.get.assert_called_once_with(
"study1", "/", 4, True, parameters
)
result = client.get("/v1/studies/study2/raw?depth=WRONG_TYPE")
-
- assert result.status_code == 422
+ assert result.status_code == HTTPStatus.UNPROCESSABLE_ENTITY
result = client.get("/v1/studies/study2/raw")
+ assert result.status_code == HTTPStatus.OK
excepted_parameters = RequestParameters(user=ADMIN)
mock_storage_service.get.assert_called_with(
@@ -176,7 +172,7 @@ def test_create_study(tmp_path: str, project_path) -> None:
result_right = client.post("/v1/studies?name=study2")
- assert result_right.status_code == HTTPStatus.CREATED.value
+ assert result_right.status_code == HTTPStatus.CREATED
assert result_right.json() == "my-uuid"
storage_service.create_study.assert_called_once_with(
"study2", "", [], PARAMS
@@ -185,19 +181,18 @@ def test_create_study(tmp_path: str, project_path) -> None:
@pytest.mark.unit_test
def test_import_study_zipped(tmp_path: Path, project_path) -> None:
- tmp_path /= "tmp"
- tmp_path.mkdir()
study_name = "study1"
path_study = tmp_path / study_name
path_study.mkdir()
path_file = path_study / "study.antares"
path_file.write_text("[antares]")
- shutil.make_archive(path_study, "zip", path_study)
+ shutil.make_archive(str(path_study), "zip", path_study)
path_zip = tmp_path / "study1.zip"
mock_storage_service = Mock()
- mock_storage_service.import_study.return_value = study_name
+ study_uuid = str(uuid.uuid4())
+ mock_storage_service.import_study.return_value = study_uuid
app = FastAPI(title=__name__)
build_study_service(
@@ -214,13 +209,13 @@ def test_import_study_zipped(tmp_path: Path, project_path) -> None:
result = client.post("/v1/studies")
- assert result.status_code == HTTPStatus.UNPROCESSABLE_ENTITY.value
+ assert result.status_code == HTTPStatus.UNPROCESSABLE_ENTITY
study_data = io.BytesIO(path_zip.read_bytes())
result = client.post("/v1/studies/_import", files={"study": study_data})
- assert result.json() == study_name
- assert result.status_code == HTTPStatus.CREATED.value
+ assert result.json() == study_uuid
+ assert result.status_code == HTTPStatus.CREATED
mock_storage_service.import_study.assert_called_once()
@@ -252,7 +247,7 @@ def test_copy_study(tmp_path: Path) -> None:
use_task=True,
params=PARAMS,
)
- assert result.status_code == HTTPStatus.CREATED.value
+ assert result.status_code == HTTPStatus.CREATED
@pytest.mark.unit_test
@@ -435,10 +430,12 @@ def test_delete_study() -> None:
matrix_service=Mock(spec=MatrixService),
)
client = TestClient(app)
- client.delete("/v1/studies/name")
+
+ study_uuid = "8319b5f8-2a35-4984-9ace-2ab072bd6eef"
+ client.delete(f"/v1/studies/{study_uuid}")
mock_storage_service.delete_study.assert_called_once_with(
- "name", False, PARAMS
+ study_uuid, False, PARAMS
)
@@ -606,13 +603,13 @@ def test_output_whole_download(tmp_path: Path) -> None:
res = client.get(
f"/v1/studies/my-uuid/outputs/{output_id}/export",
)
- assert res.status_code == 200
+ assert res.status_code == HTTPStatus.OK
@pytest.mark.unit_test
def test_sim_reference() -> None:
mock_service = Mock()
- study_id = "my-study-id"
+ study_id = str(uuid.uuid4())
output_id = "my-output-id"
app = FastAPI(title=__name__)
@@ -631,22 +628,22 @@ def test_sim_reference() -> None:
mock_service.set_sim_reference.assert_called_once_with(
study_id, output_id, True, PARAMS
)
- assert res.status_code == 200
+ assert res.status_code == HTTPStatus.OK
assert res.json() == ""
@pytest.mark.unit_test
def test_sim_result() -> None:
mock_service = Mock()
- study_id = "my-study-id"
+ study_id = str(uuid.uuid4())
settings = StudySimSettingsDTO(
- general=dict(),
- input=dict(),
- output=dict(),
- optimization=dict(),
- otherPreferences=dict(),
- advancedParameters=dict(),
- seedsMersenneTwister=dict(),
+ general={},
+ input={},
+ output={},
+ optimization={},
+ otherPreferences={},
+ advancedParameters={},
+ seedsMersenneTwister={},
)
result_data = [
StudySimResultDTO(
@@ -700,7 +697,7 @@ def test_study_permission_management(tmp_path: Path) -> None:
2,
PARAMS,
)
- assert result.status_code == HTTPStatus.OK.value
+ assert result.status_code == HTTPStatus.OK
result = client.put("/v1/studies/existing-study/groups/group-a")
storage_service.add_group.assert_called_with(
@@ -708,7 +705,7 @@ def test_study_permission_management(tmp_path: Path) -> None:
"group-a",
PARAMS,
)
- assert result.status_code == HTTPStatus.OK.value
+ assert result.status_code == HTTPStatus.OK
result = client.delete("/v1/studies/existing-study/groups/group-b")
storage_service.remove_group.assert_called_with(
@@ -716,7 +713,7 @@ def test_study_permission_management(tmp_path: Path) -> None:
"group-b",
PARAMS,
)
- assert result.status_code == HTTPStatus.OK.value
+ assert result.status_code == HTTPStatus.OK
result = client.put("/v1/studies/existing-study/public_mode/FULL")
storage_service.set_public_mode.assert_called_with(
@@ -724,10 +721,10 @@ def test_study_permission_management(tmp_path: Path) -> None:
PublicMode.FULL,
PARAMS,
)
- assert result.status_code == HTTPStatus.OK.value
+ assert result.status_code == HTTPStatus.OK
result = client.put("/v1/studies/existing-study/public_mode/UNKNOWN")
- assert result.status_code == HTTPStatus.UNPROCESSABLE_ENTITY.value
+ assert result.status_code == HTTPStatus.UNPROCESSABLE_ENTITY
@pytest.mark.unit_test
diff --git a/tests/integration/test_integration_table_mode_manager.py b/tests/study/storage/__init__.py
similarity index 100%
rename from tests/integration/test_integration_table_mode_manager.py
rename to tests/study/storage/__init__.py
diff --git a/tests/study/storage/test_study_version_upgrader.py b/tests/study/storage/test_study_version_upgrader.py
new file mode 100644
index 0000000000..9c1ac2d74c
--- /dev/null
+++ b/tests/study/storage/test_study_version_upgrader.py
@@ -0,0 +1,119 @@
+from pathlib import Path
+
+import pytest
+
+from antarest.core.exceptions import StudyValidationError
+from antarest.study.storage.study_upgrader import (
+ InvalidUpgrade,
+ UPGRADE_METHODS,
+)
+from antarest.study.storage.study_upgrader import (
+ can_upgrade_version,
+ find_next_version,
+ get_current_version,
+)
+
+
+class TestFindNextVersion:
+ @pytest.mark.parametrize(
+ "from_version, expected",
+ [
+ (UPGRADE_METHODS[0].old, UPGRADE_METHODS[0].new),
+ (UPGRADE_METHODS[-1].old, UPGRADE_METHODS[-1].new),
+ (UPGRADE_METHODS[-1].new, ""),
+ ("3.14", ""),
+ ],
+ )
+ def test_find_next_version(self, from_version: str, expected: str):
+ actual = find_next_version(from_version)
+ assert actual == expected
+
+
+class TestCanUpgradeVersion:
+ @pytest.mark.parametrize(
+ "from_version, to_version",
+ [
+ pytest.param("700", "710"),
+ pytest.param(
+ "123",
+ "123",
+ marks=pytest.mark.xfail(
+ reason="same versions",
+ raises=InvalidUpgrade,
+ strict=True,
+ ),
+ ),
+ pytest.param(
+ "000",
+ "123",
+ marks=pytest.mark.xfail(
+ reason="version '000' not in 'old' versions",
+ raises=InvalidUpgrade,
+ strict=True,
+ ),
+ ),
+ pytest.param(
+ "700",
+ "999",
+ marks=pytest.mark.xfail(
+ reason="version '999' not in 'new' versions",
+ raises=InvalidUpgrade,
+ strict=True,
+ ),
+ ),
+ pytest.param(
+ "720",
+ "710",
+ marks=pytest.mark.xfail(
+ reason="versions inverted",
+ raises=InvalidUpgrade,
+ strict=True,
+ ),
+ ),
+ pytest.param(
+ 800,
+ "456",
+ marks=pytest.mark.xfail(
+ reason="integer version 800 not in 'old' versions",
+ raises=InvalidUpgrade,
+ strict=True,
+ ),
+ ),
+ pytest.param(
+ "700",
+ 800,
+ marks=pytest.mark.xfail(
+ reason="integer version 800 not in 'new' versions",
+ raises=InvalidUpgrade,
+ strict=True,
+ ),
+ ),
+ ],
+ )
+ def test_can_upgrade_version(self, from_version: str, to_version: str):
+ can_upgrade_version(from_version, to_version)
+
+
+class TestGetCurrentVersion:
+ @pytest.mark.parametrize(
+ "version",
+ [
+ pytest.param("710"),
+ pytest.param(" 71"),
+ pytest.param(" 7.1 "),
+ pytest.param(
+ "",
+ marks=pytest.mark.xfail(
+ reason="empty version",
+ raises=StudyValidationError,
+ strict=True,
+ ),
+ ),
+ ],
+ )
+ def test_get_current_version(self, tmp_path: Path, version: str):
+ # prepare the "study.antares" file
+ study_antares_path = tmp_path.joinpath("study.antares")
+ study_antares_path.write_text(f"version = {version}", encoding="utf-8")
+ actual = get_current_version(tmp_path)
+ assert actual == version.strip(), f"{actual=}"
diff --git a/tests/test_resources.py b/tests/test_resources.py
new file mode 100644
index 0000000000..2d401a3f99
--- /dev/null
+++ b/tests/test_resources.py
@@ -0,0 +1,87 @@
+import pathlib
+import zipfile
+from typing import Sequence
+
+import pytest
+
+# fmt: off
+HERE = pathlib.Path(__file__).parent.resolve()
+PROJECT_DIR = next(iter(p for p in HERE.parents if p.joinpath("antarest").exists()))
+RESOURCES_DIR = PROJECT_DIR.joinpath("resources")
+# fmt: on
+
+# All ZIP files have the same file tree structure because empty studies are similar.
+# There are only real differences when the user sets up the study or runs simulations
+# (e.g. the outputs are different).
+STUDY_FILES = [
+ "Desktop.ini",
+ "input/",
+ "input/areas/",
+ "input/areas/list.txt",
+ "input/areas/sets.ini",
+ "input/bindingconstraints/",
+ "input/bindingconstraints/bindingconstraints.ini",
+ "input/hydro/",
+ "input/hydro/allocation/",
+ "input/hydro/common/",
+ "input/hydro/common/capacity/",
+ "input/hydro/hydro.ini",
+ "input/hydro/prepro/",
+ "input/hydro/prepro/correlation.ini",
+ "input/hydro/series/",
+ "input/links/",
+ "input/load/",
+ "input/load/prepro/",
+ "input/load/prepro/correlation.ini",
+ "input/load/series/",
+ "input/misc-gen/",
+ "input/reserves/",
+ "input/solar/",
+ "input/solar/prepro/",
+ "input/solar/prepro/correlation.ini",
+ "input/solar/series/",
+ "input/thermal/",
+ "input/thermal/areas.ini",
+ "input/thermal/clusters/",
+ "input/thermal/prepro/",
+ "input/thermal/series/",
+ "input/wind/",
+ "input/wind/prepro/",
+ "input/wind/prepro/correlation.ini",
+ "input/wind/series/",
+ "layers/",
+ "layers/layers.ini",
+ "logs/",
+ "output/",
+ "settings/",
+ "settings/comments.txt",
+ "settings/generaldata.ini",
+ "settings/resources/",
+ "settings/resources/study.ico",
+ "settings/scenariobuilder.dat",
+ "settings/simulations/",
+ "study.antares",
+ "user/",
+]
+
+
+@pytest.mark.parametrize(
+ "filename, expected_list",
+ [
+ ("empty_study_850.zip", STUDY_FILES),
+ ("empty_study_840.zip", STUDY_FILES),
+ ("empty_study_830.zip", STUDY_FILES),
+ ("empty_study_820.zip", STUDY_FILES),
+ ("empty_study_810.zip", STUDY_FILES),
+ ("empty_study_803.zip", STUDY_FILES),
+ ("empty_study_720.zip", STUDY_FILES),
+ ("empty_study_710.zip", STUDY_FILES),
+ ("empty_study_700.zip", STUDY_FILES),
+ ("empty_study_613.zip", STUDY_FILES),
+ ],
+)
+def test_empty_study_zip(filename: str, expected_list: Sequence[str]):
+ resource_path = RESOURCES_DIR.joinpath(filename)
+ with zipfile.ZipFile(resource_path) as myzip:
+ actual = sorted(myzip.namelist())
+ assert actual == expected_list
diff --git a/tests/variantstudy/model/command/test_manage_district.py b/tests/variantstudy/model/command/test_manage_district.py
index c0dc564f8e..7890e65b12 100644
--- a/tests/variantstudy/model/command/test_manage_district.py
+++ b/tests/variantstudy/model/command/test_manage_district.py
@@ -1,9 +1,5 @@
-from unittest.mock import patch
-
from antarest.study.storage.rawstudy.io.reader import MultipleSameKeysIniReader
-from antarest.study.storage.rawstudy.model.filesystem.config.files import (
- ConfigPathBuilder,
-)
+from antarest.study.storage.rawstudy.model.filesystem.config.files import build
from antarest.study.storage.rawstudy.model.filesystem.config.model import (
transform_name_to_id,
)
@@ -145,7 +141,7 @@ def test_manage_district(
)
assert not output_d3.status
- read_config = ConfigPathBuilder.build(empty_study.config.study_path, "")
+ read_config = build(empty_study.config.study_path, "")
assert len(read_config.sets.keys()) == 4
remove_district3_command: ICommand = RemoveDistrict(
diff --git a/tests/variantstudy/model/command/test_remove_link.py b/tests/variantstudy/model/command/test_remove_link.py
index 75a27e870b..324dc4c94b 100644
--- a/tests/variantstudy/model/command/test_remove_link.py
+++ b/tests/variantstudy/model/command/test_remove_link.py
@@ -7,9 +7,7 @@
import pytest
from checksumdir import dirhash
-from antarest.study.storage.rawstudy.model.filesystem.config.files import (
- ConfigPathBuilder,
-)
+from antarest.study.storage.rawstudy.model.filesystem.config.files import build
from antarest.study.storage.rawstudy.model.filesystem.config.model import (
transform_name_to_id,
)
@@ -51,7 +49,7 @@ def make_study(tmpdir: Path, version: int) -> FileStudy:
os.mkdir(study_path)
with ZipFile(study_dir) as zip_output:
zip_output.extractall(path=study_path)
- config = ConfigPathBuilder.build(study_path, "1")
+ config = build(study_path, "1")
return FileStudy(config, FileStudyTree(Mock(), config))
@pytest.mark.parametrize("version", [(810), (820)])
diff --git a/tests/worker/test_worker.py b/tests/worker/test_worker.py
index 131df98014..0d47d23d22 100644
--- a/tests/worker/test_worker.py
+++ b/tests/worker/test_worker.py
@@ -1,13 +1,15 @@
+import time
from pathlib import Path
from typing import List
from unittest.mock import MagicMock
from antarest.core.config import Config
-from antarest.core.interfaces.eventbus import IEventBus, Event, EventType
+from antarest.core.interfaces.eventbus import Event, EventType, IEventBus
+from antarest.core.model import PermissionInfo, PublicMode
from antarest.core.tasks.model import TaskResult
from antarest.eventbus.main import build_eventbus
from antarest.worker.worker import AbstractWorker, WorkerTaskCommand
-from tests.conftest import autoretry_assert
+from tests.conftest import auto_retry_assert
class DummyWorker(AbstractWorker):
@@ -18,6 +20,8 @@ def __init__(
self.tmp_path = tmp_path
def execute_task(self, task_info: WorkerTaskCommand) -> TaskResult:
+ # simulate a "long" task ;-)
+ time.sleep(0.01)
relative_path = task_info.task_args["file"]
(self.tmp_path / relative_path).touch()
return TaskResult(success=True, message="")
@@ -34,13 +38,30 @@ def test_simple_task(tmp_path: Path):
task_id="some task",
task_args={"file": "foo"},
),
+ permissions=PermissionInfo(public_mode=PublicMode.READ),
),
task_queue,
)
- assert not (tmp_path / "foo").exists()
+ # Add some listeners to debug the event bus notifications
+ msg = []
+ async def notify(event: Event):
+ msg.append(event.type.value)
+
+ event_bus.add_listener(notify, [EventType.WORKER_TASK_STARTED])
+ event_bus.add_listener(notify, [EventType.WORKER_TASK_ENDED])
+
+ # Initialize and start a worker
worker = DummyWorker(event_bus, [task_queue], tmp_path)
- worker.start(threaded=True)
+ worker.start()
+
+ # Wait for the end of the processing
+ # Set a big value to `timeout` if you want to debug the worker
+ auto_retry_assert(lambda: (tmp_path / "foo").exists(), timeout=60)
+
+ # Wait a short time to allow the event bus to have the opportunity
+ # to process the notification of the end event.
+ time.sleep(0.1)
- autoretry_assert(lambda: (tmp_path / "foo").exists(), 2)
+ assert msg == ["WORKER_TASK_STARTED", "WORKER_TASK_ENDED"]
diff --git a/webapp/.gitignore b/webapp/.gitignore
index 8c83629c66..7c8c611439 100644
--- a/webapp/.gitignore
+++ b/webapp/.gitignore
@@ -4,7 +4,6 @@
/node_modules
/.pnp
.pnp.js
-package-lock.json
# testing
/coverage
diff --git a/webapp/package-lock.json b/webapp/package-lock.json
new file mode 100644
index 0000000000..180c77d5f1
--- /dev/null
+++ b/webapp/package-lock.json
@@ -0,0 +1,16856 @@
+{
+ "name": "antares-web",
+ "version": "2.13.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@apideck/better-ajv-errors": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz",
+ "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==",
+ "requires": {
+ "json-schema": "^0.4.0",
+ "jsonpointer": "^5.0.0",
+ "leven": "^3.1.0"
+ }
+ },
+ "@babel/code-frame": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "requires": {
+ "@babel/highlight": "^7.18.6"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz",
+ "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g=="
+ },
+ "@babel/core": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz",
+ "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==",
+ "requires": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.21.0",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-module-transforms": "^7.21.0",
+ "@babel/helpers": "^7.21.0",
+ "@babel/parser": "^7.21.0",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.21.0",
+ "@babel/types": "^7.21.0",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.2",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "@babel/eslint-parser": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz",
+ "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==",
+ "requires": {
+ "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
+ "eslint-visitor-keys": "^2.1.0",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "@babel/generator": {
+ "version": "7.21.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz",
+ "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
+ "requires": {
+ "@babel/types": "^7.21.0",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ },
+ "dependencies": {
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ }
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz",
+ "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==",
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz",
+ "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==",
+ "requires": {
+ "@babel/helper-explode-assignable-expression": "^7.18.6",
+ "@babel/types": "^7.18.9"
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+ "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
+ "requires": {
+ "@babel/compat-data": "^7.20.5",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.21.3",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "@babel/helper-create-class-features-plugin": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz",
+ "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.21.0",
+ "@babel/helper-member-expression-to-functions": "^7.21.0",
+ "@babel/helper-optimise-call-expression": "^7.18.6",
+ "@babel/helper-replace-supers": "^7.20.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/helper-split-export-declaration": "^7.18.6"
+ }
+ },
+ "@babel/helper-create-regexp-features-plugin": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz",
+ "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "regexpu-core": "^5.3.1"
+ }
+ },
+ "@babel/helper-define-polyfill-provider": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz",
+ "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==",
+ "requires": {
+ "@babel/helper-compilation-targets": "^7.17.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2",
+ "semver": "^6.1.2"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "@babel/helper-environment-visitor": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
+ "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg=="
+ },
+ "@babel/helper-explode-assignable-expression": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz",
+ "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==",
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
+ "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
+ "requires": {
+ "@babel/template": "^7.20.7",
+ "@babel/types": "^7.21.0"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+ "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz",
+ "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==",
+ "requires": {
+ "@babel/types": "^7.21.0"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+ "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.0.tgz",
+ "integrity": "sha512-eD/JQ21IG2i1FraJnTMbUarAUkA7G988ofehG5MDCRXaUU91rEBJuCeSoou2Sk1y4RbLYXzqEg1QLwEmRU4qcQ==",
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.20.2",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.21.0",
+ "@babel/types": "^7.21.0"
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz",
+ "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==",
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
+ "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ=="
+ },
+ "@babel/helper-remap-async-to-generator": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz",
+ "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-wrap-function": "^7.18.9",
+ "@babel/types": "^7.18.9"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz",
+ "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==",
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-member-expression-to-functions": "^7.20.7",
+ "@babel/helper-optimise-call-expression": "^7.18.6",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.7",
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+ "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+ "requires": {
+ "@babel/types": "^7.20.2"
+ }
+ },
+ "@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz",
+ "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==",
+ "requires": {
+ "@babel/types": "^7.20.0"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+ "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-string-parser": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw=="
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
+ "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ=="
+ },
+ "@babel/helper-wrap-function": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz",
+ "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==",
+ "requires": {
+ "@babel/helper-function-name": "^7.19.0",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.5",
+ "@babel/types": "^7.20.5"
+ }
+ },
+ "@babel/helpers": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
+ "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
+ "requires": {
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.21.0",
+ "@babel/types": "^7.21.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.21.1",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.1.tgz",
+ "integrity": "sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg=="
+ },
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz",
+ "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz",
+ "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/plugin-proposal-optional-chaining": "^7.20.7"
+ }
+ },
+ "@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz",
+ "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==",
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-remap-async-to-generator": "^7.18.9",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ }
+ },
+ "@babel/plugin-proposal-class-properties": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-proposal-class-static-block": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz",
+ "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.21.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-decorators": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz",
+ "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.21.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-replace-supers": "^7.20.7",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/plugin-syntax-decorators": "^7.21.0"
+ }
+ },
+ "@babel/plugin-proposal-dynamic-import": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz",
+ "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-export-namespace-from": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz",
+ "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.9",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-json-strings": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz",
+ "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz",
+ "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
+ "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-numeric-separator": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
+ "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz",
+ "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
+ "requires": {
+ "@babel/compat-data": "^7.20.5",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.20.7"
+ }
+ },
+ "@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz",
+ "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-optional-chaining": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
+ "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-private-methods": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz",
+ "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz",
+ "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-create-class-features-plugin": "^7.21.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz",
+ "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==",
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-decorators": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz",
+ "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ }
+ },
+ "@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ }
+ },
+ "@babel/plugin-syntax-flow": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz",
+ "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-syntax-import-assertions": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz",
+ "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.19.0"
+ }
+ },
+ "@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-jsx": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
+ "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-typescript": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz",
+ "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.19.0"
+ }
+ },
+ "@babel/plugin-transform-arrow-functions": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz",
+ "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ }
+ },
+ "@babel/plugin-transform-async-to-generator": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz",
+ "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-remap-async-to-generator": "^7.18.9"
+ }
+ },
+ "@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz",
+ "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-block-scoping": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz",
+ "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ }
+ },
+ "@babel/plugin-transform-classes": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz",
+ "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.21.0",
+ "@babel/helper-optimise-call-expression": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-replace-supers": "^7.20.7",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/plugin-transform-computed-properties": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz",
+ "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/template": "^7.20.7"
+ }
+ },
+ "@babel/plugin-transform-destructuring": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz",
+ "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ }
+ },
+ "@babel/plugin-transform-dotall-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz",
+ "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==",
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-duplicate-keys": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz",
+ "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.9"
+ }
+ },
+ "@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz",
+ "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==",
+ "requires": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-flow-strip-types": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz",
+ "integrity": "sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-flow": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-for-of": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz",
+ "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ }
+ },
+ "@babel/plugin-transform-function-name": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz",
+ "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==",
+ "requires": {
+ "@babel/helper-compilation-targets": "^7.18.9",
+ "@babel/helper-function-name": "^7.18.9",
+ "@babel/helper-plugin-utils": "^7.18.9"
+ }
+ },
+ "@babel/plugin-transform-literals": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz",
+ "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.9"
+ }
+ },
+ "@babel/plugin-transform-member-expression-literals": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz",
+ "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-modules-amd": {
+ "version": "7.20.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz",
+ "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==",
+ "requires": {
+ "@babel/helper-module-transforms": "^7.20.11",
+ "@babel/helper-plugin-utils": "^7.20.2"
+ }
+ },
+ "@babel/plugin-transform-modules-commonjs": {
+ "version": "7.20.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz",
+ "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==",
+ "requires": {
+ "@babel/helper-module-transforms": "^7.20.11",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-simple-access": "^7.20.2"
+ }
+ },
+ "@babel/plugin-transform-modules-systemjs": {
+ "version": "7.20.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz",
+ "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==",
+ "requires": {
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-module-transforms": "^7.20.11",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-validator-identifier": "^7.19.1"
+ }
+ },
+ "@babel/plugin-transform-modules-umd": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz",
+ "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==",
+ "requires": {
+ "@babel/helper-module-transforms": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz",
+ "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==",
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.20.5",
+ "@babel/helper-plugin-utils": "^7.20.2"
+ }
+ },
+ "@babel/plugin-transform-new-target": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz",
+ "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-object-super": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz",
+ "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/helper-replace-supers": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-parameters": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz",
+ "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ }
+ },
+ "@babel/plugin-transform-property-literals": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz",
+ "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-react-constant-elements": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz",
+ "integrity": "sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ }
+ },
+ "@babel/plugin-transform-react-display-name": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz",
+ "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-react-jsx": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz",
+ "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-jsx": "^7.18.6",
+ "@babel/types": "^7.21.0"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-development": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz",
+ "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==",
+ "requires": {
+ "@babel/plugin-transform-react-jsx": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz",
+ "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-regenerator": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz",
+ "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "regenerator-transform": "^0.15.1"
+ }
+ },
+ "@babel/plugin-transform-reserved-words": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz",
+ "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-runtime": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz",
+ "integrity": "sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "babel-plugin-polyfill-corejs2": "^0.3.3",
+ "babel-plugin-polyfill-corejs3": "^0.6.0",
+ "babel-plugin-polyfill-regenerator": "^0.4.1",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "@babel/plugin-transform-shorthand-properties": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz",
+ "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-spread": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz",
+ "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0"
+ }
+ },
+ "@babel/plugin-transform-sticky-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz",
+ "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-template-literals": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz",
+ "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.9"
+ }
+ },
+ "@babel/plugin-transform-typeof-symbol": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz",
+ "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.9"
+ }
+ },
+ "@babel/plugin-transform-typescript": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz",
+ "integrity": "sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.21.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-typescript": "^7.20.0"
+ }
+ },
+ "@babel/plugin-transform-unicode-escapes": {
+ "version": "7.18.10",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz",
+ "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.9"
+ }
+ },
+ "@babel/plugin-transform-unicode-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz",
+ "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==",
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/preset-env": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz",
+ "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==",
+ "requires": {
+ "@babel/compat-data": "^7.20.1",
+ "@babel/helper-compilation-targets": "^7.20.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-validator-option": "^7.18.6",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9",
+ "@babel/plugin-proposal-async-generator-functions": "^7.20.1",
+ "@babel/plugin-proposal-class-properties": "^7.18.6",
+ "@babel/plugin-proposal-class-static-block": "^7.18.6",
+ "@babel/plugin-proposal-dynamic-import": "^7.18.6",
+ "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
+ "@babel/plugin-proposal-json-strings": "^7.18.6",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
+ "@babel/plugin-proposal-numeric-separator": "^7.18.6",
+ "@babel/plugin-proposal-object-rest-spread": "^7.20.2",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
+ "@babel/plugin-proposal-optional-chaining": "^7.18.9",
+ "@babel/plugin-proposal-private-methods": "^7.18.6",
+ "@babel/plugin-proposal-private-property-in-object": "^7.18.6",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.18.6",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-import-assertions": "^7.20.0",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-transform-arrow-functions": "^7.18.6",
+ "@babel/plugin-transform-async-to-generator": "^7.18.6",
+ "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
+ "@babel/plugin-transform-block-scoping": "^7.20.2",
+ "@babel/plugin-transform-classes": "^7.20.2",
+ "@babel/plugin-transform-computed-properties": "^7.18.9",
+ "@babel/plugin-transform-destructuring": "^7.20.2",
+ "@babel/plugin-transform-dotall-regex": "^7.18.6",
+ "@babel/plugin-transform-duplicate-keys": "^7.18.9",
+ "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
+ "@babel/plugin-transform-for-of": "^7.18.8",
+ "@babel/plugin-transform-function-name": "^7.18.9",
+ "@babel/plugin-transform-literals": "^7.18.9",
+ "@babel/plugin-transform-member-expression-literals": "^7.18.6",
+ "@babel/plugin-transform-modules-amd": "^7.19.6",
+ "@babel/plugin-transform-modules-commonjs": "^7.19.6",
+ "@babel/plugin-transform-modules-systemjs": "^7.19.6",
+ "@babel/plugin-transform-modules-umd": "^7.18.6",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1",
+ "@babel/plugin-transform-new-target": "^7.18.6",
+ "@babel/plugin-transform-object-super": "^7.18.6",
+ "@babel/plugin-transform-parameters": "^7.20.1",
+ "@babel/plugin-transform-property-literals": "^7.18.6",
+ "@babel/plugin-transform-regenerator": "^7.18.6",
+ "@babel/plugin-transform-reserved-words": "^7.18.6",
+ "@babel/plugin-transform-shorthand-properties": "^7.18.6",
+ "@babel/plugin-transform-spread": "^7.19.0",
+ "@babel/plugin-transform-sticky-regex": "^7.18.6",
+ "@babel/plugin-transform-template-literals": "^7.18.9",
+ "@babel/plugin-transform-typeof-symbol": "^7.18.9",
+ "@babel/plugin-transform-unicode-escapes": "^7.18.10",
+ "@babel/plugin-transform-unicode-regex": "^7.18.6",
+ "@babel/preset-modules": "^0.1.5",
+ "@babel/types": "^7.20.2",
+ "babel-plugin-polyfill-corejs2": "^0.3.3",
+ "babel-plugin-polyfill-corejs3": "^0.6.0",
+ "babel-plugin-polyfill-regenerator": "^0.4.1",
+ "core-js-compat": "^3.25.1",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "@babel/preset-modules": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
+ "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ }
+ },
+ "@babel/preset-react": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz",
+ "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/helper-validator-option": "^7.18.6",
+ "@babel/plugin-transform-react-display-name": "^7.18.6",
+ "@babel/plugin-transform-react-jsx": "^7.18.6",
+ "@babel/plugin-transform-react-jsx-development": "^7.18.6",
+ "@babel/plugin-transform-react-pure-annotations": "^7.18.6"
+ }
+ },
+ "@babel/preset-typescript": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz",
+ "integrity": "sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-validator-option": "^7.21.0",
+ "@babel/plugin-transform-typescript": "^7.21.0"
+ }
+ },
+ "@babel/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
+ },
+ "@babel/runtime": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
+ "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
+ "requires": {
+ "regenerator-runtime": "^0.13.11"
+ }
+ },
+ "@babel/runtime-corejs3": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz",
+ "integrity": "sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==",
+ "requires": {
+ "core-js-pure": "^3.25.1",
+ "regenerator-runtime": "^0.13.11"
+ }
+ },
+ "@babel/template": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+ "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
+ "requires": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.0.tgz",
+ "integrity": "sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA==",
+ "requires": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.21.0",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.21.0",
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/parser": "^7.21.0",
+ "@babel/types": "^7.21.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/types": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.0.tgz",
+ "integrity": "sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==",
+ "requires": {
+ "@babel/helper-string-parser": "^7.19.4",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
+ },
+ "@braintree/sanitize-url": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz",
+ "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w=="
+ },
+ "@choojs/findup": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz",
+ "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==",
+ "requires": {
+ "commander": "^2.15.1"
+ }
+ },
+ "@csstools/normalize.css": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz",
+ "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg=="
+ },
+ "@csstools/postcss-cascade-layers": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz",
+ "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==",
+ "requires": {
+ "@csstools/selector-specificity": "^2.0.2",
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "@csstools/postcss-color-function": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz",
+ "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==",
+ "requires": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "@csstools/postcss-font-format-keywords": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz",
+ "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "@csstools/postcss-hwb-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz",
+ "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "@csstools/postcss-ic-unit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz",
+ "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==",
+ "requires": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "@csstools/postcss-is-pseudo-class": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz",
+ "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==",
+ "requires": {
+ "@csstools/selector-specificity": "^2.0.0",
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "@csstools/postcss-nested-calc": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz",
+ "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "@csstools/postcss-normalize-display-values": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz",
+ "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "@csstools/postcss-oklab-function": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz",
+ "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==",
+ "requires": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "@csstools/postcss-progressive-custom-properties": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz",
+ "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "@csstools/postcss-stepped-value-functions": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz",
+ "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "@csstools/postcss-text-decoration-shorthand": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz",
+ "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "@csstools/postcss-trigonometric-functions": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz",
+ "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "@csstools/postcss-unset-value": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz",
+ "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g=="
+ },
+ "@csstools/selector-specificity": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz",
+ "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw=="
+ },
+ "@emotion/babel-plugin": {
+ "version": "11.10.6",
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz",
+ "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/runtime": "^7.18.3",
+ "@emotion/hash": "^0.9.0",
+ "@emotion/memoize": "^0.8.0",
+ "@emotion/serialize": "^1.1.1",
+ "babel-plugin-macros": "^3.1.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7",
+ "stylis": "4.1.3"
+ }
+ },
+ "@emotion/cache": {
+ "version": "11.10.5",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz",
+ "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==",
+ "requires": {
+ "@emotion/memoize": "^0.8.0",
+ "@emotion/sheet": "^1.2.1",
+ "@emotion/utils": "^1.2.0",
+ "@emotion/weak-memoize": "^0.3.0",
+ "stylis": "4.1.3"
+ }
+ },
+ "@emotion/hash": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz",
+ "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ=="
+ },
+ "@emotion/is-prop-valid": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz",
+ "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==",
+ "requires": {
+ "@emotion/memoize": "^0.8.0"
+ }
+ },
+ "@emotion/memoize": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz",
+ "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA=="
+ },
+ "@emotion/react": {
+ "version": "11.10.6",
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz",
+ "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==",
+ "requires": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.10.6",
+ "@emotion/cache": "^11.10.5",
+ "@emotion/serialize": "^1.1.1",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0",
+ "@emotion/utils": "^1.2.0",
+ "@emotion/weak-memoize": "^0.3.0",
+ "hoist-non-react-statics": "^3.3.1"
+ }
+ },
+ "@emotion/serialize": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz",
+ "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==",
+ "requires": {
+ "@emotion/hash": "^0.9.0",
+ "@emotion/memoize": "^0.8.0",
+ "@emotion/unitless": "^0.8.0",
+ "@emotion/utils": "^1.2.0",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@emotion/sheet": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz",
+ "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA=="
+ },
+ "@emotion/styled": {
+ "version": "11.10.6",
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz",
+ "integrity": "sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==",
+ "requires": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.10.6",
+ "@emotion/is-prop-valid": "^1.2.0",
+ "@emotion/serialize": "^1.1.1",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0",
+ "@emotion/utils": "^1.2.0"
+ }
+ },
+ "@emotion/unitless": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz",
+ "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw=="
+ },
+ "@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz",
+ "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A=="
+ },
+ "@emotion/utils": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz",
+ "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw=="
+ },
+ "@emotion/weak-memoize": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz",
+ "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg=="
+ },
+ "@eslint/eslintrc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
+ "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.4.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": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ }
+ }
+ },
+ "@handsontable/react": {
+ "version": "12.3.1",
+ "resolved": "https://registry.npmjs.org/@handsontable/react/-/react-12.3.1.tgz",
+ "integrity": "sha512-BwumRAQqHeuxaRF9xShWO6ivlNYZ9ZoU/WabKfjtnAv/Ke4g9/VBxe4UZ+x/rElpz06f0yzBm4cG0A6AS4Hyug=="
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ }
+ },
+ "@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="
+ },
+ "@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=="
+ },
+ "@icons/material": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz",
+ "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw=="
+ },
+ "@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "requires": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
+ }
+ }
+ },
+ "@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="
+ },
+ "@jest/console": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz",
+ "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
+ "requires": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/core": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz",
+ "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
+ "requires": {
+ "@jest/console": "^27.5.1",
+ "@jest/reporters": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^27.5.1",
+ "jest-config": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-resolve-dependencies": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "jest-watcher": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/environment": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz",
+ "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
+ "requires": {
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1"
+ }
+ },
+ "@jest/fake-timers": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
+ "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
+ "requires": {
+ "@jest/types": "^27.5.1",
+ "@sinonjs/fake-timers": "^8.0.1",
+ "@types/node": "*",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ }
+ },
+ "@jest/globals": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz",
+ "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
+ "requires": {
+ "@jest/environment": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "expect": "^27.5.1"
+ }
+ },
+ "@jest/reporters": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz",
+ "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
+ "requires": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.2",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^5.1.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-haste-map": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.0",
+ "string-length": "^4.0.1",
+ "terminal-link": "^2.0.0",
+ "v8-to-istanbul": "^8.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/schemas": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz",
+ "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==",
+ "requires": {
+ "@sinclair/typebox": "^0.24.1"
+ }
+ },
+ "@jest/source-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz",
+ "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
+ "requires": {
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9",
+ "source-map": "^0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "@jest/test-result": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz",
+ "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
+ "requires": {
+ "@jest/console": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ }
+ },
+ "@jest/test-sequencer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
+ "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
+ "requires": {
+ "@jest/test-result": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-runtime": "^27.5.1"
+ }
+ },
+ "@jest/transform": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz",
+ "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
+ "requires": {
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^27.5.1",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "requires": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "@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=="
+ },
+ "@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=="
+ },
+ "@jridgewell/source-map": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+ "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "dependencies": {
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ }
+ }
+ },
+ "@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=="
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "requires": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "@leichtgewicht/ip-codec": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
+ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A=="
+ },
+ "@mapbox/geojson-rewind": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz",
+ "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==",
+ "requires": {
+ "get-stream": "^6.0.1",
+ "minimist": "^1.2.6"
+ }
+ },
+ "@mapbox/geojson-types": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz",
+ "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw=="
+ },
+ "@mapbox/jsonlint-lines-primitives": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz",
+ "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ=="
+ },
+ "@mapbox/mapbox-gl-supported": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz",
+ "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg=="
+ },
+ "@mapbox/point-geometry": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz",
+ "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ=="
+ },
+ "@mapbox/tiny-sdf": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz",
+ "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw=="
+ },
+ "@mapbox/unitbezier": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz",
+ "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA=="
+ },
+ "@mapbox/vector-tile": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz",
+ "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==",
+ "requires": {
+ "@mapbox/point-geometry": "~0.1.0"
+ }
+ },
+ "@mapbox/whoots-js": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz",
+ "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q=="
+ },
+ "@mui/base": {
+ "version": "5.0.0-alpha.118",
+ "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.118.tgz",
+ "integrity": "sha512-GAEpqhnuHjRaAZLdxFNuOf2GDTp9sUawM46oHZV4VnYPFjXJDkIYFWfIQLONb0nga92OiqS5DD/scGzVKCL0Mw==",
+ "requires": {
+ "@babel/runtime": "^7.20.13",
+ "@emotion/is-prop-valid": "^1.2.0",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.9",
+ "@popperjs/core": "^2.11.6",
+ "clsx": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ }
+ }
+ },
+ "@mui/core-downloads-tracker": {
+ "version": "5.11.9",
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.9.tgz",
+ "integrity": "sha512-YGEtucQ/Nl91VZkzYaLad47Cdui51n/hW+OQm4210g4N3/nZzBxmGeKfubEalf+ShKH4aYDS86XTO6q/TpZnjQ=="
+ },
+ "@mui/icons-material": {
+ "version": "5.11.9",
+ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.9.tgz",
+ "integrity": "sha512-SPANMk6K757Q1x48nCwPGdSNb8B71d+2hPMJ0V12VWerpSsbjZtvAPi5FAn13l2O5mwWkvI0Kne+0tCgnNxMNw==",
+ "requires": {
+ "@babel/runtime": "^7.20.13"
+ }
+ },
+ "@mui/lab": {
+ "version": "5.0.0-alpha.120",
+ "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.120.tgz",
+ "integrity": "sha512-vjlF2jTKSZnNxtUO0xxHEDfpL5cG0LLNRsfKv8TYOiPs0Q1bbqO3YfqJsqxv8yh+wx7EFZc8lwJ4NSAQdenW3A==",
+ "requires": {
+ "@babel/runtime": "^7.20.13",
+ "@mui/base": "5.0.0-alpha.118",
+ "@mui/system": "^5.11.9",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.9",
+ "clsx": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ }
+ }
+ },
+ "@mui/material": {
+ "version": "5.11.10",
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.11.10.tgz",
+ "integrity": "sha512-hs1WErbiedqlJIZsljgoil908x4NMp8Lfk8di+5c7o809roqKcFTg2+k3z5ucKvs29AXcsdXrDB/kn2K6dGYIw==",
+ "requires": {
+ "@babel/runtime": "^7.20.13",
+ "@mui/base": "5.0.0-alpha.118",
+ "@mui/core-downloads-tracker": "^5.11.9",
+ "@mui/system": "^5.11.9",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.9",
+ "@types/react-transition-group": "^4.4.5",
+ "clsx": "^1.2.1",
+ "csstype": "^3.1.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0",
+ "react-transition-group": "^4.4.5"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ }
+ }
+ },
+ "@mui/private-theming": {
+ "version": "5.11.9",
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.11.9.tgz",
+ "integrity": "sha512-XMyVIFGomVCmCm92EvYlgq3zrC9K+J6r7IKl/rBJT2/xVYoRY6uM7jeB+Wxh7kXxnW9Dbqsr2yL3cx6wSD1sAg==",
+ "requires": {
+ "@babel/runtime": "^7.20.13",
+ "@mui/utils": "^5.11.9",
+ "prop-types": "^15.8.1"
+ }
+ },
+ "@mui/styled-engine": {
+ "version": "5.11.9",
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.9.tgz",
+ "integrity": "sha512-bkh2CjHKOMy98HyOc8wQXEZvhOmDa/bhxMUekFX5IG0/w4f5HJ8R6+K6nakUUYNEgjOWPYzNPrvGB8EcGbhahQ==",
+ "requires": {
+ "@babel/runtime": "^7.20.13",
+ "@emotion/cache": "^11.10.5",
+ "csstype": "^3.1.1",
+ "prop-types": "^15.8.1"
+ }
+ },
+ "@mui/system": {
+ "version": "5.11.9",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.9.tgz",
+ "integrity": "sha512-h6uarf+l3FO6l75Nf7yO+qDGrIoa1DM9nAMCUFZQsNCDKOInRzcptnm8M1w/Z3gVetfeeGoIGAYuYKbft6KZZA==",
+ "requires": {
+ "@babel/runtime": "^7.20.13",
+ "@mui/private-theming": "^5.11.9",
+ "@mui/styled-engine": "^5.11.9",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.9",
+ "clsx": "^1.2.1",
+ "csstype": "^3.1.1",
+ "prop-types": "^15.8.1"
+ }
+ },
+ "@mui/types": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz",
+ "integrity": "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw=="
+ },
+ "@mui/utils": {
+ "version": "5.11.9",
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.11.9.tgz",
+ "integrity": "sha512-eOJaqzcEs4qEwolcvFAmXGpln+uvouvOS9FUX6Wkrte+4I8rZbjODOBDVNlK+V6/ziTfD4iNKC0G+KfOTApbqg==",
+ "requires": {
+ "@babel/runtime": "^7.20.13",
+ "@types/prop-types": "^15.7.5",
+ "@types/react-is": "^16.7.1 || ^17.0.0",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ }
+ }
+ },
+ "@nicolo-ribaudo/eslint-scope-5-internals": {
+ "version": "5.1.1-v1",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
+ "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
+ "requires": {
+ "eslint-scope": "5.1.1"
+ },
+ "dependencies": {
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.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==",
+ "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=="
+ },
+ "@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==",
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@plotly/d3": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.1.tgz",
+ "integrity": "sha512-x49ThEu1FRA00kTso4Jdfyf2byaCPLBGmLjAYQz5OzaPyLUhHesX3/Nfv2OHEhynhdy2UB39DLXq6thYe2L2kg=="
+ },
+ "@plotly/d3-sankey": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz",
+ "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==",
+ "requires": {
+ "d3-array": "1",
+ "d3-collection": "1",
+ "d3-shape": "^1.2.0"
+ }
+ },
+ "@plotly/d3-sankey-circular": {
+ "version": "0.33.1",
+ "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz",
+ "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==",
+ "requires": {
+ "d3-array": "^1.2.1",
+ "d3-collection": "^1.0.4",
+ "d3-shape": "^1.2.0",
+ "elementary-circuits-directed-graph": "^1.0.4"
+ }
+ },
+ "@plotly/point-cluster": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz",
+ "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==",
+ "requires": {
+ "array-bounds": "^1.0.1",
+ "binary-search-bounds": "^2.0.4",
+ "clamp": "^1.0.1",
+ "defined": "^1.0.0",
+ "dtype": "^2.0.0",
+ "flatten-vertex-data": "^1.0.2",
+ "is-obj": "^1.0.1",
+ "math-log2": "^1.0.1",
+ "parse-rect": "^1.2.0",
+ "pick-by-alias": "^1.2.0"
+ }
+ },
+ "@pmmmwh/react-refresh-webpack-plugin": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz",
+ "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==",
+ "requires": {
+ "ansi-html-community": "^0.0.8",
+ "common-path-prefix": "^3.0.0",
+ "core-js-pure": "^3.23.3",
+ "error-stack-parser": "^2.0.6",
+ "find-up": "^5.0.0",
+ "html-entities": "^2.1.0",
+ "loader-utils": "^2.0.4",
+ "schema-utils": "^3.0.0",
+ "source-map": "^0.7.3"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="
+ }
+ }
+ },
+ "@popperjs/core": {
+ "version": "2.11.6",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
+ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw=="
+ },
+ "@reduxjs/toolkit": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.3.tgz",
+ "integrity": "sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg==",
+ "requires": {
+ "immer": "^9.0.16",
+ "redux": "^4.2.0",
+ "redux-thunk": "^2.4.2",
+ "reselect": "^4.1.7"
+ }
+ },
+ "@rollup/plugin-babel": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
+ "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@rollup/pluginutils": "^3.1.0"
+ }
+ },
+ "@rollup/plugin-node-resolve": {
+ "version": "11.2.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
+ "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
+ "requires": {
+ "@rollup/pluginutils": "^3.1.0",
+ "@types/resolve": "1.17.1",
+ "builtin-modules": "^3.1.0",
+ "deepmerge": "^4.2.2",
+ "is-module": "^1.0.0",
+ "resolve": "^1.19.0"
+ }
+ },
+ "@rollup/plugin-replace": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
+ "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
+ "requires": {
+ "@rollup/pluginutils": "^3.1.0",
+ "magic-string": "^0.25.7"
+ }
+ },
+ "@rollup/pluginutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "requires": {
+ "@types/estree": "0.0.39",
+ "estree-walker": "^1.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "dependencies": {
+ "@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
+ }
+ }
+ },
+ "@rushstack/eslint-patch": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz",
+ "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg=="
+ },
+ "@sinclair/typebox": {
+ "version": "0.24.51",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
+ "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA=="
+ },
+ "@sinonjs/commons": {
+ "version": "1.8.6",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+ "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "@sinonjs/fake-timers": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
+ "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+ "requires": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
+ "@surma/rollup-plugin-off-main-thread": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
+ "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
+ "requires": {
+ "ejs": "^3.1.6",
+ "json5": "^2.2.0",
+ "magic-string": "^0.25.0",
+ "string.prototype.matchall": "^4.0.6"
+ }
+ },
+ "@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg=="
+ },
+ "@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg=="
+ },
+ "@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
+ "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA=="
+ },
+ "@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
+ "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ=="
+ },
+ "@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
+ "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg=="
+ },
+ "@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
+ "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw=="
+ },
+ "@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
+ "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q=="
+ },
+ "@svgr/babel-plugin-transform-svg-component": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
+ "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ=="
+ },
+ "@svgr/babel-preset": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
+ "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
+ "requires": {
+ "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
+ "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
+ "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
+ }
+ },
+ "@svgr/core": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz",
+ "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
+ "requires": {
+ "@svgr/plugin-jsx": "^5.5.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^7.0.0"
+ }
+ },
+ "@svgr/hast-util-to-babel-ast": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
+ "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
+ "requires": {
+ "@babel/types": "^7.12.6"
+ }
+ },
+ "@svgr/plugin-jsx": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
+ "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
+ "requires": {
+ "@babel/core": "^7.12.3",
+ "@svgr/babel-preset": "^5.5.0",
+ "@svgr/hast-util-to-babel-ast": "^5.5.0",
+ "svg-parser": "^2.0.2"
+ }
+ },
+ "@svgr/plugin-svgo": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
+ "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
+ "requires": {
+ "cosmiconfig": "^7.0.0",
+ "deepmerge": "^4.2.2",
+ "svgo": "^1.2.2"
+ }
+ },
+ "@svgr/webpack": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz",
+ "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
+ "requires": {
+ "@babel/core": "^7.12.3",
+ "@babel/plugin-transform-react-constant-elements": "^7.12.1",
+ "@babel/preset-env": "^7.12.1",
+ "@babel/preset-react": "^7.12.5",
+ "@svgr/core": "^5.5.0",
+ "@svgr/plugin-jsx": "^5.5.0",
+ "@svgr/plugin-svgo": "^5.5.0",
+ "loader-utils": "^2.0.0"
+ }
+ },
+ "@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="
+ },
+ "@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="
+ },
+ "@turf/area": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz",
+ "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==",
+ "requires": {
+ "@turf/helpers": "^6.5.0",
+ "@turf/meta": "^6.5.0"
+ }
+ },
+ "@turf/bbox": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz",
+ "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==",
+ "requires": {
+ "@turf/helpers": "^6.5.0",
+ "@turf/meta": "^6.5.0"
+ }
+ },
+ "@turf/centroid": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz",
+ "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==",
+ "requires": {
+ "@turf/helpers": "^6.5.0",
+ "@turf/meta": "^6.5.0"
+ }
+ },
+ "@turf/helpers": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
+ "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw=="
+ },
+ "@turf/meta": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz",
+ "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==",
+ "requires": {
+ "@turf/helpers": "^6.5.0"
+ }
+ },
+ "@types/babel__core": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
+ "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
+ "requires": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "@types/babel__generator": {
+ "version": "7.6.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
+ "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@types/babel__template": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
+ "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
+ "requires": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@types/babel__traverse": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
+ "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
+ "requires": {
+ "@babel/types": "^7.3.0"
+ }
+ },
+ "@types/body-parser": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
+ "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
+ "requires": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/bonjour": {
+ "version": "3.5.10",
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
+ "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/connect": {
+ "version": "3.4.35",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
+ "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/connect-history-api-fallback": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
+ "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
+ "requires": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/d3": {
+ "version": "5.16.4",
+ "resolved": "https://registry.npmjs.org/@types/d3/-/d3-5.16.4.tgz",
+ "integrity": "sha512-2u0O9iP1MubFiQ+AhR1id4Egs+07BLtvRATG6IL2Gs9+KzdrfaxCKNq5hxEyw1kxwsqB/lCgr108XuHcKtb/5w==",
+ "requires": {
+ "@types/d3-array": "^1",
+ "@types/d3-axis": "^1",
+ "@types/d3-brush": "^1",
+ "@types/d3-chord": "^1",
+ "@types/d3-collection": "*",
+ "@types/d3-color": "^1",
+ "@types/d3-contour": "^1",
+ "@types/d3-dispatch": "^1",
+ "@types/d3-drag": "^1",
+ "@types/d3-dsv": "^1",
+ "@types/d3-ease": "^1",
+ "@types/d3-fetch": "^1",
+ "@types/d3-force": "^1",
+ "@types/d3-format": "^1",
+ "@types/d3-geo": "^1",
+ "@types/d3-hierarchy": "^1",
+ "@types/d3-interpolate": "^1",
+ "@types/d3-path": "^1",
+ "@types/d3-polygon": "^1",
+ "@types/d3-quadtree": "^1",
+ "@types/d3-random": "^1",
+ "@types/d3-scale": "^2",
+ "@types/d3-scale-chromatic": "^1",
+ "@types/d3-selection": "^1",
+ "@types/d3-shape": "^1",
+ "@types/d3-time": "^1",
+ "@types/d3-time-format": "^2",
+ "@types/d3-timer": "^1",
+ "@types/d3-transition": "^1",
+ "@types/d3-voronoi": "*",
+ "@types/d3-zoom": "^1"
+ }
+ },
+ "@types/d3-array": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.9.tgz",
+ "integrity": "sha512-E/7RgPr2ylT5dWG0CswMi9NpFcjIEDqLcUSBgNHe/EMahfqYaTx4zhcggG3khqoEB/leY4Vl6nTSbwLUPjXceA=="
+ },
+ "@types/d3-axis": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.16.tgz",
+ "integrity": "sha512-p7085weOmo4W+DzlRRVC/7OI/jugaKbVa6WMQGCQscaMylcbuaVEGk7abJLNyGVFLeCBNrHTdDiqRGnzvL0nXQ==",
+ "requires": {
+ "@types/d3-selection": "^1"
+ }
+ },
+ "@types/d3-brush": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.1.5.tgz",
+ "integrity": "sha512-4zGkBafJf5zCsBtLtvDj/pNMo5X9+Ii/1hUz0GvQ+wEwelUBm2AbIDAzJnp2hLDFF307o0fhxmmocHclhXC+tw==",
+ "requires": {
+ "@types/d3-selection": "^1"
+ }
+ },
+ "@types/d3-chord": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.11.tgz",
+ "integrity": "sha512-0DdfJ//bxyW3G9Nefwq/LDgazSKNN8NU0lBT3Cza6uVuInC2awMNsAcv1oKyRFLn9z7kXClH5XjwpveZjuz2eg=="
+ },
+ "@types/d3-collection": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.10.tgz",
+ "integrity": "sha512-54Fdv8u5JbuXymtmXm2SYzi1x/Svt+jfWBU5junkhrCewL92VjqtCBDn97coBRVwVFmYNnVTNDyV8gQyPYfm+A=="
+ },
+ "@types/d3-color": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.2.tgz",
+ "integrity": "sha512-fYtiVLBYy7VQX+Kx7wU/uOIkGQn8aAEY8oWMoyja3N4dLd8Yf6XgSIR/4yWvMuveNOH5VShnqCgRqqh/UNanBA=="
+ },
+ "@types/d3-contour": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-1.3.3.tgz",
+ "integrity": "sha512-LxwmGIfVJIc1cKs7ZFRQ1FbtXpfH7QTXYRdMIJsFP71uCMdF6jJ0XZakYDX6Hn4yZkLf+7V8FgD34yCcok+5Ww==",
+ "requires": {
+ "@types/d3-array": "^1",
+ "@types/geojson": "*"
+ }
+ },
+ "@types/d3-dispatch": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.9.tgz",
+ "integrity": "sha512-zJ44YgjqALmyps+II7b1mZLhrtfV/FOxw9owT87mrweGWcg+WK5oiJX2M3SYJ0XUAExBduarysfgbR11YxzojQ=="
+ },
+ "@types/d3-drag": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.5.tgz",
+ "integrity": "sha512-7NeTnfolst1Js3Vs7myctBkmJWu6DMI3k597AaHUX98saHjHWJ6vouT83UrpE+xfbSceHV+8A0JgxuwgqgmqWw==",
+ "requires": {
+ "@types/d3-selection": "^1"
+ }
+ },
+ "@types/d3-dsv": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.2.2.tgz",
+ "integrity": "sha512-GRnz9z8ypqb7OsQ/xw/BmFAp0/k3pgM1s19FTZZSlCMY0EvyVTkU8xzZKKDXzytGXPpTNC4R5pGl9oxEvVSnHQ=="
+ },
+ "@types/d3-ease": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.11.tgz",
+ "integrity": "sha512-wUigPL0kleGZ9u3RhzBP07lxxkMcUjL5IODP42mN/05UNL+JJCDnpEPpFbJiPvLcTeRKGIRpBBJyP/1BNwYsVA=="
+ },
+ "@types/d3-fetch": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-1.2.2.tgz",
+ "integrity": "sha512-rtFs92GugtV/NpiJQd0WsmGLcg52tIL0uF0bKbbJg231pR9JEb6HT4AUwrtuLq3lOeKdLBhsjV14qb0pMmd0Aw==",
+ "requires": {
+ "@types/d3-dsv": "^1"
+ }
+ },
+ "@types/d3-force": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.4.tgz",
+ "integrity": "sha512-fkorLTKvt6AQbFBQwn4aq7h9rJ4c7ZVcPMGB8X6eFFveAyMZcv7t7m6wgF4Eg93rkPgPORU7sAho1QSHNcZu6w=="
+ },
+ "@types/d3-format": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.4.2.tgz",
+ "integrity": "sha512-WeGCHAs7PHdZYq6lwl/+jsl+Nfc1J2W1kNcMeIMYzQsT6mtBDBgtJ/rcdjZ0k0rVIvqEZqhhuD5TK/v3P2gFHQ=="
+ },
+ "@types/d3-geo": {
+ "version": "1.12.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.12.4.tgz",
+ "integrity": "sha512-lNDaAuOaML6w2d1XE0Txr5YOXLBQSF1q2IU6eXh/u1TTPQSm2Ah+TMIub1+CIMq8J/7DOzi5Cr8/yHqjNvqLKA==",
+ "requires": {
+ "@types/geojson": "*"
+ }
+ },
+ "@types/d3-hierarchy": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz",
+ "integrity": "sha512-AbStKxNyWiMDQPGDguG2Kuhlq1Sv539pZSxYbx4UZeYkutpPwXCcgyiRrlV4YH64nIOsKx7XVnOMy9O7rJsXkg=="
+ },
+ "@types/d3-interpolate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz",
+ "integrity": "sha512-ylycts6llFf8yAEs1tXzx2loxxzDZHseuhPokrqKprTQSTcD3JbJI1omZP1rphsELZO3Q+of3ff0ZS7+O6yVzg==",
+ "requires": {
+ "@types/d3-color": "^1"
+ }
+ },
+ "@types/d3-path": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.9.tgz",
+ "integrity": "sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ=="
+ },
+ "@types/d3-polygon": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.8.tgz",
+ "integrity": "sha512-1TOJPXCBJC9V3+K3tGbTqD/CsqLyv/YkTXAcwdsZzxqw5cvpdnCuDl42M4Dvi8XzMxZNCT9pL4ibrK2n4VmAcw=="
+ },
+ "@types/d3-quadtree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.9.tgz",
+ "integrity": "sha512-5E0OJJn2QVavITFEc1AQlI8gLcIoDZcTKOD3feKFckQVmFV4CXhqRFt83tYNVNIN4ZzRkjlAMavJa1ldMhf5rA=="
+ },
+ "@types/d3-random": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.3.tgz",
+ "integrity": "sha512-XXR+ZbFCoOd4peXSMYJzwk0/elP37WWAzS/DG+90eilzVbUSsgKhBcWqylGWe+lA2ubgr7afWAOBaBxRgMUrBQ=="
+ },
+ "@types/d3-scale": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-2.2.6.tgz",
+ "integrity": "sha512-CHu34T5bGrJOeuhGxyiz9Xvaa9PlsIaQoOqjDg7zqeGj2x0rwPhGquiy03unigvcMxmvY0hEaAouT0LOFTLpIw==",
+ "requires": {
+ "@types/d3-time": "^1"
+ }
+ },
+ "@types/d3-scale-chromatic": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.5.1.tgz",
+ "integrity": "sha512-7FtJYrmXTEWLykShjYhoGuDNR/Bda0+tstZMkFj4RRxUEryv16AGh3be21tqg84B6KfEwiZyEpBcTyPyU+GWjg=="
+ },
+ "@types/d3-selection": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.3.tgz",
+ "integrity": "sha512-GjKQWVZO6Sa96HiKO6R93VBE8DUW+DDkFpIMf9vpY5S78qZTlRRSNUsHr/afDpF7TvLDV7VxrUFOWW7vdIlYkA=="
+ },
+ "@types/d3-shape": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.8.tgz",
+ "integrity": "sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==",
+ "requires": {
+ "@types/d3-path": "^1"
+ }
+ },
+ "@types/d3-time": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.1.tgz",
+ "integrity": "sha512-ULX7LoqXTCYtM+tLYOaeAJK7IwCT+4Gxlm2MaH0ErKLi07R5lh8NHCAyWcDkCCmx1AfRcBEV6H9QE9R25uP7jw=="
+ },
+ "@types/d3-time-format": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.3.1.tgz",
+ "integrity": "sha512-fck0Z9RGfIQn3GJIEKVrp15h9m6Vlg0d5XXeiE/6+CQiBmMDZxfR21XtjEPuDeg7gC3bBM0SdieA5XF3GW1wKA=="
+ },
+ "@types/d3-timer": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.10.tgz",
+ "integrity": "sha512-ZnAbquVqy+4ZjdW0cY6URp+qF/AzTVNda2jYyOzpR2cPT35FTXl78s15Bomph9+ckOiI1TtkljnWkwbIGAb6rg=="
+ },
+ "@types/d3-transition": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.3.2.tgz",
+ "integrity": "sha512-J+a3SuF/E7wXbOSN19p8ZieQSFIm5hU2Egqtndbc54LXaAEOpLfDx4sBu/PKAKzHOdgKK1wkMhINKqNh4aoZAg==",
+ "requires": {
+ "@types/d3-selection": "^1"
+ }
+ },
+ "@types/d3-voronoi": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz",
+ "integrity": "sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ=="
+ },
+ "@types/d3-zoom": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.8.3.tgz",
+ "integrity": "sha512-3kHkL6sPiDdbfGhzlp5gIHyu3kULhtnHTTAl3UBZVtWB1PzcLL8vdmz5mTx7plLiUqOA2Y+yT2GKjt/TdA2p7Q==",
+ "requires": {
+ "@types/d3-interpolate": "^1",
+ "@types/d3-selection": "^1"
+ }
+ },
+ "@types/debug": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz",
+ "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==",
+ "dev": true,
+ "requires": {
+ "@types/ms": "*"
+ }
+ },
+ "@types/draft-convert": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@types/draft-convert/-/draft-convert-2.1.4.tgz",
+ "integrity": "sha512-NbhE0ijzENK6ZQa3zO0KK6cNS80XESnQ03Bg7DEzE/qBg6YvpIEni6vzruYCYPkm1Sc6z0K7XbtJu4p53elGdA==",
+ "requires": {
+ "@types/draft-js": "*",
+ "@types/react": "*"
+ }
+ },
+ "@types/draft-js": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/@types/draft-js/-/draft-js-0.11.10.tgz",
+ "integrity": "sha512-o/DST8x0wNerwhRiaE577UHFIXb6HCywaZOZfj9TF2vU3CONvsCGoQmdOsKqERdXp+3ZNlSvFUH0B8lEEYOT4A==",
+ "requires": {
+ "@types/react": "*",
+ "immutable": "~3.7.4"
+ }
+ },
+ "@types/draftjs-to-html": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@types/draftjs-to-html/-/draftjs-to-html-0.8.1.tgz",
+ "integrity": "sha512-NBkphQs+qZ/sAz/j1pCUaxkPAOx00LTsE88aMSSfcvK+UfCpjHJDqIMCkm6wKotuJvY5w0BtdRazQ0sAaXzPdg==",
+ "requires": {
+ "@types/draft-js": "*"
+ }
+ },
+ "@types/eslint": {
+ "version": "8.21.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz",
+ "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==",
+ "requires": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "@types/eslint-scope": {
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz",
+ "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==",
+ "requires": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "@types/estree": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
+ "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ=="
+ },
+ "@types/express": {
+ "version": "4.17.17",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
+ "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
+ "requires": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "@types/express-serve-static-core": {
+ "version": "4.17.33",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz",
+ "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==",
+ "requires": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*"
+ }
+ },
+ "@types/geojson": {
+ "version": "7946.0.10",
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz",
+ "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA=="
+ },
+ "@types/graceful-fs": {
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+ "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/hast": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz",
+ "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==",
+ "requires": {
+ "@types/unist": "*"
+ }
+ },
+ "@types/hoist-non-react-statics": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
+ "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
+ "requires": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "@types/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg=="
+ },
+ "@types/http-proxy": {
+ "version": "1.17.9",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz",
+ "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/istanbul-lib-coverage": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
+ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g=="
+ },
+ "@types/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+ "requires": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "@types/istanbul-reports": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
+ "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+ "requires": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "@types/js-cookie": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.3.tgz",
+ "integrity": "sha512-Xe7IImK09HP1sv2M/aI+48a20VX+TdRJucfq4vfRVy6nWN8PYPOEnlMRSgxJAgYQIXJVL8dZ4/ilAM7dWNaOww==",
+ "dev": true
+ },
+ "@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ=="
+ },
+ "@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
+ },
+ "@types/lodash": {
+ "version": "4.14.191",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz",
+ "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==",
+ "dev": true
+ },
+ "@types/mime": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
+ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
+ },
+ "@types/ms": {
+ "version": "0.7.31",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz",
+ "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "16.11.20",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.20.tgz",
+ "integrity": "sha512-lAKaZ0Lc1Umwd0AqLr6iy5U8u/1DpK7/JzNgQn9cMMUk2mFR8bbhEP8BQrI9Cm5CU0bOVCaWbkGBvgqKMOJHsw=="
+ },
+ "@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+ },
+ "@types/pikaday": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/@types/pikaday/-/pikaday-1.7.4.tgz",
+ "integrity": "sha512-0KsHVyw5pTG829nqG4IRu7m+BFQlFEBdbE/1i3S5182HeKUKv1uEW0gyEmkJVp5i4IV+9pyh23O83+KpRkSQbw==",
+ "requires": {
+ "moment": ">=2.14.0"
+ }
+ },
+ "@types/plotly.js": {
+ "version": "2.12.18",
+ "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-2.12.18.tgz",
+ "integrity": "sha512-ff+CIEWnqZNjZqHtQZvkEAVuLs9fkm1f54QnPVmgoET7wMHdSqUka2hasVN4e5yfHD05YwGjsAtCseewJh/BMw==",
+ "dev": true
+ },
+ "@types/prettier": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
+ "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg=="
+ },
+ "@types/prop-types": {
+ "version": "15.7.5",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
+ },
+ "@types/q": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
+ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ=="
+ },
+ "@types/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
+ },
+ "@types/ramda": {
+ "version": "0.28.23",
+ "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.28.23.tgz",
+ "integrity": "sha512-9TYWiwkew+mCMsL7jZ+kkzy6QXn8PL5/SKmBPmjgUlTpkokZWTBr+OhiIUDztpAEbslWyt24NNfEmZUBFmnXig==",
+ "dev": true,
+ "requires": {
+ "ts-toolbelt": "^6.15.1"
+ },
+ "dependencies": {
+ "ts-toolbelt": {
+ "version": "6.15.5",
+ "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz",
+ "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==",
+ "dev": true
+ }
+ }
+ },
+ "@types/range-parser": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
+ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
+ },
+ "@types/react": {
+ "version": "18.0.28",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
+ "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
+ "requires": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@types/react-beautiful-dnd": {
+ "version": "13.1.3",
+ "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.3.tgz",
+ "integrity": "sha512-BNdmvONKtsrZq3AGrujECQrIn8cDT+fZsxBLXuX3YWY/nHfZinUFx4W88eS0rkcXzuLbXpKOsu/1WCMPMLEpPg==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-color": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/react-color/-/react-color-3.0.6.tgz",
+ "integrity": "sha512-OzPIO5AyRmLA7PlOyISlgabpYUa3En74LP8mTMa0veCA719SvYQov4WLMsHvCgXP+L+KI9yGhYnqZafVGG0P4w==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*",
+ "@types/reactcss": "*"
+ }
+ },
+ "@types/react-d3-graph": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/@types/react-d3-graph/-/react-d3-graph-2.6.3.tgz",
+ "integrity": "sha512-OYM7eO/4U6ARP8E3izk5VrkHLqO/0YI3QGFymLGt/AR/ETbc4Spx0Ljpa/3hJ/0wLmncLTyUV6gegcNooDAEww==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-dom": {
+ "version": "18.0.11",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz",
+ "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-is": {
+ "version": "17.0.3",
+ "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz",
+ "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-plotly.js": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@types/react-plotly.js/-/react-plotly.js-2.6.0.tgz",
+ "integrity": "sha512-nJJ57U0/CNDAO+F3dpnMgM8PtjLE/O1I3O6gq4+5Q13uKqrPnHGYOttfdzQJ4D7KYgF609miVzEYakUS2zds8w==",
+ "dev": true,
+ "requires": {
+ "@types/plotly.js": "*",
+ "@types/react": "*"
+ }
+ },
+ "@types/react-redux": {
+ "version": "7.1.25",
+ "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz",
+ "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==",
+ "requires": {
+ "@types/hoist-non-react-statics": "^3.3.0",
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0",
+ "redux": "^4.0.0"
+ }
+ },
+ "@types/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-virtualized-auto-sizer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz",
+ "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-window": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz",
+ "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/reactcss": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@types/reactcss/-/reactcss-1.2.6.tgz",
+ "integrity": "sha512-qaIzpCuXNWomGR1Xq8SCFTtF4v8V27Y6f+b9+bzHiv087MylI/nTCqqdChNeWS7tslgROmYB7yeiruWX7WnqNg==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/redux-logger": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/@types/redux-logger/-/redux-logger-3.0.9.tgz",
+ "integrity": "sha512-cwYhVbYNgH01aepeMwhd0ABX6fhVB2rcQ9m80u8Fl50ZODhsZ8RhQArnLTkE7/Zrfq4Sz/taNoF7DQy9pCZSKg==",
+ "dev": true,
+ "requires": {
+ "redux": "^4.0.0"
+ }
+ },
+ "@types/resolve": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
+ "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="
+ },
+ "@types/scheduler": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
+ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
+ },
+ "@types/semver": {
+ "version": "7.3.13",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
+ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw=="
+ },
+ "@types/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
+ "requires": {
+ "@types/express": "*"
+ }
+ },
+ "@types/serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==",
+ "requires": {
+ "@types/mime": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/sockjs": {
+ "version": "0.3.33",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
+ "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/stack-utils": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
+ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw=="
+ },
+ "@types/swagger-ui-react": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@types/swagger-ui-react/-/swagger-ui-react-4.11.0.tgz",
+ "integrity": "sha512-WPMR+GWbLd7zvY/uOTGzGzP44zK2rIZSnU00+pDR2YANnEV6/qj0kqYfdSY1Vk6qdvI7dR0Tx8JEMgUUrUQDjw==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/trusted-types": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz",
+ "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g=="
+ },
+ "@types/unist": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
+ "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="
+ },
+ "@types/use-sync-external-store": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
+ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ },
+ "@types/uuid": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz",
+ "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==",
+ "dev": true
+ },
+ "@types/ws": {
+ "version": "8.5.4",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz",
+ "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/xml-js": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/xml-js/-/xml-js-1.0.0.tgz",
+ "integrity": "sha512-tRJYQN/uAD8Br9K+pqqzJNd/htIxQaFy6ppfNEWbwsAoWRK3oAxzROCGA39GHT+E3BHLyuBnSB7XKsnJ0s4w2g==",
+ "requires": {
+ "xml-js": "*"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.5",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz",
+ "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==",
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "@types/yargs-parser": {
+ "version": "21.0.0",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
+ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA=="
+ },
+ "@typescript-eslint/eslint-plugin": {
+ "version": "5.53.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz",
+ "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==",
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.53.0",
+ "@typescript-eslint/type-utils": "5.53.0",
+ "@typescript-eslint/utils": "5.53.0",
+ "debug": "^4.3.4",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "regexpp": "^3.2.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/experimental-utils": {
+ "version": "5.53.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.53.0.tgz",
+ "integrity": "sha512-4SklZEwRn0jqkhtW+pPZpbKFXprwGneBndRM0TGzJu/LWdb9QV2hBgFIVU9AREo02BzqFvyG/ypd+xAW5YGhXw==",
+ "requires": {
+ "@typescript-eslint/utils": "5.53.0"
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "5.53.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz",
+ "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==",
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.53.0",
+ "@typescript-eslint/types": "5.53.0",
+ "@typescript-eslint/typescript-estree": "5.53.0",
+ "debug": "^4.3.4"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "5.53.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz",
+ "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==",
+ "requires": {
+ "@typescript-eslint/types": "5.53.0",
+ "@typescript-eslint/visitor-keys": "5.53.0"
+ }
+ },
+ "@typescript-eslint/type-utils": {
+ "version": "5.53.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz",
+ "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==",
+ "requires": {
+ "@typescript-eslint/typescript-estree": "5.53.0",
+ "@typescript-eslint/utils": "5.53.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.53.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz",
+ "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A=="
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.53.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz",
+ "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==",
+ "requires": {
+ "@typescript-eslint/types": "5.53.0",
+ "@typescript-eslint/visitor-keys": "5.53.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/utils": {
+ "version": "5.53.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz",
+ "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==",
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.53.0",
+ "@typescript-eslint/types": "5.53.0",
+ "@typescript-eslint/typescript-estree": "5.53.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0",
+ "semver": "^7.3.7"
+ },
+ "dependencies": {
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ }
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.53.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz",
+ "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==",
+ "requires": {
+ "@typescript-eslint/types": "5.53.0",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "@webassemblyjs/ast": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+ "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+ "requires": {
+ "@webassemblyjs/helper-numbers": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+ }
+ },
+ "@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+ "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
+ },
+ "@webassemblyjs/helper-api-error": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+ "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
+ },
+ "@webassemblyjs/helper-buffer": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+ "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
+ },
+ "@webassemblyjs/helper-numbers": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+ "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+ "requires": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.1",
+ "@webassemblyjs/helper-api-error": "1.11.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+ "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
+ },
+ "@webassemblyjs/helper-wasm-section": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+ "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1"
+ }
+ },
+ "@webassemblyjs/ieee754": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+ "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+ "requires": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "@webassemblyjs/leb128": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+ "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+ "requires": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/utf8": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+ "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
+ },
+ "@webassemblyjs/wasm-edit": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+ "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/helper-wasm-section": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1",
+ "@webassemblyjs/wasm-opt": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1",
+ "@webassemblyjs/wast-printer": "1.11.1"
+ }
+ },
+ "@webassemblyjs/wasm-gen": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+ "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/ieee754": "1.11.1",
+ "@webassemblyjs/leb128": "1.11.1",
+ "@webassemblyjs/utf8": "1.11.1"
+ }
+ },
+ "@webassemblyjs/wasm-opt": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+ "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1"
+ }
+ },
+ "@webassemblyjs/wasm-parser": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+ "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-api-error": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/ieee754": "1.11.1",
+ "@webassemblyjs/leb128": "1.11.1",
+ "@webassemblyjs/utf8": "1.11.1"
+ }
+ },
+ "@webassemblyjs/wast-printer": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+ "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@xobotyi/scrollbar-width": {
+ "version": "1.9.5",
+ "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz",
+ "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="
+ },
+ "@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+ },
+ "@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+ },
+ "@yarnpkg/lockfile": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
+ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
+ },
+ "abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
+ },
+ "abs-svg-path": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz",
+ "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA=="
+ },
+ "accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "requires": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ }
+ },
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+ },
+ "acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "requires": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ }
+ },
+ "acorn-import-assertions": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
+ "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw=="
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="
+ },
+ "acorn-node": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+ "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
+ "requires": {
+ "acorn": "^7.0.0",
+ "acorn-walk": "^7.0.0",
+ "xtend": "^4.0.2"
+ }
+ },
+ "acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
+ },
+ "address": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
+ "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA=="
+ },
+ "adjust-sourcemap-loader": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz",
+ "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==",
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "regex-parser": "^2.2.11"
+ }
+ },
+ "agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "requires": {
+ "debug": "4"
+ }
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "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"
+ }
+ },
+ "ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "requires": {
+ "ajv": "^8.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "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=="
+ }
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
+ },
+ "almost-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz",
+ "integrity": "sha512-0V/PkoculFl5+0Lp47JoxUcO0xSxhIBvm+BxHdD/OgXNmdRpRHCFnKVuUoWyS9EzQP+otSGv0m9Lb4yVkQBn2A=="
+ },
+ "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==",
+ "requires": {
+ "type-fest": "^0.21.3"
+ },
+ "dependencies": {
+ "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=="
+ }
+ }
+ },
+ "ansi-html-community": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw=="
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
+ },
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
+ },
+ "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"
+ }
+ },
+ "aria-query": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
+ "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
+ "requires": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+ },
+ "array-bounds": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz",
+ "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ=="
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw=="
+ },
+ "array-flatten": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
+ },
+ "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==",
+ "requires": {
+ "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"
+ }
+ },
+ "array-normalize": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz",
+ "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==",
+ "requires": {
+ "array-bounds": "^1.0.0"
+ }
+ },
+ "array-range": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz",
+ "integrity": "sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA=="
+ },
+ "array-rearrange": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz",
+ "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w=="
+ },
+ "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=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "array.prototype.reduce": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz",
+ "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-array-method-boxes-properly": "^1.0.0",
+ "is-string": "^1.0.7"
+ }
+ },
+ "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==",
+ "requires": {
+ "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"
+ }
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
+ },
+ "asn1.js": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "requires": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "assert": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz",
+ "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==",
+ "requires": {
+ "es6-object-assign": "^1.1.0",
+ "is-nan": "^1.2.1",
+ "object-is": "^1.0.1",
+ "util": "^0.12.0"
+ }
+ },
+ "ast-types-flow": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag=="
+ },
+ "async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
+ },
+ "atob-lite": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz",
+ "integrity": "sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw=="
+ },
+ "attr-accept": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz",
+ "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg=="
+ },
+ "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"
+ }
+ },
+ "autoprefixer": {
+ "version": "10.4.13",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz",
+ "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==",
+ "requires": {
+ "browserslist": "^4.21.4",
+ "caniuse-lite": "^1.0.30001426",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "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=="
+ },
+ "axe-core": {
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz",
+ "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg=="
+ },
+ "axios": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.3.tgz",
+ "integrity": "sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==",
+ "requires": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "axobject-query": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
+ "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==",
+ "requires": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "babel-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
+ "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
+ "requires": {
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "babel-loader": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz",
+ "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==",
+ "requires": {
+ "find-cache-dir": "^3.3.1",
+ "loader-utils": "^2.0.0",
+ "make-dir": "^3.1.0",
+ "schema-utils": "^2.6.5"
+ },
+ "dependencies": {
+ "schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "requires": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ }
+ }
+ }
+ },
+ "babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ }
+ },
+ "babel-plugin-jest-hoist": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
+ "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
+ "requires": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.0.0",
+ "@types/babel__traverse": "^7.0.6"
+ }
+ },
+ "babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "requires": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ }
+ },
+ "babel-plugin-named-asset-import": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz",
+ "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q=="
+ },
+ "babel-plugin-polyfill-corejs2": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz",
+ "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==",
+ "requires": {
+ "@babel/compat-data": "^7.17.7",
+ "@babel/helper-define-polyfill-provider": "^0.3.3",
+ "semver": "^6.1.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "babel-plugin-polyfill-corejs3": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz",
+ "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==",
+ "requires": {
+ "@babel/helper-define-polyfill-provider": "^0.3.3",
+ "core-js-compat": "^3.25.1"
+ }
+ },
+ "babel-plugin-polyfill-regenerator": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz",
+ "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==",
+ "requires": {
+ "@babel/helper-define-polyfill-provider": "^0.3.3"
+ }
+ },
+ "babel-plugin-transform-react-remove-prop-types": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
+ "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA=="
+ },
+ "babel-preset-current-node-syntax": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
+ "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
+ "requires": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.8.3",
+ "@babel/plugin-syntax-import-meta": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-top-level-await": "^7.8.3"
+ }
+ },
+ "babel-preset-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
+ "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
+ "requires": {
+ "babel-plugin-jest-hoist": "^27.5.1",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ }
+ },
+ "babel-preset-react-app": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz",
+ "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==",
+ "requires": {
+ "@babel/core": "^7.16.0",
+ "@babel/plugin-proposal-class-properties": "^7.16.0",
+ "@babel/plugin-proposal-decorators": "^7.16.4",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
+ "@babel/plugin-proposal-numeric-separator": "^7.16.0",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.0",
+ "@babel/plugin-proposal-private-methods": "^7.16.0",
+ "@babel/plugin-transform-flow-strip-types": "^7.16.0",
+ "@babel/plugin-transform-react-display-name": "^7.16.0",
+ "@babel/plugin-transform-runtime": "^7.16.4",
+ "@babel/preset-env": "^7.16.4",
+ "@babel/preset-react": "^7.16.0",
+ "@babel/preset-typescript": "^7.16.0",
+ "@babel/runtime": "^7.16.3",
+ "babel-plugin-macros": "^3.1.0",
+ "babel-plugin-transform-react-remove-prop-types": "^0.4.24"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "base16": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz",
+ "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ=="
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ },
+ "batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw=="
+ },
+ "bfj": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz",
+ "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==",
+ "requires": {
+ "bluebird": "^3.5.5",
+ "check-types": "^11.1.1",
+ "hoopy": "^0.1.4",
+ "tryer": "^1.0.1"
+ }
+ },
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+ },
+ "bignumber.js": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.1.1.tgz",
+ "integrity": "sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ=="
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
+ },
+ "binary-search-bounds": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz",
+ "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA=="
+ },
+ "bit-twiddle": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz",
+ "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA=="
+ },
+ "bitmap-sdf": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz",
+ "integrity": "sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg=="
+ },
+ "bl": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
+ "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
+ "requires": {
+ "readable-stream": "^2.3.5",
+ "safe-buffer": "^5.1.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "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": {
+ "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=="
+ }
+ }
+ },
+ "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=="
+ }
+ }
+ }
+ }
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ },
+ "bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
+ },
+ "body-parser": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+ "requires": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "bonjour-service": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz",
+ "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==",
+ "requires": {
+ "array-flatten": "^2.1.2",
+ "dns-equal": "^1.0.0",
+ "fast-deep-equal": "^3.1.3",
+ "multicast-dns": "^7.2.5"
+ }
+ },
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="
+ },
+ "browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "requires": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "requires": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+ "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+ "requires": {
+ "bn.js": "^5.0.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "browserify-sign": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+ "requires": {
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ }
+ },
+ "browserslist": {
+ "version": "4.21.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+ "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+ "requires": {
+ "caniuse-lite": "^1.0.30001449",
+ "electron-to-chromium": "^1.4.284",
+ "node-releases": "^2.0.8",
+ "update-browserslist-db": "^1.0.10"
+ }
+ },
+ "bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "requires": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ=="
+ },
+ "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=="
+ },
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ=="
+ },
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+ },
+ "camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "requires": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="
+ },
+ "camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
+ },
+ "caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "requires": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001457",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz",
+ "integrity": "sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA=="
+ },
+ "canvas-fit": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz",
+ "integrity": "sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==",
+ "requires": {
+ "element-size": "^1.1.1"
+ }
+ },
+ "case-sensitive-paths-webpack-plugin": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
+ "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw=="
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "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=="
+ }
+ }
+ },
+ "char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="
+ },
+ "character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="
+ },
+ "character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="
+ },
+ "character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="
+ },
+ "check-types": {
+ "version": "11.2.2",
+ "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz",
+ "integrity": "sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA=="
+ },
+ "chevrotain": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-6.5.0.tgz",
+ "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==",
+ "optional": true,
+ "requires": {
+ "regexp-to-ast": "0.4.0"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "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"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "chrome-trace-event": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg=="
+ },
+ "ci-info": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
+ "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw=="
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "cjs-module-lexer": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
+ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA=="
+ },
+ "clamp": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz",
+ "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA=="
+ },
+ "classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ },
+ "clean-css": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz",
+ "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==",
+ "requires": {
+ "source-map": "~0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="
+ },
+ "coa": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+ "requires": {
+ "@types/q": "^1.5.1",
+ "chalk": "^2.4.1",
+ "q": "^1.1.2"
+ }
+ },
+ "collect-v8-coverage": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
+ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg=="
+ },
+ "color-alpha": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz",
+ "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==",
+ "requires": {
+ "color-parse": "^1.3.8"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-id": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz",
+ "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==",
+ "requires": {
+ "clamp": "^1.0.1"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "color-normalize": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz",
+ "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==",
+ "requires": {
+ "clamp": "^1.0.1",
+ "color-rgba": "^2.1.1",
+ "dtype": "^2.0.0"
+ }
+ },
+ "color-parse": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.3.8.tgz",
+ "integrity": "sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA==",
+ "requires": {
+ "color-name": "^1.0.0",
+ "defined": "^1.0.0",
+ "is-plain-obj": "^1.1.0"
+ }
+ },
+ "color-rgba": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.1.1.tgz",
+ "integrity": "sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==",
+ "requires": {
+ "clamp": "^1.0.1",
+ "color-parse": "^1.3.8",
+ "color-space": "^1.14.6"
+ }
+ },
+ "color-space": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.16.0.tgz",
+ "integrity": "sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==",
+ "requires": {
+ "hsluv": "^0.0.3",
+ "mumath": "^3.3.4"
+ }
+ },
+ "colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="
+ },
+ "colorette": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "comma-separated-tokens": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
+ "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "common-path-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
+ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w=="
+ },
+ "common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA=="
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
+ },
+ "compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "requires": {
+ "mime-db": ">= 1.43.0 < 2"
+ }
+ },
+ "compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "requires": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "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=="
+ }
+ }
+ },
+ "compute-dims": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/compute-dims/-/compute-dims-1.1.0.tgz",
+ "integrity": "sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg==",
+ "requires": {
+ "utils-copy": "^1.0.0",
+ "validate.io-array": "^1.0.6",
+ "validate.io-matrix-like": "^1.0.2",
+ "validate.io-ndarray-like": "^1.0.0",
+ "validate.io-positive-integer": "^1.0.0"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "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"
+ }
+ },
+ "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=="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA=="
+ },
+ "connect-history-api-fallback": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
+ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA=="
+ },
+ "const-max-uint32": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/const-max-uint32/-/const-max-uint32-1.0.2.tgz",
+ "integrity": "sha512-T8/9bffg5RThuejasJWrwqxs3Q0fsJvyl7/33IB6svroD8JC93E7X60AuuOnDE8RlP6Jlb5FxmlrVDpl9KiU2Q=="
+ },
+ "const-pinf-float64": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz",
+ "integrity": "sha512-wfs+V4HdSN7C3CWJWR7hVa24yTPn3mDJthwhRIObZBh6UjTjkUMUrCP3UrNGozB/HjTpcScnGXtQUNa+yjsIJQ=="
+ },
+ "content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "requires": {
+ "safe-buffer": "5.2.1"
+ }
+ },
+ "content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
+ },
+ "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=="
+ },
+ "cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+ },
+ "copy-to-clipboard": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
+ "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
+ "requires": {
+ "toggle-selection": "^1.0.6"
+ }
+ },
+ "core-js": {
+ "version": "3.28.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz",
+ "integrity": "sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw=="
+ },
+ "core-js-compat": {
+ "version": "3.28.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.28.0.tgz",
+ "integrity": "sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==",
+ "requires": {
+ "browserslist": "^4.21.5"
+ }
+ },
+ "core-js-pure": {
+ "version": "3.28.0",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.28.0.tgz",
+ "integrity": "sha512-DSOVleA9/v3LNj/vFxAPfUHttKTzrB2RXhAPvR5TPXn4vrra3Z2ssytvRyt8eruJwAfwAiFADEbrjcRdcvPLQQ=="
+ },
+ "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": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ }
+ },
+ "country-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz",
+ "integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA=="
+ },
+ "create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "requires": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "requires": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "cross-env": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
+ "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.1"
+ }
+ },
+ "cross-fetch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
+ "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
+ "requires": {
+ "node-fetch": "2.6.7"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "requires": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ }
+ },
+ "crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
+ },
+ "css-blank-pseudo": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz",
+ "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.9"
+ }
+ },
+ "css-box-model": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz",
+ "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==",
+ "requires": {
+ "tiny-invariant": "^1.0.6"
+ }
+ },
+ "css-declaration-sorter": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz",
+ "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w=="
+ },
+ "css-font": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz",
+ "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==",
+ "requires": {
+ "css-font-size-keywords": "^1.0.0",
+ "css-font-stretch-keywords": "^1.0.1",
+ "css-font-style-keywords": "^1.0.1",
+ "css-font-weight-keywords": "^1.0.0",
+ "css-global-keywords": "^1.0.1",
+ "css-system-font-keywords": "^1.0.0",
+ "pick-by-alias": "^1.2.0",
+ "string-split-by": "^1.0.0",
+ "unquote": "^1.1.0"
+ }
+ },
+ "css-font-size-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz",
+ "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q=="
+ },
+ "css-font-stretch-keywords": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz",
+ "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg=="
+ },
+ "css-font-style-keywords": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz",
+ "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg=="
+ },
+ "css-font-weight-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz",
+ "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA=="
+ },
+ "css-global-keywords": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz",
+ "integrity": "sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ=="
+ },
+ "css-has-pseudo": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz",
+ "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.9"
+ }
+ },
+ "css-in-js-utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz",
+ "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==",
+ "requires": {
+ "hyphenate-style-name": "^1.0.3"
+ }
+ },
+ "css-loader": {
+ "version": "6.7.3",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz",
+ "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==",
+ "requires": {
+ "icss-utils": "^5.1.0",
+ "postcss": "^8.4.19",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.0",
+ "postcss-modules-scope": "^3.0.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.3.8"
+ }
+ },
+ "css-minimizer-webpack-plugin": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz",
+ "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==",
+ "requires": {
+ "cssnano": "^5.0.6",
+ "jest-worker": "^27.0.2",
+ "postcss": "^8.3.5",
+ "schema-utils": "^4.0.0",
+ "serialize-javascript": "^6.0.0",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "requires": {
+ "fast-deep-equal": "^3.1.3"
+ }
+ },
+ "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=="
+ },
+ "schema-utils": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+ "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.8.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.0.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "css-prefers-color-scheme": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz",
+ "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA=="
+ },
+ "css-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
+ "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-what": "^3.2.1",
+ "domutils": "^1.7.0",
+ "nth-check": "^1.0.2"
+ }
+ },
+ "css-select-base-adapter": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
+ },
+ "css-system-font-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz",
+ "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA=="
+ },
+ "css-tree": {
+ "version": "1.0.0-alpha.37",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+ "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+ "requires": {
+ "mdn-data": "2.0.4",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "css-what": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
+ "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ=="
+ },
+ "css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="
+ },
+ "csscolorparser": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz",
+ "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w=="
+ },
+ "cssdb": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.4.1.tgz",
+ "integrity": "sha512-0Q8NOMpXJ3iTDDbUv9grcmQAfdDx4qz+fN/+Md2FGbevT+6+bJNQ2LjB2YIUlLbpBTM32idU1Sb+tb/uGt6/XQ=="
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
+ },
+ "cssnano": {
+ "version": "5.1.15",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz",
+ "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==",
+ "requires": {
+ "cssnano-preset-default": "^5.2.14",
+ "lilconfig": "^2.0.3",
+ "yaml": "^1.10.2"
+ }
+ },
+ "cssnano-preset-default": {
+ "version": "5.2.14",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz",
+ "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==",
+ "requires": {
+ "css-declaration-sorter": "^6.3.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-calc": "^8.2.3",
+ "postcss-colormin": "^5.3.1",
+ "postcss-convert-values": "^5.1.3",
+ "postcss-discard-comments": "^5.1.2",
+ "postcss-discard-duplicates": "^5.1.0",
+ "postcss-discard-empty": "^5.1.1",
+ "postcss-discard-overridden": "^5.1.0",
+ "postcss-merge-longhand": "^5.1.7",
+ "postcss-merge-rules": "^5.1.4",
+ "postcss-minify-font-values": "^5.1.0",
+ "postcss-minify-gradients": "^5.1.1",
+ "postcss-minify-params": "^5.1.4",
+ "postcss-minify-selectors": "^5.2.1",
+ "postcss-normalize-charset": "^5.1.0",
+ "postcss-normalize-display-values": "^5.1.0",
+ "postcss-normalize-positions": "^5.1.1",
+ "postcss-normalize-repeat-style": "^5.1.1",
+ "postcss-normalize-string": "^5.1.0",
+ "postcss-normalize-timing-functions": "^5.1.0",
+ "postcss-normalize-unicode": "^5.1.1",
+ "postcss-normalize-url": "^5.1.0",
+ "postcss-normalize-whitespace": "^5.1.1",
+ "postcss-ordered-values": "^5.1.3",
+ "postcss-reduce-initial": "^5.1.2",
+ "postcss-reduce-transforms": "^5.1.0",
+ "postcss-svgo": "^5.1.0",
+ "postcss-unique-selectors": "^5.1.1"
+ }
+ },
+ "cssnano-utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
+ "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA=="
+ },
+ "csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "requires": {
+ "css-tree": "^1.1.2"
+ },
+ "dependencies": {
+ "css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "requires": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ }
+ },
+ "mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "cssom": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
+ },
+ "cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "requires": {
+ "cssom": "~0.3.6"
+ },
+ "dependencies": {
+ "cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
+ }
+ }
+ },
+ "csstype": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
+ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
+ },
+ "d": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+ "requires": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.1"
+ }
+ },
+ "d3": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz",
+ "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==",
+ "requires": {
+ "d3-array": "1",
+ "d3-axis": "1",
+ "d3-brush": "1",
+ "d3-chord": "1",
+ "d3-collection": "1",
+ "d3-color": "1",
+ "d3-contour": "1",
+ "d3-dispatch": "1",
+ "d3-drag": "1",
+ "d3-dsv": "1",
+ "d3-ease": "1",
+ "d3-fetch": "1",
+ "d3-force": "1",
+ "d3-format": "1",
+ "d3-geo": "1",
+ "d3-hierarchy": "1",
+ "d3-interpolate": "1",
+ "d3-path": "1",
+ "d3-polygon": "1",
+ "d3-quadtree": "1",
+ "d3-random": "1",
+ "d3-scale": "2",
+ "d3-scale-chromatic": "1",
+ "d3-selection": "1",
+ "d3-shape": "1",
+ "d3-time": "1",
+ "d3-time-format": "2",
+ "d3-timer": "1",
+ "d3-transition": "1",
+ "d3-voronoi": "1",
+ "d3-zoom": "1"
+ }
+ },
+ "d3-array": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
+ "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
+ },
+ "d3-axis": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz",
+ "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ=="
+ },
+ "d3-brush": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz",
+ "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==",
+ "requires": {
+ "d3-dispatch": "1",
+ "d3-drag": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "1",
+ "d3-transition": "1"
+ }
+ },
+ "d3-chord": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz",
+ "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==",
+ "requires": {
+ "d3-array": "1",
+ "d3-path": "1"
+ }
+ },
+ "d3-collection": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz",
+ "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A=="
+ },
+ "d3-color": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz",
+ "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q=="
+ },
+ "d3-contour": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz",
+ "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==",
+ "requires": {
+ "d3-array": "^1.1.1"
+ }
+ },
+ "d3-dispatch": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz",
+ "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA=="
+ },
+ "d3-drag": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz",
+ "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==",
+ "requires": {
+ "d3-dispatch": "1",
+ "d3-selection": "1"
+ }
+ },
+ "d3-dsv": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz",
+ "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==",
+ "requires": {
+ "commander": "2",
+ "iconv-lite": "0.4",
+ "rw": "1"
+ }
+ },
+ "d3-ease": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz",
+ "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ=="
+ },
+ "d3-fetch": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz",
+ "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==",
+ "requires": {
+ "d3-dsv": "1"
+ }
+ },
+ "d3-force": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz",
+ "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==",
+ "requires": {
+ "d3-collection": "1",
+ "d3-dispatch": "1",
+ "d3-quadtree": "1",
+ "d3-timer": "1"
+ }
+ },
+ "d3-format": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz",
+ "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ=="
+ },
+ "d3-geo": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz",
+ "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==",
+ "requires": {
+ "d3-array": "1"
+ }
+ },
+ "d3-geo-projection": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz",
+ "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==",
+ "requires": {
+ "commander": "2",
+ "d3-array": "1",
+ "d3-geo": "^1.12.0",
+ "resolve": "^1.1.10"
+ }
+ },
+ "d3-hierarchy": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz",
+ "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ=="
+ },
+ "d3-interpolate": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz",
+ "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==",
+ "requires": {
+ "d3-color": "1"
+ }
+ },
+ "d3-path": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
+ "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
+ },
+ "d3-polygon": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz",
+ "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ=="
+ },
+ "d3-quadtree": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz",
+ "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA=="
+ },
+ "d3-random": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz",
+ "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ=="
+ },
+ "d3-scale": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz",
+ "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==",
+ "requires": {
+ "d3-array": "^1.2.0",
+ "d3-collection": "1",
+ "d3-format": "1",
+ "d3-interpolate": "1",
+ "d3-time": "1",
+ "d3-time-format": "2"
+ }
+ },
+ "d3-scale-chromatic": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz",
+ "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==",
+ "requires": {
+ "d3-color": "1",
+ "d3-interpolate": "1"
+ }
+ },
+ "d3-selection": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz",
+ "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg=="
+ },
+ "d3-shape": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
+ "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+ "requires": {
+ "d3-path": "1"
+ }
+ },
+ "d3-time": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz",
+ "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA=="
+ },
+ "d3-time-format": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz",
+ "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==",
+ "requires": {
+ "d3-time": "1"
+ }
+ },
+ "d3-timer": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz",
+ "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw=="
+ },
+ "d3-transition": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz",
+ "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==",
+ "requires": {
+ "d3-color": "1",
+ "d3-dispatch": "1",
+ "d3-ease": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "^1.1.0",
+ "d3-timer": "1"
+ }
+ },
+ "d3-voronoi": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz",
+ "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg=="
+ },
+ "d3-zoom": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz",
+ "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==",
+ "requires": {
+ "d3-dispatch": "1",
+ "d3-drag": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "1",
+ "d3-transition": "1"
+ }
+ },
+ "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=="
+ },
+ "data-urls": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+ "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "requires": {
+ "abab": "^2.0.3",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.0.0"
+ },
+ "dependencies": {
+ "tr46": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
+ "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+ "requires": {
+ "punycode": "^2.1.1"
+ }
+ },
+ "webidl-conversions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="
+ },
+ "whatwg-url": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
+ "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+ "requires": {
+ "lodash": "^4.7.0",
+ "tr46": "^2.1.0",
+ "webidl-conversions": "^6.1.0"
+ }
+ }
+ }
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
+ },
+ "dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA=="
+ },
+ "deep-equal": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz",
+ "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "es-get-iterator": "^1.1.2",
+ "get-intrinsic": "^1.1.3",
+ "is-arguments": "^1.1.1",
+ "is-array-buffer": "^3.0.1",
+ "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.4.3",
+ "side-channel": "^1.0.4",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.9"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+ }
+ }
+ },
+ "deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+ },
+ "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=="
+ },
+ "deepmerge": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz",
+ "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og=="
+ },
+ "default-gateway": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
+ "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+ "requires": {
+ "execa": "^5.0.0"
+ }
+ },
+ "define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="
+ },
+ "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==",
+ "requires": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "defined": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
+ "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q=="
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ },
+ "des.js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
+ },
+ "detect-kerning": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz",
+ "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw=="
+ },
+ "detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="
+ },
+ "detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
+ },
+ "detect-port-alt": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
+ "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
+ "requires": {
+ "address": "^1.0.1",
+ "debug": "^2.6.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "detective": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
+ "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
+ "requires": {
+ "acorn-node": "^1.8.2",
+ "defined": "^1.0.0",
+ "minimist": "^1.2.6"
+ }
+ },
+ "didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
+ },
+ "diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ=="
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "requires": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
+ },
+ "dns-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+ "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg=="
+ },
+ "dns-packet": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz",
+ "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==",
+ "requires": {
+ "@leichtgewicht/ip-codec": "^2.0.1"
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "requires": {
+ "utila": "~0.4"
+ }
+ },
+ "dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "requires": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "dom-serializer": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "entities": "^2.0.0"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
+ }
+ }
+ },
+ "domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+ },
+ "domexception": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
+ "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+ "requires": {
+ "webidl-conversions": "^5.0.0"
+ },
+ "dependencies": {
+ "webidl-conversions": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="
+ }
+ }
+ },
+ "domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "requires": {
+ "domelementtype": "^2.2.0"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
+ }
+ }
+ },
+ "dompurify": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.4.tgz",
+ "integrity": "sha512-1e2SpqHiRx4DPvmRuXU5J0di3iQACwJM+mFGE2HAkkK7Tbnfk9WcghcAmyWc9CRrjyRRUpmuhPUH6LphQQR3EQ=="
+ },
+ "domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "requires": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "dotenv": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
+ "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="
+ },
+ "dotenv-expand": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
+ },
+ "draft-convert": {
+ "version": "2.1.13",
+ "resolved": "https://registry.npmjs.org/draft-convert/-/draft-convert-2.1.13.tgz",
+ "integrity": "sha512-/h/n4JCfyO8aWby7wKBkccHdsuVbbDyHWXi/B3Zf2pN++lN1lDOIVt5ulXCcbH2Y5YJEFzMJw/YGfN+R0axxxg==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "immutable": "~3.7.4",
+ "invariant": "^2.2.1"
+ }
+ },
+ "draft-js": {
+ "version": "0.11.7",
+ "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.11.7.tgz",
+ "integrity": "sha512-ne7yFfN4sEL82QPQEn80xnADR8/Q6ALVworbC5UOSzOvjffmYfFsr3xSZtxbIirti14R7Y33EZC5rivpLgIbsg==",
+ "requires": {
+ "fbjs": "^2.0.0",
+ "immutable": "~3.7.4",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "draftjs-to-html": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/draftjs-to-html/-/draftjs-to-html-0.9.1.tgz",
+ "integrity": "sha512-fFstE6+IayaVFBEvaFt/wN8vdj8FsTRzij7dy7LI9QIwf5LgfHFi9zSpvCg+feJ2tbYVqHxUkjcibwpsTpgFVQ=="
+ },
+ "drange": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz",
+ "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA=="
+ },
+ "draw-svg-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz",
+ "integrity": "sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==",
+ "requires": {
+ "abs-svg-path": "~0.1.1",
+ "normalize-svg-path": "~0.1.0"
+ }
+ },
+ "dtype": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz",
+ "integrity": "sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg=="
+ },
+ "dup": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz",
+ "integrity": "sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA=="
+ },
+ "duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
+ },
+ "duplexify": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+ "requires": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "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"
+ }
+ },
+ "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=="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "earcut": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
+ "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ },
+ "ejs": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
+ "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
+ "requires": {
+ "jake": "^10.8.5"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.4.304",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.304.tgz",
+ "integrity": "sha512-6c8M+ojPgDIXN2NyfGn8oHASXYnayj+gSEnGeLMKb9zjsySeVB/j7KkNAAG9yDcv8gNlhvFg5REa1N/kQU6pgA=="
+ },
+ "element-size": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz",
+ "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ=="
+ },
+ "elementary-circuits-directed-graph": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz",
+ "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==",
+ "requires": {
+ "strongly-connected-components": "^1.0.1"
+ }
+ },
+ "elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "requires": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "emittery": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
+ "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg=="
+ },
+ "emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
+ },
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "enhanced-resolve": {
+ "version": "5.12.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
+ "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
+ "requires": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ }
+ },
+ "entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
+ },
+ "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==",
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "error-stack-parser": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+ "requires": {
+ "stackframe": "^1.3.4"
+ }
+ },
+ "es-abstract": {
+ "version": "1.21.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz",
+ "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==",
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "function.prototype.name": "^1.1.5",
+ "get-intrinsic": "^1.1.3",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.4",
+ "is-array-buffer": "^3.0.1",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.10",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.12.2",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.4.3",
+ "safe-regex-test": "^1.0.0",
+ "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"
+ }
+ },
+ "es-array-method-boxes-properly": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="
+ },
+ "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==",
+ "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"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+ }
+ }
+ },
+ "es-module-lexer": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
+ },
+ "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==",
+ "requires": {
+ "get-intrinsic": "^1.1.3",
+ "has": "^1.0.3",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "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==",
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.62",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
+ "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
+ "requires": {
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.3",
+ "next-tick": "^1.1.0"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "es6-object-assign": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz",
+ "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw=="
+ },
+ "es6-symbol": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+ "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+ "requires": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
+ "es6-weak-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
+ "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.46",
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ },
+ "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=="
+ },
+ "escodegen": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+ "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "requires": {
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "optional": true
+ }
+ }
+ },
+ "eslint": {
+ "version": "8.34.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz",
+ "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==",
+ "requires": {
+ "@eslint/eslintrc": "^1.4.1",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "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.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.4.0",
+ "esquery": "^1.4.0",
+ "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",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-sdsl": "^4.1.4",
+ "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.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "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.3"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ }
+ }
+ },
+ "eslint-config-airbnb": {
+ "version": "19.0.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz",
+ "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==",
+ "dev": true,
+ "requires": {
+ "eslint-config-airbnb-base": "^15.0.0",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5"
+ }
+ },
+ "eslint-config-airbnb-base": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
+ "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
+ "dev": true,
+ "requires": {
+ "confusing-browser-globals": "^1.0.10",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-config-prettier": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz",
+ "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==",
+ "dev": true
+ },
+ "eslint-config-react-app": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz",
+ "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==",
+ "requires": {
+ "@babel/core": "^7.16.0",
+ "@babel/eslint-parser": "^7.16.3",
+ "@rushstack/eslint-patch": "^1.1.0",
+ "@typescript-eslint/eslint-plugin": "^5.5.0",
+ "@typescript-eslint/parser": "^5.5.0",
+ "babel-preset-react-app": "^10.0.1",
+ "confusing-browser-globals": "^1.0.11",
+ "eslint-plugin-flowtype": "^8.0.3",
+ "eslint-plugin-import": "^2.25.3",
+ "eslint-plugin-jest": "^25.3.0",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.27.1",
+ "eslint-plugin-react-hooks": "^4.3.0",
+ "eslint-plugin-testing-library": "^5.0.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.11.0",
+ "resolve": "^1.22.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz",
+ "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==",
+ "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==",
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "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==",
+ "requires": {
+ "lodash": "^4.17.21",
+ "string-natural-compare": "^3.0.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "array.prototype.flatmap": "^1.3.1",
+ "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",
+ "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"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "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==",
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "eslint-plugin-jest": {
+ "version": "25.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz",
+ "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==",
+ "requires": {
+ "@typescript-eslint/experimental-utils": "^5.0.0"
+ }
+ },
+ "eslint-plugin-jsx-a11y": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz",
+ "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==",
+ "requires": {
+ "@babel/runtime": "^7.20.7",
+ "aria-query": "^5.1.3",
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "ast-types-flow": "^0.0.7",
+ "axe-core": "^4.6.2",
+ "axobject-query": "^3.1.1",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^3.3.3",
+ "language-tags": "=1.0.5",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "eslint-plugin-prettier": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
+ "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
+ "dev": true,
+ "requires": {
+ "prettier-linter-helpers": "^1.0.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "array.prototype.tosorted": "^1.1.1",
+ "doctrine": "^2.1.0",
+ "estraverse": "^5.3.0",
+ "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",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.4",
+ "semver": "^6.3.0",
+ "string.prototype.matchall": "^4.0.8"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+ },
+ "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==",
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "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=="
+ },
+ "eslint-plugin-testing-library": {
+ "version": "5.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.2.tgz",
+ "integrity": "sha512-f1DmDWcz5SDM+IpCkEX0lbFqrrTs8HRsEElzDEqN/EBI0hpRj8Cns5+IVANXswE8/LeybIJqPAOQIFu2j5Y5sw==",
+ "requires": {
+ "@typescript-eslint/utils": "^5.43.0"
+ }
+ },
+ "eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+ }
+ }
+ },
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA=="
+ },
+ "eslint-webpack-plugin": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz",
+ "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==",
+ "requires": {
+ "@types/eslint": "^7.29.0 || ^8.4.1",
+ "jest-worker": "^28.0.2",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "requires": {
+ "fast-deep-equal": "^3.1.3"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "jest-worker": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz",
+ "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==",
+ "requires": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ }
+ },
+ "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=="
+ },
+ "schema-utils": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+ "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.8.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "espree": {
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+ "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
+ "requires": {
+ "acorn": "^8.8.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw=="
+ }
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ },
+ "esquery": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz",
+ "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==",
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+ },
+ "estree-walker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
+ },
+ "eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+ },
+ "events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "requires": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ=="
+ },
+ "expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "requires": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ }
+ },
+ "express": {
+ "version": "4.18.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+ "requires": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.1",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.5.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.11.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "ext": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+ "requires": {
+ "type": "^2.7.2"
+ },
+ "dependencies": {
+ "type": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
+ "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
+ }
+ }
+ },
+ "falafel": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz",
+ "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==",
+ "requires": {
+ "acorn": "^7.1.1",
+ "isarray": "^2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+ }
+ }
+ },
+ "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=="
+ },
+ "fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "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.4"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "fast-isnumeric": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz",
+ "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==",
+ "requires": {
+ "is-string-blank": "^1.0.1"
+ }
+ },
+ "fast-json-patch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz",
+ "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ=="
+ },
+ "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=="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
+ },
+ "fast-loops": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz",
+ "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g=="
+ },
+ "fast-shallow-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz",
+ "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw=="
+ },
+ "fastest-stable-stringify": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz",
+ "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q=="
+ },
+ "fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "fault": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
+ "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
+ "requires": {
+ "format": "^0.2.0"
+ }
+ },
+ "faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "requires": {
+ "websocket-driver": ">=0.5.1"
+ }
+ },
+ "fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "requires": {
+ "bser": "2.1.1"
+ }
+ },
+ "fbemitter": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz",
+ "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==",
+ "requires": {
+ "fbjs": "^3.0.0"
+ },
+ "dependencies": {
+ "fbjs": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz",
+ "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==",
+ "requires": {
+ "cross-fetch": "^3.1.5",
+ "fbjs-css-vars": "^1.0.0",
+ "loose-envify": "^1.0.0",
+ "object-assign": "^4.1.0",
+ "promise": "^7.1.1",
+ "setimmediate": "^1.0.5",
+ "ua-parser-js": "^0.7.30"
+ }
+ }
+ }
+ },
+ "fbjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-2.0.0.tgz",
+ "integrity": "sha512-8XA8ny9ifxrAWlyhAbexXcs3rRMtxWcs3M0lctLfB49jRDHiaxj+Mo0XxbwE7nKZYzgCFoq64FS+WFd4IycPPQ==",
+ "requires": {
+ "core-js": "^3.6.4",
+ "cross-fetch": "^3.0.4",
+ "fbjs-css-vars": "^1.0.0",
+ "loose-envify": "^1.0.0",
+ "object-assign": "^4.1.0",
+ "promise": "^7.1.1",
+ "setimmediate": "^1.0.5",
+ "ua-parser-js": "^0.7.18"
+ }
+ },
+ "fbjs-css-vars": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz",
+ "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="
+ },
+ "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==",
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "file-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+ "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ }
+ },
+ "file-selector": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz",
+ "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==",
+ "requires": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "requires": {
+ "minimatch": "^5.0.1"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
+ }
+ },
+ "filesize": {
+ "version": "8.0.7",
+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz",
+ "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ=="
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "finalhandler": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ }
+ },
+ "find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+ },
+ "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==",
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "find-yarn-workspace-root": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz",
+ "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==",
+ "requires": {
+ "micromatch": "^4.0.2"
+ }
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ=="
+ },
+ "flatten-vertex-data": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz",
+ "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==",
+ "requires": {
+ "dtype": "^2.0.0"
+ }
+ },
+ "flip-pixels": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/flip-pixels/-/flip-pixels-1.0.2.tgz",
+ "integrity": "sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA=="
+ },
+ "flux": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz",
+ "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==",
+ "requires": {
+ "fbemitter": "^3.0.0",
+ "fbjs": "^3.0.1"
+ },
+ "dependencies": {
+ "fbjs": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz",
+ "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==",
+ "requires": {
+ "cross-fetch": "^3.1.5",
+ "fbjs-css-vars": "^1.0.0",
+ "loose-envify": "^1.0.0",
+ "object-assign": "^4.1.0",
+ "promise": "^7.1.1",
+ "setimmediate": "^1.0.5",
+ "ua-parser-js": "^0.7.30"
+ }
+ }
+ }
+ },
+ "follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
+ },
+ "font-atlas": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz",
+ "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==",
+ "requires": {
+ "css-font": "^1.0.0"
+ }
+ },
+ "font-measure": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz",
+ "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==",
+ "requires": {
+ "css-font": "^1.2.0"
+ }
+ },
+ "for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "requires": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "fork-ts-checker-webpack-plugin": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz",
+ "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==",
+ "requires": {
+ "@babel/code-frame": "^7.8.3",
+ "@types/json-schema": "^7.0.5",
+ "chalk": "^4.1.0",
+ "chokidar": "^3.4.2",
+ "cosmiconfig": "^6.0.0",
+ "deepmerge": "^4.2.2",
+ "fs-extra": "^9.0.0",
+ "glob": "^7.1.6",
+ "memfs": "^3.1.2",
+ "minimatch": "^3.0.4",
+ "schema-utils": "2.7.0",
+ "semver": "^7.3.2",
+ "tapable": "^1.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ }
+ },
+ "fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "schema-utils": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+ "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+ "requires": {
+ "@types/json-schema": "^7.0.4",
+ "ajv": "^6.12.2",
+ "ajv-keywords": "^3.4.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "tapable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
+ }
+ }
+ },
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "form-data-encoder": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz",
+ "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="
+ },
+ "format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
+ "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="
+ },
+ "formdata-node": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz",
+ "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==",
+ "requires": {
+ "node-domexception": "1.0.0",
+ "web-streams-polyfill": "4.0.0-beta.3"
+ }
+ },
+ "forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
+ },
+ "fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA=="
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
+ },
+ "from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "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"
+ }
+ },
+ "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=="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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==",
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "fs-monkey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
+ "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q=="
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.0",
+ "functions-have-names": "^1.2.2"
+ }
+ },
+ "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=="
+ },
+ "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=="
+ },
+ "geojson-vt": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz",
+ "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg=="
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+ },
+ "get-canvas-context": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz",
+ "integrity": "sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A=="
+ },
+ "get-intrinsic": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
+ "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "get-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
+ },
+ "get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="
+ },
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "gl-mat4": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz",
+ "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA=="
+ },
+ "gl-matrix": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz",
+ "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="
+ },
+ "gl-text": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.3.1.tgz",
+ "integrity": "sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w==",
+ "requires": {
+ "bit-twiddle": "^1.0.2",
+ "color-normalize": "^1.5.0",
+ "css-font": "^1.2.0",
+ "detect-kerning": "^2.1.2",
+ "es6-weak-map": "^2.0.3",
+ "flatten-vertex-data": "^1.0.2",
+ "font-atlas": "^2.1.0",
+ "font-measure": "^1.2.2",
+ "gl-util": "^3.1.2",
+ "is-plain-obj": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "parse-rect": "^1.2.0",
+ "parse-unit": "^1.0.1",
+ "pick-by-alias": "^1.2.0",
+ "regl": "^2.0.0",
+ "to-px": "^1.0.1",
+ "typedarray-pool": "^1.1.0"
+ }
+ },
+ "gl-util": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz",
+ "integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==",
+ "requires": {
+ "is-browser": "^2.0.1",
+ "is-firefox": "^1.0.3",
+ "is-plain-obj": "^1.1.0",
+ "number-is-integer": "^1.0.1",
+ "object-assign": "^4.1.0",
+ "pick-by-alias": "^1.2.0",
+ "weak-map": "^1.0.5"
+ }
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "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"
+ }
+ },
+ "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==",
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+ },
+ "global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "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==",
+ "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==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+ },
+ "globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "requires": {
+ "define-properties": "^1.1.3"
+ }
+ },
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "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"
+ }
+ },
+ "glsl-inject-defines": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz",
+ "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==",
+ "requires": {
+ "glsl-token-inject-block": "^1.0.0",
+ "glsl-token-string": "^1.0.1",
+ "glsl-tokenizer": "^2.0.2"
+ }
+ },
+ "glsl-resolve": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz",
+ "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==",
+ "requires": {
+ "resolve": "^0.6.1",
+ "xtend": "^2.1.2"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz",
+ "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg=="
+ },
+ "xtend": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz",
+ "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw=="
+ }
+ }
+ },
+ "glsl-token-assignments": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz",
+ "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ=="
+ },
+ "glsl-token-defines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz",
+ "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==",
+ "requires": {
+ "glsl-tokenizer": "^2.0.0"
+ }
+ },
+ "glsl-token-depth": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz",
+ "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg=="
+ },
+ "glsl-token-descope": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz",
+ "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==",
+ "requires": {
+ "glsl-token-assignments": "^2.0.0",
+ "glsl-token-depth": "^1.1.0",
+ "glsl-token-properties": "^1.0.0",
+ "glsl-token-scope": "^1.1.0"
+ }
+ },
+ "glsl-token-inject-block": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz",
+ "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA=="
+ },
+ "glsl-token-properties": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz",
+ "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA=="
+ },
+ "glsl-token-scope": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz",
+ "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A=="
+ },
+ "glsl-token-string": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz",
+ "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg=="
+ },
+ "glsl-token-whitespace-trim": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz",
+ "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ=="
+ },
+ "glsl-tokenizer": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz",
+ "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==",
+ "requires": {
+ "through2": "^0.6.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
+ "glslify": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz",
+ "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==",
+ "requires": {
+ "bl": "^2.2.1",
+ "concat-stream": "^1.5.2",
+ "duplexify": "^3.4.5",
+ "falafel": "^2.1.0",
+ "from2": "^2.3.0",
+ "glsl-resolve": "0.0.1",
+ "glsl-token-whitespace-trim": "^1.0.0",
+ "glslify-bundle": "^5.0.0",
+ "glslify-deps": "^1.2.5",
+ "minimist": "^1.2.5",
+ "resolve": "^1.1.5",
+ "stack-trace": "0.0.9",
+ "static-eval": "^2.0.5",
+ "through2": "^2.0.1",
+ "xtend": "^4.0.0"
+ }
+ },
+ "glslify-bundle": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz",
+ "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==",
+ "requires": {
+ "glsl-inject-defines": "^1.0.1",
+ "glsl-token-defines": "^1.0.0",
+ "glsl-token-depth": "^1.1.1",
+ "glsl-token-descope": "^1.0.2",
+ "glsl-token-scope": "^1.1.1",
+ "glsl-token-string": "^1.0.1",
+ "glsl-token-whitespace-trim": "^1.0.0",
+ "glsl-tokenizer": "^2.0.2",
+ "murmurhash-js": "^1.0.0",
+ "shallow-copy": "0.0.1"
+ }
+ },
+ "glslify-deps": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz",
+ "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==",
+ "requires": {
+ "@choojs/findup": "^0.2.0",
+ "events": "^3.2.0",
+ "glsl-resolve": "0.0.1",
+ "glsl-tokenizer": "^2.0.0",
+ "graceful-fs": "^4.1.2",
+ "inherits": "^2.0.1",
+ "map-limit": "0.0.1",
+ "resolve": "^1.0.0"
+ }
+ },
+ "gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "requires": {
+ "get-intrinsic": "^1.1.3"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
+ },
+ "grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ=="
+ },
+ "grid-index": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz",
+ "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA=="
+ },
+ "gzip-size": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+ "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+ "requires": {
+ "duplexer": "^0.1.2"
+ }
+ },
+ "handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
+ },
+ "handsontable": {
+ "version": "12.3.1",
+ "resolved": "https://registry.npmjs.org/handsontable/-/handsontable-12.3.1.tgz",
+ "integrity": "sha512-gm6dUoOwWo4ppwBnWFWn3VKSD2SkM00rwnI8JCU4TpsuDebkmqQqBcXZVPLqoOnB2USm/5t64/R4kXqJPaMB2g==",
+ "requires": {
+ "@types/pikaday": "1.7.4",
+ "core-js": "^3.0.0",
+ "dompurify": "^2.1.1",
+ "hyperformula": "^2.0.0",
+ "moment": "2.29.4",
+ "numbro": "2.1.2",
+ "pikaday": "1.8.2"
+ }
+ },
+ "harmony-reflect": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz",
+ "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g=="
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "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=="
+ },
+ "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=="
+ },
+ "has-hover": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz",
+ "integrity": "sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg==",
+ "requires": {
+ "is-browser": "^2.0.1"
+ }
+ },
+ "has-passive-events": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz",
+ "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==",
+ "requires": {
+ "is-browser": "^2.0.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "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=="
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
+ "has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "requires": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ }
+ },
+ "hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "hast-util-parse-selector": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
+ "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="
+ },
+ "hastscript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz",
+ "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
+ "requires": {
+ "@types/hast": "^2.0.0",
+ "comma-separated-tokens": "^1.0.0",
+ "hast-util-parse-selector": "^2.0.0",
+ "property-information": "^5.0.0",
+ "space-separated-tokens": "^1.0.0"
+ }
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
+ },
+ "highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="
+ },
+ "history": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz",
+ "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==",
+ "requires": {
+ "@babel/runtime": "^7.7.6"
+ }
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "requires": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "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"
+ }
+ },
+ "hoopy": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
+ "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ=="
+ },
+ "hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "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"
+ }
+ },
+ "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=="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "hsluv": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz",
+ "integrity": "sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ=="
+ },
+ "html-encoding-sniffer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+ "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+ "requires": {
+ "whatwg-encoding": "^1.0.5"
+ }
+ },
+ "html-entities": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
+ "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="
+ },
+ "html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
+ },
+ "html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
+ "requires": {
+ "camel-case": "^4.1.2",
+ "clean-css": "^5.2.2",
+ "commander": "^8.3.0",
+ "he": "^1.2.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.10.0"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="
+ }
+ }
+ },
+ "html-parse-stringify": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
+ "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
+ "requires": {
+ "void-elements": "3.1.0"
+ }
+ },
+ "html-webpack-plugin": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz",
+ "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==",
+ "requires": {
+ "@types/html-minifier-terser": "^6.0.0",
+ "html-minifier-terser": "^6.0.2",
+ "lodash": "^4.17.21",
+ "pretty-error": "^4.0.0",
+ "tapable": "^2.0.0"
+ }
+ },
+ "htmlparser2": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ },
+ "dependencies": {
+ "dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
+ },
+ "domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "requires": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ }
+ }
+ }
+ },
+ "http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw=="
+ },
+ "http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "requires": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ }
+ },
+ "http-parser-js": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz",
+ "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q=="
+ },
+ "http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "requires": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "requires": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "http-proxy-middleware": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
+ "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
+ "requires": {
+ "@types/http-proxy": "^1.17.8",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "dependencies": {
+ "is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA=="
+ }
+ }
+ },
+ "https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg=="
+ },
+ "https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
+ },
+ "husky": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz",
+ "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==",
+ "dev": true
+ },
+ "hyperformula": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/hyperformula/-/hyperformula-2.3.0.tgz",
+ "integrity": "sha512-23hP3/+jq8PzEqcu94JYRugaPU2VGSg2OOuYKeVTiPh7c6JYw71wWteXr2Q3CbSiccmtjfF3EqaA8NrmkJyA1w==",
+ "optional": true,
+ "requires": {
+ "chevrotain": "^6.5.0",
+ "tiny-emitter": "^2.1.0",
+ "unorm": "^1.6.0"
+ }
+ },
+ "hyphenate-style-name": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
+ "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
+ },
+ "i18next": {
+ "version": "22.4.10",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.10.tgz",
+ "integrity": "sha512-3EqgGK6fAJRjnGgfkNSStl4mYLCjUoJID338yVyLMj5APT67HUtWoqSayZewiiC5elzMUB1VEUwcmSCoeQcNEA==",
+ "requires": {
+ "@babel/runtime": "^7.20.6"
+ }
+ },
+ "i18next-browser-languagedetector": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.1.tgz",
+ "integrity": "sha512-Pa5kFwaczXJAeHE56CHG2aWzFBMJNUNghf0Pm4SwSrEMps/PTKqW90EYWlIvhuYStf3Sn1K0vw+gH3+TLdkH1g==",
+ "requires": {
+ "@babel/runtime": "^7.19.4"
+ }
+ },
+ "i18next-xhr-backend": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/i18next-xhr-backend/-/i18next-xhr-backend-3.2.2.tgz",
+ "integrity": "sha512-OtRf2Vo3IqAxsttQbpjYnmMML12IMB5e0fc5B7qKJFLScitYaXa1OhMX0n0X/3vrfFlpHL9Ro/H+ps4Ej2j7QQ==",
+ "requires": {
+ "@babel/runtime": "^7.5.5"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="
+ },
+ "idb": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
+ "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="
+ },
+ "identity-obj-proxy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
+ "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==",
+ "requires": {
+ "harmony-reflect": "^1.4.6"
+ }
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
+ "ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ=="
+ },
+ "image-palette": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/image-palette/-/image-palette-2.1.0.tgz",
+ "integrity": "sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ==",
+ "requires": {
+ "color-id": "^1.1.0",
+ "pxls": "^2.0.0",
+ "quantize": "^1.0.2"
+ }
+ },
+ "immer": {
+ "version": "9.0.19",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz",
+ "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ=="
+ },
+ "immutable": {
+ "version": "3.7.6",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz",
+ "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw=="
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "import-local": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+ "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+ "requires": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "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=="
+ },
+ "inline-style-prefixer": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz",
+ "integrity": "sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==",
+ "requires": {
+ "css-in-js-utils": "^3.1.0",
+ "fast-loops": "^1.1.3"
+ }
+ },
+ "internal-slot": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+ "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+ "requires": {
+ "get-intrinsic": "^1.2.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "ipaddr.js": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
+ "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng=="
+ },
+ "is-alphabetical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="
+ },
+ "is-alphanumerical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+ "requires": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ }
+ },
+ "is-arguments": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
+ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-array-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz",
+ "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ },
+ "is-base64": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-base64/-/is-base64-0.1.0.tgz",
+ "integrity": "sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg=="
+ },
+ "is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "requires": {
+ "has-bigints": "^1.0.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-blob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz",
+ "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-browser": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz",
+ "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ=="
+ },
+ "is-buffer": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
+ },
+ "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=="
+ },
+ "is-ci": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+ "requires": {
+ "ci-info": "^2.0.0"
+ },
+ "dependencies": {
+ "ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+ }
+ }
+ },
+ "is-core-module": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "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==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-decimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="
+ },
+ "is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
+ },
+ "is-finite": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w=="
+ },
+ "is-firefox": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz",
+ "integrity": "sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA=="
+ },
+ "is-float-array": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-float-array/-/is-float-array-1.0.0.tgz",
+ "integrity": "sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ=="
+ },
+ "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=="
+ },
+ "is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="
+ },
+ "is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-hexadecimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="
+ },
+ "is-iexplorer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz",
+ "integrity": "sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg=="
+ },
+ "is-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg=="
+ },
+ "is-mobile": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-3.1.1.tgz",
+ "integrity": "sha512-RRoXXR2HNFxNkUnxtaBdGBXtFlUMFa06S0NUKf/LCF+MuGLu13gi9iBCkoEmc6+rpXuwi5Mso5V8Zf7mNynMBQ=="
+ },
+ "is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="
+ },
+ "is-nan": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
+ "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "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=="
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ },
+ "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==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg=="
+ },
+ "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=="
+ },
+ "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=="
+ },
+ "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=="
+ },
+ "is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA=="
+ },
+ "is-root": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
+ "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg=="
+ },
+ "is-set": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
+ },
+ "is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-string-blank": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz",
+ "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw=="
+ },
+ "is-svg-path": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz",
+ "integrity": "sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg=="
+ },
+ "is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "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"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+ },
+ "is-weakmap": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-weakset": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
+ "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "requires": {
+ "is-docker": "^2.0.0"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "istanbul-lib-coverage": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw=="
+ },
+ "istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "requires": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "requires": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "requires": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "istanbul-reports": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+ "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+ "requires": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ }
+ },
+ "jake": {
+ "version": "10.8.5",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
+ "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
+ "requires": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.1",
+ "minimatch": "^3.0.4"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz",
+ "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==",
+ "requires": {
+ "@jest/core": "^27.5.1",
+ "import-local": "^3.0.2",
+ "jest-cli": "^27.5.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "jest-cli": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz",
+ "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
+ "requires": {
+ "@jest/core": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "import-local": "^3.0.2",
+ "jest-config": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "prompts": "^2.0.1",
+ "yargs": "^16.2.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-changed-files": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
+ "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
+ "requires": {
+ "@jest/types": "^27.5.1",
+ "execa": "^5.0.0",
+ "throat": "^6.0.1"
+ }
+ },
+ "jest-circus": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz",
+ "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
+ "requires": {
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^0.7.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3",
+ "throat": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-config": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz",
+ "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
+ "requires": {
+ "@babel/core": "^7.8.0",
+ "@jest/test-sequencer": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "babel-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.1",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-jasmine2": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "requires": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-docblock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz",
+ "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
+ "requires": {
+ "detect-newline": "^3.0.0"
+ }
+ },
+ "jest-each": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz",
+ "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
+ "requires": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-environment-jsdom": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
+ "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
+ "requires": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jsdom": "^16.6.0"
+ }
+ },
+ "jest-environment-node": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
+ "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
+ "requires": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ }
+ },
+ "jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw=="
+ },
+ "jest-haste-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
+ "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
+ "requires": {
+ "@jest/types": "^27.5.1",
+ "@types/graceful-fs": "^4.1.2",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "fsevents": "^2.3.2",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^27.5.1",
+ "jest-serializer": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.7"
+ }
+ },
+ "jest-jasmine2": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
+ "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
+ "requires": {
+ "@jest/environment": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "throat": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-leak-detector": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
+ "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
+ "requires": {
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ }
+ },
+ "jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "requires": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "requires": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-mock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
+ "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "requires": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*"
+ }
+ },
+ "jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w=="
+ },
+ "jest-regex-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg=="
+ },
+ "jest-resolve": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz",
+ "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
+ "requires": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^1.1.0",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-resolve-dependencies": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
+ "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
+ "requires": {
+ "@jest/types": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-snapshot": "^27.5.1"
+ }
+ },
+ "jest-runner": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz",
+ "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
+ "requires": {
+ "@jest/console": "^27.5.1",
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-leak-detector": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "source-map-support": "^0.5.6",
+ "throat": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-runtime": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz",
+ "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
+ "requires": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/globals": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "execa": "^5.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-serializer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz",
+ "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
+ "requires": {
+ "@types/node": "*",
+ "graceful-fs": "^4.2.9"
+ }
+ },
+ "jest-snapshot": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
+ "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
+ "requires": {
+ "@babel/core": "^7.7.2",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/traverse": "^7.7.2",
+ "@babel/types": "^7.0.0",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__traverse": "^7.0.4",
+ "@types/prettier": "^2.1.5",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^27.5.1",
+ "semver": "^7.3.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-sonar-reporter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz",
+ "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==",
+ "dev": true,
+ "requires": {
+ "xml": "^1.0.1"
+ }
+ },
+ "jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "requires": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-validate": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz",
+ "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
+ "requires": {
+ "@jest/types": "^27.5.1",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "leven": "^3.1.0",
+ "pretty-format": "^27.5.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-watch-typeahead": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz",
+ "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==",
+ "requires": {
+ "ansi-escapes": "^4.3.1",
+ "chalk": "^4.0.0",
+ "jest-regex-util": "^28.0.0",
+ "jest-watcher": "^28.0.0",
+ "slash": "^4.0.0",
+ "string-length": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "dependencies": {
+ "@jest/console": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz",
+ "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==",
+ "requires": {
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^28.1.3",
+ "jest-util": "^28.1.3",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+ }
+ }
+ },
+ "@jest/test-result": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz",
+ "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==",
+ "requires": {
+ "@jest/console": "^28.1.3",
+ "@jest/types": "^28.1.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ }
+ },
+ "@jest/types": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz",
+ "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==",
+ "requires": {
+ "@jest/schemas": "^28.1.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "17.0.22",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz",
+ "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==",
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "emittery": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz",
+ "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "jest-message-util": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz",
+ "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==",
+ "requires": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^28.1.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^28.1.3",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "dependencies": {
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+ }
+ }
+ },
+ "jest-regex-util": {
+ "version": "28.0.2",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz",
+ "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw=="
+ },
+ "jest-util": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz",
+ "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==",
+ "requires": {
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ }
+ },
+ "jest-watcher": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz",
+ "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==",
+ "requires": {
+ "@jest/test-result": "^28.1.3",
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.10.2",
+ "jest-util": "^28.1.3",
+ "string-length": "^4.0.1"
+ },
+ "dependencies": {
+ "string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "requires": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ }
+ }
+ },
+ "pretty-format": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz",
+ "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==",
+ "requires": {
+ "@jest/schemas": "^28.1.3",
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="
+ }
+ }
+ },
+ "react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ },
+ "slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew=="
+ },
+ "string-length": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz",
+ "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==",
+ "requires": {
+ "char-regex": "^2.0.0",
+ "strip-ansi": "^7.0.1"
+ },
+ "dependencies": {
+ "char-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz",
+ "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw=="
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
+ "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+ "requires": {
+ "ansi-regex": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="
+ }
+ }
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-watcher": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
+ "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
+ "requires": {
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "jest-util": "^27.5.1",
+ "string-length": "^4.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "requires": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "js-cookie": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz",
+ "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw=="
+ },
+ "js-file-download": {
+ "version": "0.4.12",
+ "resolved": "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz",
+ "integrity": "sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg=="
+ },
+ "js-sdsl": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+ "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ=="
+ },
+ "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": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsdom": {
+ "version": "16.7.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
+ "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
+ "requires": {
+ "abab": "^2.0.5",
+ "acorn": "^8.2.4",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.4.4",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^2.0.0",
+ "decimal.js": "^10.2.1",
+ "domexception": "^2.0.1",
+ "escodegen": "^2.0.0",
+ "form-data": "^3.0.0",
+ "html-encoding-sniffer": "^2.0.1",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "^5.0.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "6.0.1",
+ "saxes": "^5.0.1",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^2.0.0",
+ "webidl-conversions": "^6.1.0",
+ "whatwg-encoding": "^1.0.5",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.5.0",
+ "ws": "^7.4.6",
+ "xml-name-validator": "^3.0.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw=="
+ },
+ "escodegen": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+ "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+ "requires": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+ },
+ "form-data": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
+ "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "optional": true
+ },
+ "tr46": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
+ "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+ "requires": {
+ "punycode": "^2.1.1"
+ }
+ },
+ "webidl-conversions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="
+ },
+ "whatwg-url": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
+ "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+ "requires": {
+ "lodash": "^4.7.0",
+ "tr46": "^2.1.0",
+ "webidl-conversions": "^6.1.0"
+ }
+ }
+ }
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+ },
+ "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=="
+ },
+ "json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+ },
+ "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=="
+ },
+ "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=="
+ },
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
+ "jsonpointer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
+ "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ=="
+ },
+ "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==",
+ "requires": {
+ "array-includes": "^3.1.5",
+ "object.assign": "^4.1.3"
+ }
+ },
+ "jwt-decode": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
+ "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
+ },
+ "kdbush": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz",
+ "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew=="
+ },
+ "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=="
+ },
+ "klaw-sync": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
+ "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
+ "requires": {
+ "graceful-fs": "^4.1.11"
+ }
+ },
+ "kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
+ },
+ "klona": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="
+ },
+ "language-subtag-registry": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w=="
+ },
+ "language-tags": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
+ "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
+ "requires": {
+ "language-subtag-registry": "~0.3.2"
+ }
+ },
+ "leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "lilconfig": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
+ "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg=="
+ },
+ "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=="
+ },
+ "loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg=="
+ },
+ "loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ }
+ },
+ "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==",
+ "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-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "lodash.curry": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz",
+ "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA=="
+ },
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+ },
+ "lodash.flow": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz",
+ "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw=="
+ },
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="
+ },
+ "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=="
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="
+ },
+ "lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
+ },
+ "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"
+ }
+ },
+ "lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "requires": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "lowlight": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz",
+ "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==",
+ "requires": {
+ "fault": "^1.0.0",
+ "highlight.js": "~10.7.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "requires": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "requires": {
+ "semver": "^6.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "requires": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "map-limit": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz",
+ "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==",
+ "requires": {
+ "once": "~1.3.0"
+ },
+ "dependencies": {
+ "once": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ }
+ }
+ },
+ "mapbox-gl": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.10.1.tgz",
+ "integrity": "sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg==",
+ "requires": {
+ "@mapbox/geojson-rewind": "^0.5.0",
+ "@mapbox/geojson-types": "^1.0.2",
+ "@mapbox/jsonlint-lines-primitives": "^2.0.2",
+ "@mapbox/mapbox-gl-supported": "^1.5.0",
+ "@mapbox/point-geometry": "^0.1.0",
+ "@mapbox/tiny-sdf": "^1.1.1",
+ "@mapbox/unitbezier": "^0.0.0",
+ "@mapbox/vector-tile": "^1.3.1",
+ "@mapbox/whoots-js": "^3.1.0",
+ "csscolorparser": "~1.0.3",
+ "earcut": "^2.2.2",
+ "geojson-vt": "^3.2.1",
+ "gl-matrix": "^3.2.1",
+ "grid-index": "^1.1.0",
+ "minimist": "^1.2.5",
+ "murmurhash-js": "^1.0.0",
+ "pbf": "^3.2.1",
+ "potpack": "^1.0.1",
+ "quickselect": "^2.0.0",
+ "rw": "^1.3.3",
+ "supercluster": "^7.0.0",
+ "tinyqueue": "^2.0.3",
+ "vt-pbf": "^3.1.1"
+ }
+ },
+ "material-colors": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz",
+ "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg=="
+ },
+ "math-log2": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz",
+ "integrity": "sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA=="
+ },
+ "md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "mdn-data": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
+ },
+ "memfs": {
+ "version": "3.4.13",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz",
+ "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==",
+ "requires": {
+ "fs-monkey": "^1.0.3"
+ }
+ },
+ "memoize-one": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
+ "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
+ },
+ "micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "requires": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "requires": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+ },
+ "mini-css-extract-plugin": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz",
+ "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==",
+ "requires": {
+ "schema-utils": "^4.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "requires": {
+ "fast-deep-equal": "^3.1.3"
+ }
+ },
+ "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=="
+ },
+ "schema-utils": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+ "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.8.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.0.0"
+ }
+ }
+ }
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
+ },
+ "mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "requires": {
+ "minimist": "^1.2.6"
+ }
+ },
+ "moment": {
+ "version": "2.29.4",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
+ "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
+ },
+ "mouse-change": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz",
+ "integrity": "sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==",
+ "requires": {
+ "mouse-event": "^1.0.0"
+ }
+ },
+ "mouse-event": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz",
+ "integrity": "sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw=="
+ },
+ "mouse-event-offset": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz",
+ "integrity": "sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w=="
+ },
+ "mouse-wheel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz",
+ "integrity": "sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==",
+ "requires": {
+ "right-now": "^1.0.0",
+ "signum": "^1.0.0",
+ "to-px": "^1.0.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "multicast-dns": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
+ "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
+ "requires": {
+ "dns-packet": "^5.2.2",
+ "thunky": "^1.0.2"
+ }
+ },
+ "mumath": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/mumath/-/mumath-3.3.4.tgz",
+ "integrity": "sha512-VAFIOG6rsxoc7q/IaY3jdjmrsuX9f15KlRLYTHmixASBZkZEKC1IFqE2BC5CdhXmK6WLM1Re33z//AGmeRI6FA==",
+ "requires": {
+ "almost-equal": "^1.1.0"
+ }
+ },
+ "murmurhash-js": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz",
+ "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw=="
+ },
+ "nano-css": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.5.tgz",
+ "integrity": "sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==",
+ "requires": {
+ "css-tree": "^1.1.2",
+ "csstype": "^3.0.6",
+ "fastest-stable-stringify": "^2.0.2",
+ "inline-style-prefixer": "^6.0.0",
+ "rtl-css-js": "^1.14.0",
+ "sourcemap-codec": "^1.4.8",
+ "stacktrace-js": "^2.0.2",
+ "stylis": "^4.0.6"
+ },
+ "dependencies": {
+ "css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "requires": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ }
+ },
+ "mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
+ },
+ "native-promise-only": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
+ "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg=="
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
+ },
+ "natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g=="
+ },
+ "needle": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
+ "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==",
+ "requires": {
+ "debug": "^3.2.6",
+ "iconv-lite": "^0.4.4",
+ "sax": "^1.2.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
+ },
+ "neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+ },
+ "next-tick": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+ },
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+ },
+ "no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "requires": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
+ },
+ "node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "requires": {
+ "whatwg-url": "^5.0.0"
+ }
+ },
+ "node-forge": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
+ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="
+ },
+ "node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="
+ },
+ "node-releases": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
+ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w=="
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="
+ },
+ "normalize-svg-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz",
+ "integrity": "sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA=="
+ },
+ "normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="
+ },
+ "notistack": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.8.tgz",
+ "integrity": "sha512-/IY14wkFp5qjPgKNvAdfL5Jp6q90+MjgKTPh4c81r/lW70KeuX6b9pE/4f8L4FG31cNudbN9siiFS5ql1aSLRw==",
+ "requires": {
+ "clsx": "^1.1.0",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "nth-check": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "requires": {
+ "boolbase": "~1.0.0"
+ }
+ },
+ "number-is-integer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz",
+ "integrity": "sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg==",
+ "requires": {
+ "is-finite": "^1.0.1"
+ }
+ },
+ "numbro": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.1.2.tgz",
+ "integrity": "sha512-7w833BxZmKGLE9HI0aREtNVRVH6WTYUUlWf4qgA5gKNhPQ4F/MRZ14sc0v8eoLORprk9ZTVwYaLwj8N3Zgxwiw==",
+ "requires": {
+ "bignumber.js": "^8.0.1"
+ }
+ },
+ "nwsapi": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz",
+ "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw=="
+ },
+ "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-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="
+ },
+ "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=="
+ },
+ "object-is": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "object.entries": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
+ "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "object.fromentries": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
+ "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "object.getownpropertydescriptors": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz",
+ "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==",
+ "requires": {
+ "array.prototype.reduce": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "object.hasown": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
+ "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
+ "requires": {
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
+ },
+ "on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "requires": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ }
+ },
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ }
+ },
+ "os": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz",
+ "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ=="
+ },
+ "os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A=="
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "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==",
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
+ "p-retry": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
+ "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
+ "requires": {
+ "@types/retry": "0.12.0",
+ "retry": "^0.13.1"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+ },
+ "param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "requires": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "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==",
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parenthesis": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz",
+ "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw=="
+ },
+ "parse-asn1": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+ "requires": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "parse-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+ "requires": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "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"
+ }
+ },
+ "parse-rect": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz",
+ "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==",
+ "requires": {
+ "pick-by-alias": "^1.2.0"
+ }
+ },
+ "parse-svg-path": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz",
+ "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ=="
+ },
+ "parse-unit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz",
+ "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg=="
+ },
+ "parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "patch-package": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz",
+ "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==",
+ "requires": {
+ "@yarnpkg/lockfile": "^1.1.0",
+ "chalk": "^4.1.2",
+ "cross-spawn": "^6.0.5",
+ "find-yarn-workspace-root": "^2.0.0",
+ "fs-extra": "^9.0.0",
+ "is-ci": "^2.0.0",
+ "klaw-sync": "^6.0.0",
+ "minimist": "^1.2.6",
+ "open": "^7.4.2",
+ "rimraf": "^2.6.3",
+ "semver": "^5.6.0",
+ "slash": "^2.0.0",
+ "tmp": "^0.0.33",
+ "yaml": "^1.10.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "open": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+ "requires": {
+ "is-docker": "^2.0.0",
+ "is-wsl": "^2.1.1"
+ }
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="
+ },
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="
+ },
+ "slash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "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=="
+ },
+ "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=="
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ },
+ "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=="
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+ },
+ "pbf": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz",
+ "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==",
+ "requires": {
+ "ieee754": "^1.1.12",
+ "resolve-protobuf-schema": "^2.1.0"
+ }
+ },
+ "pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "requires": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+ },
+ "pick-by-alias": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz",
+ "integrity": "sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw=="
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="
+ },
+ "pikaday": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/pikaday/-/pikaday-1.8.2.tgz",
+ "integrity": "sha512-TNtsE+34BIax3WtkB/qqu5uepV1McKYEgvL3kWzU7aqPCpMEN6rBF3AOwu4WCwAealWlBGobXny/9kJb49C1ew=="
+ },
+ "pirates": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
+ "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ=="
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "requires": {
+ "find-up": "^4.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ }
+ }
+ },
+ "pkg-up": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
+ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
+ "requires": {
+ "find-up": "^3.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="
+ }
+ }
+ },
+ "plotly.js": {
+ "version": "2.18.2",
+ "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.18.2.tgz",
+ "integrity": "sha512-Z8ZgWNfjeIEYxt/PCfpKZoWMxWylGYiuz28W2frUwEeTEcnnspi+JveC3IWYGmlq6dS3AWlJiZOJWJgdrJjCmA==",
+ "requires": {
+ "@plotly/d3": "3.8.1",
+ "@plotly/d3-sankey": "0.7.2",
+ "@plotly/d3-sankey-circular": "0.33.1",
+ "@turf/area": "^6.4.0",
+ "@turf/bbox": "^6.4.0",
+ "@turf/centroid": "^6.0.2",
+ "canvas-fit": "^1.5.0",
+ "color-alpha": "1.0.4",
+ "color-normalize": "1.5.0",
+ "color-parse": "1.3.8",
+ "color-rgba": "2.1.1",
+ "country-regex": "^1.1.0",
+ "d3-force": "^1.2.1",
+ "d3-format": "^1.4.5",
+ "d3-geo": "^1.12.1",
+ "d3-geo-projection": "^2.9.0",
+ "d3-hierarchy": "^1.1.9",
+ "d3-interpolate": "^3.0.1",
+ "d3-time": "^1.1.0",
+ "d3-time-format": "^2.2.3",
+ "fast-isnumeric": "^1.1.4",
+ "gl-mat4": "^1.2.0",
+ "gl-text": "^1.3.1",
+ "glslify": "^7.1.1",
+ "has-hover": "^1.0.1",
+ "has-passive-events": "^1.0.0",
+ "is-mobile": "^3.1.1",
+ "mapbox-gl": "1.10.1",
+ "mouse-change": "^1.4.0",
+ "mouse-event-offset": "^3.0.2",
+ "mouse-wheel": "^1.2.0",
+ "native-promise-only": "^0.8.1",
+ "parse-svg-path": "^0.1.2",
+ "point-in-polygon": "^1.1.0",
+ "polybooljs": "^1.2.0",
+ "probe-image-size": "^7.2.3",
+ "regl": "npm:@plotly/regl@^2.1.2",
+ "regl-error2d": "^2.0.12",
+ "regl-line2d": "^3.1.2",
+ "regl-scatter2d": "^3.2.8",
+ "regl-splom": "^1.0.14",
+ "strongly-connected-components": "^1.0.1",
+ "superscript-text": "^1.0.0",
+ "svg-path-sdf": "^1.1.3",
+ "tinycolor2": "^1.4.2",
+ "to-px": "1.0.1",
+ "topojson-client": "^3.1.0",
+ "webgl-context": "^2.2.0",
+ "world-calendars": "^1.0.3"
+ },
+ "dependencies": {
+ "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"
+ }
+ }
+ }
+ },
+ "point-in-polygon": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz",
+ "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw=="
+ },
+ "polybooljs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.0.tgz",
+ "integrity": "sha512-mKjR5nolISvF+q2BtC1fi/llpxBPTQ3wLWN8+ldzdw2Hocpc8C72ZqnamCM4Z6z+68GVVjkeM01WJegQmZ8MEQ=="
+ },
+ "postcss": {
+ "version": "8.4.21",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+ "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
+ "requires": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "postcss-attribute-case-insensitive": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz",
+ "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "postcss-browser-comments": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz",
+ "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg=="
+ },
+ "postcss-calc": {
+ "version": "8.2.4",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
+ "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.9",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-clamp": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz",
+ "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-color-functional-notation": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz",
+ "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-color-hex-alpha": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz",
+ "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-color-rebeccapurple": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz",
+ "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-colormin": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz",
+ "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==",
+ "requires": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.1",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-convert-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz",
+ "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==",
+ "requires": {
+ "browserslist": "^4.21.4",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-custom-media": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz",
+ "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-custom-properties": {
+ "version": "12.1.11",
+ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz",
+ "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-custom-selectors": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz",
+ "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.4"
+ }
+ },
+ "postcss-dir-pseudo-class": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz",
+ "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "postcss-discard-comments": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
+ "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ=="
+ },
+ "postcss-discard-duplicates": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
+ "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw=="
+ },
+ "postcss-discard-empty": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
+ "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A=="
+ },
+ "postcss-discard-overridden": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
+ "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw=="
+ },
+ "postcss-double-position-gradients": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz",
+ "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==",
+ "requires": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-env-function": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz",
+ "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-flexbugs-fixes": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz",
+ "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ=="
+ },
+ "postcss-focus-visible": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz",
+ "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.9"
+ }
+ },
+ "postcss-focus-within": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz",
+ "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.9"
+ }
+ },
+ "postcss-font-variant": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
+ "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA=="
+ },
+ "postcss-gap-properties": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz",
+ "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg=="
+ },
+ "postcss-image-set-function": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz",
+ "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-import": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
+ "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
+ "requires": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ }
+ },
+ "postcss-initial": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz",
+ "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ=="
+ },
+ "postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "requires": {
+ "camelcase-css": "^2.0.1"
+ }
+ },
+ "postcss-lab-function": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz",
+ "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==",
+ "requires": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "requires": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ }
+ },
+ "postcss-loader": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz",
+ "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==",
+ "requires": {
+ "cosmiconfig": "^7.0.0",
+ "klona": "^2.0.5",
+ "semver": "^7.3.5"
+ }
+ },
+ "postcss-logical": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz",
+ "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g=="
+ },
+ "postcss-media-minmax": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz",
+ "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ=="
+ },
+ "postcss-merge-longhand": {
+ "version": "5.1.7",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz",
+ "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^5.1.1"
+ }
+ },
+ "postcss-merge-rules": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz",
+ "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==",
+ "requires": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^3.1.0",
+ "postcss-selector-parser": "^6.0.5"
+ }
+ },
+ "postcss-minify-font-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz",
+ "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-minify-gradients": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz",
+ "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==",
+ "requires": {
+ "colord": "^2.9.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-minify-params": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz",
+ "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==",
+ "requires": {
+ "browserslist": "^4.21.4",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-minify-selectors": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
+ "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.5"
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+ "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw=="
+ },
+ "postcss-modules-local-by-default": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+ "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+ "requires": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.1.0"
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+ "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.4"
+ }
+ },
+ "postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "requires": {
+ "icss-utils": "^5.0.0"
+ }
+ },
+ "postcss-nested": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
+ "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "postcss-nesting": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz",
+ "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==",
+ "requires": {
+ "@csstools/selector-specificity": "^2.0.0",
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "postcss-normalize": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz",
+ "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==",
+ "requires": {
+ "@csstools/normalize.css": "*",
+ "postcss-browser-comments": "^4",
+ "sanitize.css": "*"
+ }
+ },
+ "postcss-normalize-charset": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
+ "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg=="
+ },
+ "postcss-normalize-display-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz",
+ "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-positions": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz",
+ "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-repeat-style": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz",
+ "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-string": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz",
+ "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-timing-functions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz",
+ "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-unicode": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz",
+ "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==",
+ "requires": {
+ "browserslist": "^4.21.4",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-url": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz",
+ "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==",
+ "requires": {
+ "normalize-url": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-whitespace": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz",
+ "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-opacity-percentage": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz",
+ "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A=="
+ },
+ "postcss-ordered-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz",
+ "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==",
+ "requires": {
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-overflow-shorthand": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz",
+ "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-page-break": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz",
+ "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ=="
+ },
+ "postcss-place": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz",
+ "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-preset-env": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz",
+ "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==",
+ "requires": {
+ "@csstools/postcss-cascade-layers": "^1.1.1",
+ "@csstools/postcss-color-function": "^1.1.1",
+ "@csstools/postcss-font-format-keywords": "^1.0.1",
+ "@csstools/postcss-hwb-function": "^1.0.2",
+ "@csstools/postcss-ic-unit": "^1.0.1",
+ "@csstools/postcss-is-pseudo-class": "^2.0.7",
+ "@csstools/postcss-nested-calc": "^1.0.0",
+ "@csstools/postcss-normalize-display-values": "^1.0.1",
+ "@csstools/postcss-oklab-function": "^1.1.1",
+ "@csstools/postcss-progressive-custom-properties": "^1.3.0",
+ "@csstools/postcss-stepped-value-functions": "^1.0.1",
+ "@csstools/postcss-text-decoration-shorthand": "^1.0.0",
+ "@csstools/postcss-trigonometric-functions": "^1.0.2",
+ "@csstools/postcss-unset-value": "^1.0.2",
+ "autoprefixer": "^10.4.13",
+ "browserslist": "^4.21.4",
+ "css-blank-pseudo": "^3.0.3",
+ "css-has-pseudo": "^3.0.4",
+ "css-prefers-color-scheme": "^6.0.3",
+ "cssdb": "^7.1.0",
+ "postcss-attribute-case-insensitive": "^5.0.2",
+ "postcss-clamp": "^4.1.0",
+ "postcss-color-functional-notation": "^4.2.4",
+ "postcss-color-hex-alpha": "^8.0.4",
+ "postcss-color-rebeccapurple": "^7.1.1",
+ "postcss-custom-media": "^8.0.2",
+ "postcss-custom-properties": "^12.1.10",
+ "postcss-custom-selectors": "^6.0.3",
+ "postcss-dir-pseudo-class": "^6.0.5",
+ "postcss-double-position-gradients": "^3.1.2",
+ "postcss-env-function": "^4.0.6",
+ "postcss-focus-visible": "^6.0.4",
+ "postcss-focus-within": "^5.0.4",
+ "postcss-font-variant": "^5.0.0",
+ "postcss-gap-properties": "^3.0.5",
+ "postcss-image-set-function": "^4.0.7",
+ "postcss-initial": "^4.0.1",
+ "postcss-lab-function": "^4.2.1",
+ "postcss-logical": "^5.0.4",
+ "postcss-media-minmax": "^5.0.0",
+ "postcss-nesting": "^10.2.0",
+ "postcss-opacity-percentage": "^1.1.2",
+ "postcss-overflow-shorthand": "^3.0.4",
+ "postcss-page-break": "^3.0.4",
+ "postcss-place": "^7.0.5",
+ "postcss-pseudo-class-any-link": "^7.1.6",
+ "postcss-replace-overflow-wrap": "^4.0.0",
+ "postcss-selector-not": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-pseudo-class-any-link": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz",
+ "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "postcss-reduce-initial": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz",
+ "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==",
+ "requires": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0"
+ }
+ },
+ "postcss-reduce-transforms": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz",
+ "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-replace-overflow-wrap": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz",
+ "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw=="
+ },
+ "postcss-selector-not": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz",
+ "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.11",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
+ "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
+ "requires": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-svgo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz",
+ "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==",
+ "requires": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^2.7.0"
+ },
+ "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=="
+ },
+ "css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ }
+ },
+ "css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "requires": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ }
+ },
+ "css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="
+ },
+ "dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
+ },
+ "domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "requires": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ }
+ },
+ "mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
+ },
+ "nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "requires": {
+ "boolbase": "^1.0.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "svgo": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
+ "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+ "requires": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^4.1.3",
+ "css-tree": "^1.1.3",
+ "csso": "^4.2.0",
+ "picocolors": "^1.0.0",
+ "stable": "^0.1.8"
+ }
+ }
+ }
+ },
+ "postcss-unique-selectors": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz",
+ "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.5"
+ }
+ },
+ "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=="
+ },
+ "potpack": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz",
+ "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w=="
+ },
+ "prettier": {
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz",
+ "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==",
+ "dev": true
+ },
+ "prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "requires": {
+ "fast-diff": "^1.1.2"
+ }
+ },
+ "pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="
+ },
+ "pretty-error": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
+ "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
+ "requires": {
+ "lodash": "^4.17.20",
+ "renderkid": "^3.0.0"
+ }
+ },
+ "pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "requires": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="
+ },
+ "react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ }
+ }
+ },
+ "prismjs": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
+ },
+ "probe-image-size": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz",
+ "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==",
+ "requires": {
+ "lodash.merge": "^4.6.2",
+ "needle": "^2.5.2",
+ "stream-parser": "~0.3.1"
+ }
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "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=="
+ },
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "requires": {
+ "asap": "~2.0.3"
+ }
+ },
+ "prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "requires": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ }
+ },
+ "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"
+ }
+ },
+ "property-information": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
+ "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
+ "requires": {
+ "xtend": "^4.0.0"
+ }
+ },
+ "protocol-buffers-schema": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
+ "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="
+ },
+ "proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "requires": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "dependencies": {
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+ }
+ }
+ },
+ "proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+ },
+ "public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "requires": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
+ },
+ "pure-color": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz",
+ "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA=="
+ },
+ "pxls": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/pxls/-/pxls-2.3.2.tgz",
+ "integrity": "sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw==",
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "compute-dims": "^1.1.0",
+ "flip-pixels": "^1.0.2",
+ "is-browser": "^2.1.0",
+ "is-buffer": "^2.0.3",
+ "to-uint8": "^1.4.1"
+ }
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="
+ },
+ "qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
+ "quantize": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz",
+ "integrity": "sha512-25P7wI2UoDbIQsQp50ARkt+5pwPsOq7G/BqvT5xAbapnRoNWMN8/p55H9TXd5MuENiJnm5XICB2H2aDZGwts7w=="
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g=="
+ },
+ "querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
+ },
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
+ },
+ "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=="
+ },
+ "quickselect": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
+ "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
+ },
+ "raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "requires": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "raf-schd": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz",
+ "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ=="
+ },
+ "ramda": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz",
+ "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA=="
+ },
+ "ramda-adjunct": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-3.4.0.tgz",
+ "integrity": "sha512-qKRgqwZzJUZmPJfGK8/uLVxQXkiftKhW6FW9NUCUlQrzsBUZBvFAZUxwH7nTRwDMg+ChRU69rVVuS/4EUgtuIg=="
+ },
+ "randexp": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz",
+ "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==",
+ "requires": {
+ "drange": "^1.0.2",
+ "ret": "^0.2.0"
+ }
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "requires": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+ },
+ "raw-body": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "requires": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
+ }
+ }
+ },
+ "react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "requires": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "react-app-polyfill": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz",
+ "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==",
+ "requires": {
+ "core-js": "^3.19.2",
+ "object-assign": "^4.1.1",
+ "promise": "^8.1.0",
+ "raf": "^3.4.1",
+ "regenerator-runtime": "^0.13.9",
+ "whatwg-fetch": "^3.6.2"
+ },
+ "dependencies": {
+ "promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "requires": {
+ "asap": "~2.0.6"
+ }
+ }
+ }
+ },
+ "react-app-rewired": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.2.1.tgz",
+ "integrity": "sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==",
+ "dev": true,
+ "requires": {
+ "semver": "^5.6.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "react-base16-styling": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz",
+ "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==",
+ "requires": {
+ "base16": "^1.0.0",
+ "lodash.curry": "^4.0.1",
+ "lodash.flow": "^3.3.0",
+ "pure-color": "^1.2.0"
+ }
+ },
+ "react-beautiful-dnd": {
+ "version": "13.1.1",
+ "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz",
+ "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==",
+ "requires": {
+ "@babel/runtime": "^7.9.2",
+ "css-box-model": "^1.2.0",
+ "memoize-one": "^5.1.1",
+ "raf-schd": "^4.0.2",
+ "react-redux": "^7.2.0",
+ "redux": "^4.0.4",
+ "use-memo-one": "^1.1.1"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ },
+ "react-redux": {
+ "version": "7.2.9",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz",
+ "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==",
+ "requires": {
+ "@babel/runtime": "^7.15.4",
+ "@types/react-redux": "^7.1.20",
+ "hoist-non-react-statics": "^3.3.2",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.7.2",
+ "react-is": "^17.0.2"
+ }
+ }
+ }
+ },
+ "react-color": {
+ "version": "2.19.3",
+ "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz",
+ "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==",
+ "requires": {
+ "@icons/material": "^0.2.4",
+ "lodash": "^4.17.15",
+ "lodash-es": "^4.17.15",
+ "material-colors": "^1.2.1",
+ "prop-types": "^15.5.10",
+ "reactcss": "^1.2.0",
+ "tinycolor2": "^1.4.1"
+ }
+ },
+ "react-copy-to-clipboard": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz",
+ "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==",
+ "requires": {
+ "copy-to-clipboard": "^3.3.1",
+ "prop-types": "^15.8.1"
+ }
+ },
+ "react-d3-graph": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/react-d3-graph/-/react-d3-graph-2.6.0.tgz",
+ "integrity": "sha512-U72didZuPuYEqAi1n2bJvnph+9MviIw2x9I0eoxb1IKk3cyEwsJV96n3RL72z/7HDsa1FOvDKuOJE7ujSNZB/Q=="
+ },
+ "react-debounce-input": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/react-debounce-input/-/react-debounce-input-3.3.0.tgz",
+ "integrity": "sha512-VEqkvs8JvY/IIZvh71Z0TC+mdbxERvYF33RcebnodlsUZ8RSgyKe2VWaHXv4+/8aoOgXLxWrdsYs2hDhcwbUgA==",
+ "requires": {
+ "lodash.debounce": "^4",
+ "prop-types": "^15.8.1"
+ }
+ },
+ "react-dev-utils": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
+ "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==",
+ "requires": {
+ "@babel/code-frame": "^7.16.0",
+ "address": "^1.1.2",
+ "browserslist": "^4.18.1",
+ "chalk": "^4.1.2",
+ "cross-spawn": "^7.0.3",
+ "detect-port-alt": "^1.1.6",
+ "escape-string-regexp": "^4.0.0",
+ "filesize": "^8.0.6",
+ "find-up": "^5.0.0",
+ "fork-ts-checker-webpack-plugin": "^6.5.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.0.4",
+ "gzip-size": "^6.0.0",
+ "immer": "^9.0.7",
+ "is-root": "^2.1.0",
+ "loader-utils": "^3.2.0",
+ "open": "^8.4.0",
+ "pkg-up": "^3.1.0",
+ "prompts": "^2.4.2",
+ "react-error-overlay": "^6.0.11",
+ "recursive-readdir": "^2.2.2",
+ "shell-quote": "^1.7.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "loader-utils": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz",
+ "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ }
+ },
+ "react-dropzone": {
+ "version": "14.2.3",
+ "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz",
+ "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==",
+ "requires": {
+ "attr-accept": "^2.2.2",
+ "file-selector": "^0.6.0",
+ "prop-types": "^15.8.1"
+ }
+ },
+ "react-error-overlay": {
+ "version": "6.0.11",
+ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz",
+ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg=="
+ },
+ "react-hook-form": {
+ "version": "7.34.0",
+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.34.0.tgz",
+ "integrity": "sha512-s0/TJ09NVlEk2JPp3yit1WnMuPNBXFmUKEQPulgDi9pYBw/ZmmAFHe6AXWq73Y+kp8ye4OcMf0Jv+i/qLPektg=="
+ },
+ "react-i18next": {
+ "version": "12.1.5",
+ "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-12.1.5.tgz",
+ "integrity": "sha512-7PQAv6DA0TcStG96fle+8RfTwxVbHVlZZJPoEszwUNvDuWpGldJmNWa3ZPesEsZQZGF6GkzwvEh6p57qpFD2gQ==",
+ "requires": {
+ "@babel/runtime": "^7.20.6",
+ "html-parse-stringify": "^3.0.1"
+ }
+ },
+ "react-immutable-proptypes": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.2.0.tgz",
+ "integrity": "sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==",
+ "requires": {
+ "invariant": "^2.2.2"
+ }
+ },
+ "react-immutable-pure-component": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/react-immutable-pure-component/-/react-immutable-pure-component-2.2.2.tgz",
+ "integrity": "sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A=="
+ },
+ "react-inspector": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-6.0.1.tgz",
+ "integrity": "sha512-cxKSeFTf7jpSSVddm66sKdolG90qURAX3g1roTeaN6x0YEbtWc8JpmFN9+yIqLNH2uEkYerWLtJZIXRIFuBKrg=="
+ },
+ "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=="
+ },
+ "react-json-view": {
+ "version": "1.21.3",
+ "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz",
+ "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==",
+ "requires": {
+ "flux": "^4.0.1",
+ "react-base16-styling": "^0.6.0",
+ "react-lifecycles-compat": "^3.0.4",
+ "react-textarea-autosize": "^8.3.2"
+ }
+ },
+ "react-lifecycles-compat": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
+ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
+ },
+ "react-plotly.js": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.6.0.tgz",
+ "integrity": "sha512-g93xcyhAVCSt9kV1svqG1clAEdL6k3U+jjuSzfTV7owaSU9Go6Ph8bl25J+jKfKvIGAEYpe4qj++WHJuc9IaeA==",
+ "requires": {
+ "prop-types": "^15.8.1"
+ }
+ },
+ "react-redux": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz",
+ "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==",
+ "requires": {
+ "@babel/runtime": "^7.12.1",
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "@types/use-sync-external-store": "^0.0.3",
+ "hoist-non-react-statics": "^3.3.2",
+ "react-is": "^18.0.0",
+ "use-sync-external-store": "^1.0.0"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ }
+ }
+ },
+ "react-refresh": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
+ "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A=="
+ },
+ "react-router": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz",
+ "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==",
+ "requires": {
+ "history": "^5.2.0"
+ }
+ },
+ "react-router-dom": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz",
+ "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==",
+ "requires": {
+ "history": "^5.2.0",
+ "react-router": "6.3.0"
+ }
+ },
+ "react-scripts": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
+ "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==",
+ "requires": {
+ "@babel/core": "^7.16.0",
+ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
+ "@svgr/webpack": "^5.5.0",
+ "babel-jest": "^27.4.2",
+ "babel-loader": "^8.2.3",
+ "babel-plugin-named-asset-import": "^0.3.8",
+ "babel-preset-react-app": "^10.0.1",
+ "bfj": "^7.0.2",
+ "browserslist": "^4.18.1",
+ "camelcase": "^6.2.1",
+ "case-sensitive-paths-webpack-plugin": "^2.4.0",
+ "css-loader": "^6.5.1",
+ "css-minimizer-webpack-plugin": "^3.2.0",
+ "dotenv": "^10.0.0",
+ "dotenv-expand": "^5.1.0",
+ "eslint": "^8.3.0",
+ "eslint-config-react-app": "^7.0.1",
+ "eslint-webpack-plugin": "^3.1.1",
+ "file-loader": "^6.2.0",
+ "fs-extra": "^10.0.0",
+ "fsevents": "^2.3.2",
+ "html-webpack-plugin": "^5.5.0",
+ "identity-obj-proxy": "^3.0.0",
+ "jest": "^27.4.3",
+ "jest-resolve": "^27.4.2",
+ "jest-watch-typeahead": "^1.0.0",
+ "mini-css-extract-plugin": "^2.4.5",
+ "postcss": "^8.4.4",
+ "postcss-flexbugs-fixes": "^5.0.2",
+ "postcss-loader": "^6.2.1",
+ "postcss-normalize": "^10.0.1",
+ "postcss-preset-env": "^7.0.1",
+ "prompts": "^2.4.2",
+ "react-app-polyfill": "^3.0.0",
+ "react-dev-utils": "^12.0.1",
+ "react-refresh": "^0.11.0",
+ "resolve": "^1.20.0",
+ "resolve-url-loader": "^4.0.0",
+ "sass-loader": "^12.3.0",
+ "semver": "^7.3.5",
+ "source-map-loader": "^3.0.0",
+ "style-loader": "^3.3.1",
+ "tailwindcss": "^3.0.2",
+ "terser-webpack-plugin": "^5.2.5",
+ "webpack": "^5.64.4",
+ "webpack-dev-server": "^4.6.0",
+ "webpack-manifest-plugin": "^4.0.2",
+ "workbox-webpack-plugin": "^6.4.1"
+ }
+ },
+ "react-split": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/react-split/-/react-split-2.0.14.tgz",
+ "integrity": "sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA==",
+ "requires": {
+ "prop-types": "^15.5.7",
+ "split.js": "^1.6.0"
+ }
+ },
+ "react-syntax-highlighter": {
+ "version": "15.5.0",
+ "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz",
+ "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "highlight.js": "^10.4.1",
+ "lowlight": "^1.17.0",
+ "prismjs": "^1.27.0",
+ "refractor": "^3.6.0"
+ }
+ },
+ "react-textarea-autosize": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz",
+ "integrity": "sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==",
+ "requires": {
+ "@babel/runtime": "^7.10.2",
+ "use-composed-ref": "^1.3.0",
+ "use-latest": "^1.2.1"
+ }
+ },
+ "react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ }
+ },
+ "react-universal-interface": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz",
+ "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw=="
+ },
+ "react-use": {
+ "version": "17.4.0",
+ "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.4.0.tgz",
+ "integrity": "sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==",
+ "requires": {
+ "@types/js-cookie": "^2.2.6",
+ "@xobotyi/scrollbar-width": "^1.9.5",
+ "copy-to-clipboard": "^3.3.1",
+ "fast-deep-equal": "^3.1.3",
+ "fast-shallow-equal": "^1.0.0",
+ "js-cookie": "^2.2.1",
+ "nano-css": "^5.3.1",
+ "react-universal-interface": "^0.6.2",
+ "resize-observer-polyfill": "^1.5.1",
+ "screenfull": "^5.1.0",
+ "set-harmonic-interval": "^1.0.1",
+ "throttle-debounce": "^3.0.1",
+ "ts-easing": "^0.2.0",
+ "tslib": "^2.1.0"
+ },
+ "dependencies": {
+ "@types/js-cookie": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz",
+ "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA=="
+ },
+ "js-cookie": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+ "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
+ }
+ }
+ },
+ "react-virtualized-auto-sizer": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.7.tgz",
+ "integrity": "sha512-Mxi6lwOmjwIjC1X4gABXMJcKHsOo0xWl3E3ugOgufB8GJU+MqrtY35aBuvCYv/razQ1Vbp7h1gWJjGjoNN5pmA=="
+ },
+ "react-window": {
+ "version": "1.8.8",
+ "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.8.tgz",
+ "integrity": "sha512-D4IiBeRtGXziZ1n0XklnFGu7h9gU684zepqyKzgPNzrsrk7xOCxni+TCckjg2Nr/DiaEEGVVmnhYSlT2rB47dQ==",
+ "requires": {
+ "@babel/runtime": "^7.0.0",
+ "memoize-one": ">=3.1.1 <6"
+ }
+ },
+ "reactcss": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
+ "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==",
+ "requires": {
+ "lodash": "^4.0.1"
+ }
+ },
+ "read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "requires": {
+ "pify": "^2.3.0"
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "recursive-readdir": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
+ "requires": {
+ "minimatch": "^3.0.5"
+ }
+ },
+ "redux": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "requires": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "redux-immutable": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/redux-immutable/-/redux-immutable-4.0.0.tgz",
+ "integrity": "sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg=="
+ },
+ "redux-thunk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz",
+ "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q=="
+ },
+ "refractor": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz",
+ "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==",
+ "requires": {
+ "hastscript": "^6.0.0",
+ "parse-entities": "^2.0.0",
+ "prismjs": "~1.27.0"
+ },
+ "dependencies": {
+ "prismjs": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz",
+ "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="
+ }
+ }
+ },
+ "regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+ },
+ "regenerate-unicode-properties": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz",
+ "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==",
+ "requires": {
+ "regenerate": "^1.4.2"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "regenerator-transform": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz",
+ "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==",
+ "requires": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "regex-parser": {
+ "version": "2.2.11",
+ "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz",
+ "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q=="
+ },
+ "regex-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/regex-regex/-/regex-regex-1.0.0.tgz",
+ "integrity": "sha512-FPbEhFTLpxKNgHKay3zMfkHzFK2ebViAlyvsz5euO4kwekH0T6fAL4Sdo2CgQ7Y1tGB5HqQm8SBq7pW5GegvVA=="
+ },
+ "regexp-to-ast": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz",
+ "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==",
+ "optional": true
+ },
+ "regexp.prototype.flags": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
+ "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "functions-have-names": "^1.2.2"
+ }
+ },
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg=="
+ },
+ "regexpu-core": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz",
+ "integrity": "sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==",
+ "requires": {
+ "@babel/regjsgen": "^0.8.0",
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.1.0",
+ "regjsparser": "^0.9.1",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ }
+ },
+ "regjsparser": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+ "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+ "requires": {
+ "jsesc": "~0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA=="
+ }
+ }
+ },
+ "regl": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@plotly/regl/-/regl-2.1.2.tgz",
+ "integrity": "sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw=="
+ },
+ "regl-error2d": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz",
+ "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==",
+ "requires": {
+ "array-bounds": "^1.0.1",
+ "color-normalize": "^1.5.0",
+ "flatten-vertex-data": "^1.0.2",
+ "object-assign": "^4.1.1",
+ "pick-by-alias": "^1.2.0",
+ "to-float32": "^1.1.0",
+ "update-diff": "^1.1.0"
+ }
+ },
+ "regl-line2d": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.2.tgz",
+ "integrity": "sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ==",
+ "requires": {
+ "array-bounds": "^1.0.1",
+ "array-find-index": "^1.0.2",
+ "array-normalize": "^1.1.4",
+ "color-normalize": "^1.5.0",
+ "earcut": "^2.1.5",
+ "es6-weak-map": "^2.0.3",
+ "flatten-vertex-data": "^1.0.2",
+ "glslify": "^7.0.0",
+ "object-assign": "^4.1.1",
+ "parse-rect": "^1.2.0",
+ "pick-by-alias": "^1.2.0",
+ "to-float32": "^1.1.0"
+ }
+ },
+ "regl-scatter2d": {
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.2.8.tgz",
+ "integrity": "sha512-bqrqJyeHkGBa9mEfuBnRd7FUtdtZ1l+gsM2C5Ugr1U3vJG5K3mdWdVWtOAllZ5FHHyWJV/vgjVvftgFUg6CDig==",
+ "requires": {
+ "@plotly/point-cluster": "^3.1.9",
+ "array-range": "^1.0.1",
+ "array-rearrange": "^2.2.2",
+ "clamp": "^1.0.1",
+ "color-id": "^1.1.0",
+ "color-normalize": "^1.5.0",
+ "color-rgba": "^2.1.1",
+ "flatten-vertex-data": "^1.0.2",
+ "glslify": "^7.0.0",
+ "image-palette": "^2.1.0",
+ "is-iexplorer": "^1.0.0",
+ "object-assign": "^4.1.1",
+ "parse-rect": "^1.2.0",
+ "pick-by-alias": "^1.2.0",
+ "to-float32": "^1.1.0",
+ "update-diff": "^1.1.0"
+ }
+ },
+ "regl-splom": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz",
+ "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==",
+ "requires": {
+ "array-bounds": "^1.0.1",
+ "array-range": "^1.0.1",
+ "color-alpha": "^1.0.4",
+ "flatten-vertex-data": "^1.0.2",
+ "parse-rect": "^1.2.0",
+ "pick-by-alias": "^1.2.0",
+ "raf": "^3.4.1",
+ "regl-scatter2d": "^3.2.3"
+ }
+ },
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="
+ },
+ "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"
+ }
+ },
+ "renderkid": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
+ "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
+ "requires": {
+ "css-select": "^4.1.3",
+ "dom-converter": "^0.2.0",
+ "htmlparser2": "^6.1.0",
+ "lodash": "^4.17.21",
+ "strip-ansi": "^6.0.1"
+ },
+ "dependencies": {
+ "css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ }
+ },
+ "css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="
+ },
+ "dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
+ },
+ "domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "requires": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ }
+ },
+ "nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "requires": {
+ "boolbase": "^1.0.0"
+ }
+ }
+ }
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
+ },
+ "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=="
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
+ },
+ "reselect": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz",
+ "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A=="
+ },
+ "resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
+ "resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "requires": {
+ "resolve-from": "^5.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
+ }
+ }
+ },
+ "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=="
+ },
+ "resolve-protobuf-schema": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
+ "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
+ "requires": {
+ "protocol-buffers-schema": "^3.3.1"
+ }
+ },
+ "resolve-url-loader": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz",
+ "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==",
+ "requires": {
+ "adjust-sourcemap-loader": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "loader-utils": "^2.0.0",
+ "postcss": "^7.0.35",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "resolve.exports": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz",
+ "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ=="
+ },
+ "ret": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz",
+ "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ=="
+ },
+ "retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+ },
+ "right-now": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz",
+ "integrity": "sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg=="
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "rollup": {
+ "version": "2.79.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
+ "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
+ "requires": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "rollup-plugin-terser": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
+ "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "jest-worker": "^26.2.1",
+ "serialize-javascript": "^4.0.0",
+ "terser": "^5.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "requires": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ }
+ },
+ "serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "rtl-css-js": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz",
+ "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==",
+ "requires": {
+ "@babel/runtime": "^7.1.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "rw": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="
+ },
+ "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-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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "sanitize.css": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz",
+ "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA=="
+ },
+ "sass-loader": {
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
+ "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==",
+ "requires": {
+ "klona": "^2.0.4",
+ "neo-async": "^2.6.2"
+ }
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ },
+ "saxes": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "requires": {
+ "xmlchars": "^2.2.0"
+ }
+ },
+ "scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "requires": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "schema-utils": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+ "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "requires": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "screenfull": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz",
+ "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA=="
+ },
+ "select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg=="
+ },
+ "selfsigned": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz",
+ "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==",
+ "requires": {
+ "node-forge": "^1"
+ }
+ },
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "requires": {
+ "lru-cache": "^6.0.0"
+ },
+ "dependencies": {
+ "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==",
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
+ }
+ },
+ "send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ }
+ }
+ },
+ "serialize-error": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz",
+ "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==",
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "serialize-javascript": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+ "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "requires": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="
+ },
+ "http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="
+ }
+ }
+ },
+ "serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ }
+ },
+ "set-harmonic-interval": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz",
+ "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g=="
+ },
+ "setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
+ },
+ "setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "shallow-copy": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
+ "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw=="
+ },
+ "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==",
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ },
+ "shell-quote": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz",
+ "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ=="
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+ },
+ "signum": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz",
+ "integrity": "sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw=="
+ },
+ "sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+ },
+ "sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "requires": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
+ }
+ }
+ },
+ "source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
+ },
+ "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=="
+ },
+ "source-map-loader": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz",
+ "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==",
+ "requires": {
+ "abab": "^2.0.5",
+ "iconv-lite": "^0.6.3",
+ "source-map-js": "^1.0.1"
+ },
+ "dependencies": {
+ "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"
+ }
+ }
+ }
+ },
+ "source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+ },
+ "space-separated-tokens": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
+ "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="
+ },
+ "spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "requires": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ }
+ },
+ "spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "requires": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "split.js": {
+ "version": "1.6.5",
+ "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz",
+ "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw=="
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+ },
+ "stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
+ },
+ "stack-generator": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz",
+ "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==",
+ "requires": {
+ "stackframe": "^1.3.4"
+ }
+ },
+ "stack-trace": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz",
+ "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ=="
+ },
+ "stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "requires": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "dependencies": {
+ "escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
+ }
+ }
+ },
+ "stackframe": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="
+ },
+ "stacktrace-gps": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz",
+ "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==",
+ "requires": {
+ "source-map": "0.5.6",
+ "stackframe": "^1.3.4"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+ "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA=="
+ }
+ }
+ },
+ "stacktrace-js": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
+ "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
+ "requires": {
+ "error-stack-parser": "^2.0.6",
+ "stack-generator": "^2.0.5",
+ "stacktrace-gps": "^3.0.4"
+ }
+ },
+ "static-eval": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
+ "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==",
+ "requires": {
+ "escodegen": "^1.11.1"
+ }
+ },
+ "statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
+ },
+ "stop-iteration-iterator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
+ "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==",
+ "requires": {
+ "internal-slot": "^1.0.4"
+ }
+ },
+ "stream-browserify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
+ "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
+ "dev": true,
+ "requires": {
+ "inherits": "~2.0.4",
+ "readable-stream": "^3.5.0"
+ }
+ },
+ "stream-http": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz",
+ "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==",
+ "requires": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "xtend": "^4.0.2"
+ }
+ },
+ "stream-parser": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
+ "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==",
+ "requires": {
+ "debug": "2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "stream-shift": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
+ },
+ "string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "requires": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "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=="
+ },
+ "string-split-by": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz",
+ "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==",
+ "requires": {
+ "parenthesis": "^3.1.5"
+ }
+ },
+ "string-to-arraybuffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz",
+ "integrity": "sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q==",
+ "requires": {
+ "atob-lite": "^2.0.0",
+ "is-base64": "^0.1.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "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=="
+ }
+ }
+ },
+ "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==",
+ "requires": {
+ "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"
+ }
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "requires": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "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-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
+ "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw=="
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+ },
+ "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=="
+ },
+ "strongly-connected-components": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz",
+ "integrity": "sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA=="
+ },
+ "style-loader": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz",
+ "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ=="
+ },
+ "stylehacks": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz",
+ "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==",
+ "requires": {
+ "browserslist": "^4.21.4",
+ "postcss-selector-parser": "^6.0.4"
+ }
+ },
+ "stylis": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz",
+ "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA=="
+ },
+ "supercluster": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz",
+ "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==",
+ "requires": {
+ "kdbush": "^3.0.0"
+ }
+ },
+ "superscript-text": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz",
+ "integrity": "sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ=="
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "requires": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.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=="
+ },
+ "svg-arc-to-cubic-bezier": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz",
+ "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g=="
+ },
+ "svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
+ },
+ "svg-path-bounds": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz",
+ "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==",
+ "requires": {
+ "abs-svg-path": "^0.1.1",
+ "is-svg-path": "^1.0.1",
+ "normalize-svg-path": "^1.0.0",
+ "parse-svg-path": "^0.1.2"
+ },
+ "dependencies": {
+ "normalize-svg-path": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz",
+ "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==",
+ "requires": {
+ "svg-arc-to-cubic-bezier": "^3.0.0"
+ }
+ }
+ }
+ },
+ "svg-path-sdf": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz",
+ "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==",
+ "requires": {
+ "bitmap-sdf": "^1.0.0",
+ "draw-svg-path": "^1.0.0",
+ "is-svg-path": "^1.0.1",
+ "parse-svg-path": "^0.1.2",
+ "svg-path-bounds": "^1.0.1"
+ }
+ },
+ "svgo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+ "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "coa": "^2.0.2",
+ "css-select": "^2.0.0",
+ "css-select-base-adapter": "^0.1.1",
+ "css-tree": "1.0.0-alpha.37",
+ "csso": "^4.0.2",
+ "js-yaml": "^3.13.1",
+ "mkdirp": "~0.5.1",
+ "object.values": "^1.1.0",
+ "sax": "~1.2.4",
+ "stable": "^0.1.8",
+ "unquote": "~1.1.1",
+ "util.promisify": "~1.0.0"
+ }
+ },
+ "swagger-client": {
+ "version": "3.18.5",
+ "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.18.5.tgz",
+ "integrity": "sha512-c0txGDtfQTJnaIBaEKCwtRNcUaaAfj+RXI4QVV9p3WW+AUCQqp4naCjaDNNsOfMkE4ySyhnblbL+jGqAVC7snw==",
+ "requires": {
+ "@babel/runtime-corejs3": "^7.11.2",
+ "cookie": "~0.5.0",
+ "cross-fetch": "^3.1.5",
+ "deepmerge": "~4.2.2",
+ "fast-json-patch": "^3.0.0-1",
+ "form-data-encoder": "^1.4.3",
+ "formdata-node": "^4.0.0",
+ "is-plain-object": "^5.0.0",
+ "js-yaml": "^4.1.0",
+ "lodash": "^4.17.21",
+ "qs": "^6.10.2",
+ "traverse": "~0.6.6",
+ "url": "~0.11.0"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ }
+ }
+ },
+ "swagger-ui-react": {
+ "version": "4.15.5",
+ "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-4.15.5.tgz",
+ "integrity": "sha512-jt2g6cDt3wOsc+1YQv4D86V4K659Xs1/pbhjYWlgNfjZB0TSN601MASWxbP+65U0iPpsJTpF7EmRzAunTOVs8Q==",
+ "requires": {
+ "@babel/runtime-corejs3": "^7.18.9",
+ "@braintree/sanitize-url": "=6.0.0",
+ "base64-js": "^1.5.1",
+ "classnames": "^2.3.1",
+ "css.escape": "1.5.1",
+ "deep-extend": "0.6.0",
+ "dompurify": "=2.3.10",
+ "ieee754": "^1.2.1",
+ "immutable": "^3.x.x",
+ "js-file-download": "^0.4.12",
+ "js-yaml": "=4.1.0",
+ "lodash": "^4.17.21",
+ "patch-package": "^6.5.0",
+ "prop-types": "^15.8.1",
+ "randexp": "^0.5.3",
+ "randombytes": "^2.1.0",
+ "react-copy-to-clipboard": "5.1.0",
+ "react-debounce-input": "=3.3.0",
+ "react-immutable-proptypes": "2.2.0",
+ "react-immutable-pure-component": "^2.2.0",
+ "react-inspector": "^6.0.1",
+ "react-redux": "^7.2.4",
+ "react-syntax-highlighter": "^15.5.0",
+ "redux": "^4.1.2",
+ "redux-immutable": "^4.0.0",
+ "remarkable": "^2.0.1",
+ "reselect": "^4.1.5",
+ "serialize-error": "^8.1.0",
+ "sha.js": "^2.4.11",
+ "swagger-client": "^3.18.5",
+ "url-parse": "^1.5.8",
+ "xml": "=1.0.1",
+ "xml-but-prettier": "^1.0.1",
+ "zenscroll": "^4.0.2"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "dompurify": {
+ "version": "2.3.10",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.10.tgz",
+ "integrity": "sha512-o7Fg/AgC7p/XpKjf/+RC3Ok6k4St5F7Q6q6+Nnm3p2zGWioAY6dh0CbbuwOhH2UcSzKsdniE/YnE2/92JcsA+g=="
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ },
+ "react-redux": {
+ "version": "7.2.9",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz",
+ "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==",
+ "requires": {
+ "@babel/runtime": "^7.15.4",
+ "@types/react-redux": "^7.1.20",
+ "hoist-non-react-statics": "^3.3.2",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.7.2",
+ "react-is": "^17.0.2"
+ }
+ }
+ }
+ },
+ "symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
+ },
+ "tailwindcss": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz",
+ "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==",
+ "requires": {
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "color-name": "^1.1.4",
+ "detective": "^5.2.1",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.12",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "lilconfig": "^2.0.6",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.0.9",
+ "postcss-import": "^14.1.0",
+ "postcss-js": "^4.0.0",
+ "postcss-load-config": "^3.1.4",
+ "postcss-nested": "6.0.0",
+ "postcss-selector-parser": "^6.0.11",
+ "postcss-value-parser": "^4.2.0",
+ "quick-lru": "^5.1.1",
+ "resolve": "^1.22.1"
+ },
+ "dependencies": {
+ "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=="
+ }
+ }
+ },
+ "tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="
+ },
+ "temp-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
+ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg=="
+ },
+ "tempy": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz",
+ "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==",
+ "requires": {
+ "is-stream": "^2.0.0",
+ "temp-dir": "^2.0.0",
+ "type-fest": "^0.16.0",
+ "unique-string": "^2.0.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
+ "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg=="
+ }
+ }
+ },
+ "terminal-link": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "requires": {
+ "ansi-escapes": "^4.2.1",
+ "supports-hyperlinks": "^2.0.0"
+ }
+ },
+ "terser": {
+ "version": "5.16.4",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.4.tgz",
+ "integrity": "sha512-5yEGuZ3DZradbogeYQ1NaGz7rXVBDWujWlx1PT8efXO6Txn+eWbfKqB2bTDVmFXmePFkoLU6XI8UektMIEA0ug==",
+ "requires": {
+ "@jridgewell/source-map": "^0.3.2",
+ "acorn": "^8.5.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw=="
+ }
+ }
+ },
+ "terser-webpack-plugin": {
+ "version": "5.3.6",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz",
+ "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==",
+ "requires": {
+ "@jridgewell/trace-mapping": "^0.3.14",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.0",
+ "terser": "^5.14.1"
+ }
+ },
+ "test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "requires": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "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=="
+ },
+ "throat": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz",
+ "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ=="
+ },
+ "throttle-debounce": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz",
+ "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg=="
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "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"
+ }
+ },
+ "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=="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
+ },
+ "tiny-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
+ "optional": true
+ },
+ "tiny-invariant": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
+ "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
+ },
+ "tinycolor2": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
+ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
+ },
+ "tinyqueue": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz",
+ "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA=="
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
+ "tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="
+ },
+ "to-array-buffer": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/to-array-buffer/-/to-array-buffer-3.2.0.tgz",
+ "integrity": "sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ==",
+ "requires": {
+ "flatten-vertex-data": "^1.0.2",
+ "is-blob": "^2.0.1",
+ "string-to-arraybuffer": "^1.0.0"
+ }
+ },
+ "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=="
+ },
+ "to-float32": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz",
+ "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg=="
+ },
+ "to-px": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz",
+ "integrity": "sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw==",
+ "requires": {
+ "parse-unit": "^1.0.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "to-uint8": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/to-uint8/-/to-uint8-1.4.1.tgz",
+ "integrity": "sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg==",
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "clamp": "^1.0.1",
+ "is-base64": "^0.1.0",
+ "is-float-array": "^1.0.0",
+ "to-array-buffer": "^3.0.0"
+ }
+ },
+ "toggle-selection": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
+ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+ },
+ "toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
+ },
+ "topojson-client": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz",
+ "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==",
+ "requires": {
+ "commander": "2"
+ }
+ },
+ "tough-cookie": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
+ "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
+ "requires": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "dependencies": {
+ "universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="
+ }
+ }
+ },
+ "tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ },
+ "traverse": {
+ "version": "0.6.7",
+ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz",
+ "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg=="
+ },
+ "tryer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
+ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA=="
+ },
+ "ts-easing": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
+ "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
+ },
+ "ts-toolbelt": {
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz",
+ "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w=="
+ },
+ "tsconfig-paths": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
+ "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
+ "requires": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.1",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ }
+ }
+ },
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
+ },
+ "tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "requires": {
+ "tslib": "^1.8.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ }
+ }
+ },
+ "type": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
+ },
+ "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=="
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "type-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz",
+ "integrity": "sha512-kkgkuqR/jKdKO5oh/I2SMu2dGbLXoJq0zkdgbxaqYK+hr9S9edwVVGf+tMUFTx2gH9TN2+Zu9JZ/Njonb3cjhA=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+ },
+ "typedarray-pool": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz",
+ "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==",
+ "requires": {
+ "bit-twiddle": "^1.0.0",
+ "dup": "^1.0.0"
+ }
+ },
+ "typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "requires": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "dev": true
+ },
+ "ua-parser-js": {
+ "version": "0.7.33",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz",
+ "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw=="
+ },
+ "unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
+ "unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ=="
+ },
+ "unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "requires": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ }
+ },
+ "unicode-match-property-value-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA=="
+ },
+ "unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w=="
+ },
+ "unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "requires": {
+ "crypto-random-string": "^2.0.0"
+ }
+ },
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+ },
+ "unorm": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz",
+ "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==",
+ "optional": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
+ },
+ "unquote": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+ "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg=="
+ },
+ "upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="
+ },
+ "update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "requires": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "update-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz",
+ "integrity": "sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A=="
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="
+ }
+ }
+ },
+ "url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "requires": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "use-composed-ref": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz",
+ "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ=="
+ },
+ "use-isomorphic-layout-effect": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz",
+ "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA=="
+ },
+ "use-latest": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz",
+ "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==",
+ "requires": {
+ "use-isomorphic-layout-effect": "^1.1.1"
+ }
+ },
+ "use-memo-one": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz",
+ "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ=="
+ },
+ "use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA=="
+ },
+ "util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "util.promisify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
+ "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.2",
+ "has-symbols": "^1.0.1",
+ "object.getownpropertydescriptors": "^2.1.0"
+ }
+ },
+ "utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA=="
+ },
+ "utils-copy": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/utils-copy/-/utils-copy-1.1.1.tgz",
+ "integrity": "sha512-+NhJVV+PcxjdpkMrVTqXhQHPldlFGca5XR9YnGyNn7kQ0fMi+DqNLzdnhJ4TJ1HNy/HzB7c+FPg3y+4icY99ZA==",
+ "requires": {
+ "const-pinf-float64": "^1.0.0",
+ "object-keys": "^1.0.9",
+ "type-name": "^2.0.0",
+ "utils-copy-error": "^1.0.0",
+ "utils-indexof": "^1.0.0",
+ "utils-regex-from-string": "^1.0.0",
+ "validate.io-array": "^1.0.3",
+ "validate.io-buffer": "^1.0.1",
+ "validate.io-nonnegative-integer": "^1.0.0"
+ }
+ },
+ "utils-copy-error": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-copy-error/-/utils-copy-error-1.0.1.tgz",
+ "integrity": "sha512-RbJcGPZ6Ru2HQk9SWkvbdWNPX58pt4MO5uXsOQRu4LEGWB3LglkRrmnE/Ph1qWg6ywQ0qj95wTz1OeqQ2l8DCA==",
+ "requires": {
+ "object-keys": "^1.0.9",
+ "utils-copy": "^1.1.0"
+ }
+ },
+ "utils-indexof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/utils-indexof/-/utils-indexof-1.0.0.tgz",
+ "integrity": "sha512-76QBfRJpn4A0P5uTO1x00x+Yog36w2Pab0n+aT9UfUvVa4l+e8k3p7YwNpDvfQ6+aKGZdxZpxcNotNS4YjFcyg==",
+ "requires": {
+ "validate.io-array-like": "^1.0.1",
+ "validate.io-integer-primitive": "^1.0.0"
+ }
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
+ },
+ "utils-regex-from-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz",
+ "integrity": "sha512-xKfdmEF19iUu9TKxFiohQUlQTuqYdV80/CxHiudVI37iEV/OA4HHlXZoc4qvuO1B74EcBVpErBreRO/dpdLeYA==",
+ "requires": {
+ "regex-regex": "^1.0.0",
+ "validate.io-string-primitive": "^1.0.0"
+ }
+ },
+ "uuid": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
+ "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
+ },
+ "v8-to-istanbul": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
+ "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0",
+ "source-map": "^0.7.3"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="
+ }
+ }
+ },
+ "validate.io-array": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz",
+ "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg=="
+ },
+ "validate.io-array-like": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz",
+ "integrity": "sha512-rGLiN0cvY9OWzQcWP+RtqZR/MK9RUz3gKDTCcRLtEQ/BvlanMF5PyqtVIN+CgrIBCv/ypfme9v7r4yMJPYpbNA==",
+ "requires": {
+ "const-max-uint32": "^1.0.2",
+ "validate.io-integer-primitive": "^1.0.0"
+ }
+ },
+ "validate.io-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz",
+ "integrity": "sha512-6Tad+/QYOxWEXsesKYak1mHOzGdPYS4QeHFImWn7ECi4GR0x3vh7+6+1yoLKNXiklKuTFOxHLG3kZy9tPX0GvQ=="
+ },
+ "validate.io-integer": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz",
+ "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==",
+ "requires": {
+ "validate.io-number": "^1.0.3"
+ }
+ },
+ "validate.io-integer-primitive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz",
+ "integrity": "sha512-4ARGKA4FImVWJgrgttLYsYJmDGwxlhLfDCdq09gyVgohLKKRUfD3VAo1L2vTRCLt6hDhDtFKdZiuYUTWyBggwg==",
+ "requires": {
+ "validate.io-number-primitive": "^1.0.0"
+ }
+ },
+ "validate.io-matrix-like": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz",
+ "integrity": "sha512-86mqLUIkZCRAOVKZvpCB7sDCw1dKBjBkY+C6WO/wLo/jQx0sOqQZz3LLtDw0DCfuAKxRuhSmIpX3nzr0nWrbdw=="
+ },
+ "validate.io-ndarray-like": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz",
+ "integrity": "sha512-OV85AosxraPFSXJwzv/d7Cu5/dLiyLtsHmxtHTJcHW1N0uscd0eJ2df1Zk+HdID0eUctUllW/1YuQPUJFv1pTA=="
+ },
+ "validate.io-nonnegative-integer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz",
+ "integrity": "sha512-uOMekPwcl84yg8NR7zgIZCZ9pHCtd9CK1Ri51N+ZJLTe1HyLbmdFdy7ZmfkiHkMvB1pOxeQmd1/LBjKhUD1L3A==",
+ "requires": {
+ "validate.io-integer": "^1.0.5"
+ }
+ },
+ "validate.io-number": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz",
+ "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg=="
+ },
+ "validate.io-number-primitive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz",
+ "integrity": "sha512-8rlCe7N0TRTd50dwk4WNoMXNbX/4+RdtqE3TO6Bk0GJvAgbQlfL5DGr/Pl9ZLbWR6CutMjE2cu+yOoCnFWk+Qw=="
+ },
+ "validate.io-positive-integer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz",
+ "integrity": "sha512-eg4LSdyqjICNUZWRilcQ5l+YayRlu6yi+GQsWw1bCmtG9yayOPmLa1fPymEHPPhbvWPAv3w0LLbCsf03pBHZkg==",
+ "requires": {
+ "validate.io-integer": "^1.0.5"
+ }
+ },
+ "validate.io-string-primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz",
+ "integrity": "sha512-TORbkLMdOFkEbPtfdx76FSVQGSAzyUEMxI+pBq5pfFm1ZzIesP+XiGc6eIK75aKu7RA7a8EcqUv5OrY5wfog5w=="
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
+ },
+ "void-elements": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
+ "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="
+ },
+ "vt-pbf": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz",
+ "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==",
+ "requires": {
+ "@mapbox/point-geometry": "0.1.0",
+ "@mapbox/vector-tile": "^1.3.1",
+ "pbf": "^3.2.1"
+ }
+ },
+ "w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "requires": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "w3c-xmlserializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+ "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+ "requires": {
+ "xml-name-validator": "^3.0.0"
+ }
+ },
+ "walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "requires": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "watchpack": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "requires": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ }
+ },
+ "wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "requires": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "weak-map": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.8.tgz",
+ "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw=="
+ },
+ "web-streams-polyfill": {
+ "version": "4.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
+ "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="
+ },
+ "webgl-context": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz",
+ "integrity": "sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==",
+ "requires": {
+ "get-canvas-context": "^1.0.1"
+ }
+ },
+ "webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ },
+ "webpack": {
+ "version": "5.75.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz",
+ "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==",
+ "requires": {
+ "@types/eslint-scope": "^3.7.3",
+ "@types/estree": "^0.0.51",
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/wasm-edit": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1",
+ "acorn": "^8.7.1",
+ "acorn-import-assertions": "^1.7.6",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.10.0",
+ "es-module-lexer": "^0.9.0",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.9",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.1.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.1.3",
+ "watchpack": "^2.4.0",
+ "webpack-sources": "^3.2.3"
+ },
+ "dependencies": {
+ "@types/estree": {
+ "version": "0.0.51",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+ "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
+ },
+ "acorn": {
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw=="
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ }
+ }
+ },
+ "webpack-dev-middleware": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
+ "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
+ "requires": {
+ "colorette": "^2.0.10",
+ "memfs": "^3.4.3",
+ "mime-types": "^2.1.31",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "requires": {
+ "fast-deep-equal": "^3.1.3"
+ }
+ },
+ "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=="
+ },
+ "schema-utils": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+ "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.8.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.0.0"
+ }
+ }
+ }
+ },
+ "webpack-dev-server": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz",
+ "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==",
+ "requires": {
+ "@types/bonjour": "^3.5.9",
+ "@types/connect-history-api-fallback": "^1.3.5",
+ "@types/express": "^4.17.13",
+ "@types/serve-index": "^1.9.1",
+ "@types/serve-static": "^1.13.10",
+ "@types/sockjs": "^0.3.33",
+ "@types/ws": "^8.5.1",
+ "ansi-html-community": "^0.0.8",
+ "bonjour-service": "^1.0.11",
+ "chokidar": "^3.5.3",
+ "colorette": "^2.0.10",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^2.0.0",
+ "default-gateway": "^6.0.3",
+ "express": "^4.17.3",
+ "graceful-fs": "^4.2.6",
+ "html-entities": "^2.3.2",
+ "http-proxy-middleware": "^2.0.3",
+ "ipaddr.js": "^2.0.1",
+ "open": "^8.0.9",
+ "p-retry": "^4.5.0",
+ "rimraf": "^3.0.2",
+ "schema-utils": "^4.0.0",
+ "selfsigned": "^2.1.1",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.24",
+ "spdy": "^4.0.2",
+ "webpack-dev-middleware": "^5.3.1",
+ "ws": "^8.4.2"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "requires": {
+ "fast-deep-equal": "^3.1.3"
+ }
+ },
+ "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=="
+ },
+ "schema-utils": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+ "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.8.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.0.0"
+ }
+ },
+ "ws": {
+ "version": "8.12.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz",
+ "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew=="
+ }
+ }
+ },
+ "webpack-manifest-plugin": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz",
+ "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==",
+ "requires": {
+ "tapable": "^2.0.0",
+ "webpack-sources": "^2.2.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "webpack-sources": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
+ "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==",
+ "requires": {
+ "source-list-map": "^2.0.1",
+ "source-map": "^0.6.1"
+ }
+ }
+ }
+ },
+ "webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w=="
+ },
+ "websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "requires": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ }
+ },
+ "websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="
+ },
+ "whatwg-encoding": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "requires": {
+ "iconv-lite": "0.4.24"
+ }
+ },
+ "whatwg-fetch": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz",
+ "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA=="
+ },
+ "whatwg-mimetype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
+ },
+ "whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "requires": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "requires": {
+ "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"
+ }
+ },
+ "which-collection": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "requires": {
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-weakmap": "^2.0.1",
+ "is-weakset": "^2.0.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "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",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+ },
+ "workbox-background-sync": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz",
+ "integrity": "sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==",
+ "requires": {
+ "idb": "^7.0.1",
+ "workbox-core": "6.5.4"
+ }
+ },
+ "workbox-broadcast-update": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz",
+ "integrity": "sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==",
+ "requires": {
+ "workbox-core": "6.5.4"
+ }
+ },
+ "workbox-build": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz",
+ "integrity": "sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==",
+ "requires": {
+ "@apideck/better-ajv-errors": "^0.3.1",
+ "@babel/core": "^7.11.1",
+ "@babel/preset-env": "^7.11.0",
+ "@babel/runtime": "^7.11.2",
+ "@rollup/plugin-babel": "^5.2.0",
+ "@rollup/plugin-node-resolve": "^11.2.1",
+ "@rollup/plugin-replace": "^2.4.1",
+ "@surma/rollup-plugin-off-main-thread": "^2.2.3",
+ "ajv": "^8.6.0",
+ "common-tags": "^1.8.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "fs-extra": "^9.0.1",
+ "glob": "^7.1.6",
+ "lodash": "^4.17.20",
+ "pretty-bytes": "^5.3.0",
+ "rollup": "^2.43.1",
+ "rollup-plugin-terser": "^7.0.0",
+ "source-map": "^0.8.0-beta.0",
+ "stringify-object": "^3.3.0",
+ "strip-comments": "^2.0.1",
+ "tempy": "^0.6.0",
+ "upath": "^1.2.0",
+ "workbox-background-sync": "6.5.4",
+ "workbox-broadcast-update": "6.5.4",
+ "workbox-cacheable-response": "6.5.4",
+ "workbox-core": "6.5.4",
+ "workbox-expiration": "6.5.4",
+ "workbox-google-analytics": "6.5.4",
+ "workbox-navigation-preload": "6.5.4",
+ "workbox-precaching": "6.5.4",
+ "workbox-range-requests": "6.5.4",
+ "workbox-recipes": "6.5.4",
+ "workbox-routing": "6.5.4",
+ "workbox-strategies": "6.5.4",
+ "workbox-streams": "6.5.4",
+ "workbox-sw": "6.5.4",
+ "workbox-window": "6.5.4"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "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=="
+ },
+ "source-map": {
+ "version": "0.8.0-beta.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+ "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+ "requires": {
+ "whatwg-url": "^7.0.0"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
+ },
+ "whatwg-url": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "requires": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ }
+ }
+ },
+ "workbox-cacheable-response": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz",
+ "integrity": "sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==",
+ "requires": {
+ "workbox-core": "6.5.4"
+ }
+ },
+ "workbox-core": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz",
+ "integrity": "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q=="
+ },
+ "workbox-expiration": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz",
+ "integrity": "sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==",
+ "requires": {
+ "idb": "^7.0.1",
+ "workbox-core": "6.5.4"
+ }
+ },
+ "workbox-google-analytics": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz",
+ "integrity": "sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==",
+ "requires": {
+ "workbox-background-sync": "6.5.4",
+ "workbox-core": "6.5.4",
+ "workbox-routing": "6.5.4",
+ "workbox-strategies": "6.5.4"
+ }
+ },
+ "workbox-navigation-preload": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz",
+ "integrity": "sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==",
+ "requires": {
+ "workbox-core": "6.5.4"
+ }
+ },
+ "workbox-precaching": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz",
+ "integrity": "sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==",
+ "requires": {
+ "workbox-core": "6.5.4",
+ "workbox-routing": "6.5.4",
+ "workbox-strategies": "6.5.4"
+ }
+ },
+ "workbox-range-requests": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz",
+ "integrity": "sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==",
+ "requires": {
+ "workbox-core": "6.5.4"
+ }
+ },
+ "workbox-recipes": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz",
+ "integrity": "sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==",
+ "requires": {
+ "workbox-cacheable-response": "6.5.4",
+ "workbox-core": "6.5.4",
+ "workbox-expiration": "6.5.4",
+ "workbox-precaching": "6.5.4",
+ "workbox-routing": "6.5.4",
+ "workbox-strategies": "6.5.4"
+ }
+ },
+ "workbox-routing": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz",
+ "integrity": "sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==",
+ "requires": {
+ "workbox-core": "6.5.4"
+ }
+ },
+ "workbox-strategies": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz",
+ "integrity": "sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==",
+ "requires": {
+ "workbox-core": "6.5.4"
+ }
+ },
+ "workbox-streams": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz",
+ "integrity": "sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==",
+ "requires": {
+ "workbox-core": "6.5.4",
+ "workbox-routing": "6.5.4"
+ }
+ },
+ "workbox-sw": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz",
+ "integrity": "sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA=="
+ },
+ "workbox-webpack-plugin": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz",
+ "integrity": "sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg==",
+ "requires": {
+ "fast-json-stable-stringify": "^2.1.0",
+ "pretty-bytes": "^5.4.1",
+ "upath": "^1.2.0",
+ "webpack-sources": "^1.4.3",
+ "workbox-build": "6.5.4"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "requires": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ }
+ }
+ }
+ },
+ "workbox-window": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz",
+ "integrity": "sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==",
+ "requires": {
+ "@types/trusted-types": "^2.0.2",
+ "workbox-core": "6.5.4"
+ }
+ },
+ "world-calendars": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz",
+ "integrity": "sha512-sAjLZkBnsbHkHWVhrsCU5Sa/EVuf9QqgvrN8zyJ2L/F9FR9Oc6CvVK0674+PGAtmmmYQMH98tCUSO4QLQv3/TQ==",
+ "requires": {
+ "object-assign": "^4.1.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "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==",
+ "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=="
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "requires": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "ws": {
+ "version": "7.5.9",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="
+ },
+ "xml": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
+ "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw=="
+ },
+ "xml-but-prettier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/xml-but-prettier/-/xml-but-prettier-1.0.1.tgz",
+ "integrity": "sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==",
+ "requires": {
+ "repeat-string": "^1.5.2"
+ }
+ },
+ "xml-js": {
+ "version": "1.6.11",
+ "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
+ "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
+ "requires": {
+ "sax": "^1.2.4"
+ }
+ },
+ "xml-name-validator": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
+ },
+ "xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+ },
+ "yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ },
+ "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=="
+ },
+ "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=="
+ },
+ "zenscroll": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zenscroll/-/zenscroll-4.0.2.tgz",
+ "integrity": "sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg=="
+ }
+ }
+}
diff --git a/webapp/package.json b/webapp/package.json
index 10710ca86d..acb70e12b3 100644
--- a/webapp/package.json
+++ b/webapp/package.json
@@ -1,87 +1,77 @@
{
"name": "antares-web",
- "version": "2.12.2",
+ "version": "2.13.0",
"private": true,
"dependencies": {
- "@emotion/react": "11.10.0",
- "@emotion/styled": "11.10.0",
- "@handsontable/react": "12.1.2",
- "@hookform/resolvers": "2.9.7",
- "@mui/icons-material": "5.8.4",
- "@mui/lab": "5.0.0-alpha.93",
- "@mui/material": "5.11.2",
- "@reduxjs/toolkit": "1.8.3",
- "@testing-library/jest-dom": "5.16.4",
- "@testing-library/react": "13.3.0",
- "@testing-library/user-event": "14.4.1",
+ "@emotion/react": "11.10.6",
+ "@emotion/styled": "11.10.6",
+ "@handsontable/react": "12.3.1",
+ "@mui/icons-material": "5.11.9",
+ "@mui/lab": "5.0.0-alpha.120",
+ "@mui/material": "5.11.10",
+ "@reduxjs/toolkit": "1.9.3",
"@types/d3": "5.16.4",
"@types/draft-convert": "2.1.4",
- "@types/draft-js": "0.11.9",
+ "@types/draft-js": "0.11.10",
"@types/draftjs-to-html": "0.8.1",
- "@types/jest": "28.1.6",
"@types/node": "16.11.20",
- "@types/react": "18.0.15",
+ "@types/react": "18.0.28",
"@types/react-d3-graph": "2.6.3",
- "@types/react-dom": "18.0.6",
+ "@types/react-dom": "18.0.11",
"@types/xml-js": "1.0.0",
"assert": "2.0.0",
- "axios": "0.27.2",
+ "axios": "1.3.3",
"buffer": "6.0.3",
"clsx": "1.2.1",
"crypto-browserify": "3.12.0",
"d3": "5.16.0",
"debug": "4.3.4",
- "downshift": "6.1.7",
- "draft-convert": "2.1.12",
+ "draft-convert": "2.1.13",
"draft-js": "0.11.7",
"draftjs-to-html": "0.9.1",
- "fs": "0.0.1-security",
- "handsontable": "12.1.2",
+ "handsontable": "12.3.1",
"hoist-non-react-statics": "3.3.2",
"https-browserify": "1.0.0",
- "i18next": "21.8.16",
- "i18next-browser-languagedetector": "6.1.4",
+ "i18next": "22.4.10",
+ "i18next-browser-languagedetector": "7.0.1",
"i18next-xhr-backend": "3.2.2",
- "immer": "9.0.15",
+ "immer": "9.0.19",
"js-cookie": "3.0.1",
"jwt-decode": "3.1.2",
"lodash": "4.17.21",
"moment": "2.29.4",
- "notistack": "2.0.5",
+ "notistack": "2.0.8",
"os": "0.1.2",
"os-browserify": "0.3.0",
- "plotly.js": "2.13.3",
+ "plotly.js": "2.18.2",
"ramda": "0.28.0",
- "ramda-adjunct": "3.2.0",
+ "ramda-adjunct": "3.4.0",
"react": "18.2.0",
- "react-beautiful-dnd": "13.1.0",
+ "react-beautiful-dnd": "13.1.1",
"react-color": "^2.19.3",
"react-d3-graph": "2.6.0",
"react-dom": "18.2.0",
- "react-dropzone": "14.2.2",
+ "react-dropzone": "14.2.3",
"react-hook-form": "7.34.0",
- "react-i18next": "11.18.3",
+ "react-i18next": "12.1.5",
"react-json-view": "1.21.3",
- "react-plotly.js": "2.5.1",
- "react-redux": "8.0.2",
+ "react-plotly.js": "2.6.0",
+ "react-redux": "8.0.5",
"react-router": "6.3.0",
"react-router-dom": "6.3.0",
"react-scripts": "5.0.1",
"react-split": "2.0.14",
- "react-tsparticles": "2.1.4",
"react-use": "17.4.0",
- "react-virtualized-auto-sizer": "1.0.6",
- "react-window": "1.8.7",
- "redux": "4.2.0",
- "redux-thunk": "2.4.1",
+ "react-virtualized-auto-sizer": "1.0.7",
+ "react-window": "1.8.8",
+ "redux": "4.2.1",
+ "redux-thunk": "2.4.2",
"stream-http": "3.2.0",
- "swagger-ui-react": "4.13.2",
+ "swagger-ui-react": "4.15.5",
"ts-toolbelt": "9.6.0",
"url": "0.11.0",
- "uuid": "8.3.2",
- "web-vitals": "2.1.4",
- "xml-js": "1.6.11",
- "yup": "0.32.11"
+ "uuid": "9.0.0",
+ "xml-js": "1.6.11"
},
"scripts": {
"start": "react-app-rewired start",
@@ -107,34 +97,34 @@
"homepage": "/",
"devDependencies": {
"@types/debug": "4.1.7",
- "@types/js-cookie": "3.0.2",
- "@types/lodash": "4.14.182",
- "@types/ramda": "0.28.15",
- "@types/react-beautiful-dnd": "13.1.2",
+ "@types/js-cookie": "3.0.3",
+ "@types/lodash": "4.14.191",
+ "@types/ramda": "0.28.23",
+ "@types/react-beautiful-dnd": "13.1.3",
"@types/react-color": "3.0.6",
- "@types/react-plotly.js": "2.5.1",
+ "@types/react-plotly.js": "2.6.0",
"@types/react-virtualized-auto-sizer": "1.0.1",
"@types/react-window": "1.8.5",
"@types/redux-logger": "3.0.9",
"@types/swagger-ui-react": "4.11.0",
- "@types/uuid": "8.3.4",
- "@typescript-eslint/eslint-plugin": "5.32.0",
- "@typescript-eslint/parser": "5.32.0",
+ "@types/uuid": "9.0.0",
+ "@typescript-eslint/eslint-plugin": "5.53.0",
+ "@typescript-eslint/parser": "5.53.0",
"cross-env": "7.0.3",
- "eslint": "8.21.0",
+ "eslint": "8.34.0",
"eslint-config-airbnb": "19.0.4",
- "eslint-config-prettier": "8.5.0",
- "eslint-plugin-import": "2.26.0",
- "eslint-plugin-jsx-a11y": "6.6.1",
+ "eslint-config-prettier": "8.6.0",
+ "eslint-plugin-import": "2.27.5",
+ "eslint-plugin-jsx-a11y": "6.7.1",
"eslint-plugin-prettier": "4.2.1",
- "eslint-plugin-react": "7.30.1",
+ "eslint-plugin-react": "7.32.2",
"eslint-plugin-react-hooks": "4.6.0",
- "husky": "8.0.1",
+ "husky": "8.0.3",
"jest-sonar-reporter": "2.0.0",
- "prettier": "2.7.1",
+ "prettier": "2.8.4",
"process": "0.11.10",
"react-app-rewired": "2.2.1",
"stream-browserify": "3.0.0",
- "typescript": "4.7.4"
+ "typescript": "4.9.5"
}
}
diff --git a/webapp/public/locales/en/main.json b/webapp/public/locales/en/main.json
index 2508723f95..6c7bdc460c 100644
--- a/webapp/public/locales/en/main.json
+++ b/webapp/public/locales/en/main.json
@@ -24,16 +24,16 @@
"global.permission": "Permission",
"global.permissions": "Permissions",
"global.group": "Group",
- "global.variants": "Variant management",
+ "global.variants": "Variants management",
"global.password": "Password",
"global.create": "Create",
"global.open": "Open",
"global.name": "Name",
"global.import": "Import",
- "global.importHint": "Click or drag'n'drop here",
+ "global.importHint": "Click or drag and drop here",
"global.launch": "Launch",
"global.jobs": "Jobs",
- "global.unknown": "Unkown",
+ "global.unknown": "Unknown",
"global.search": "Search",
"global.date": "Date",
"global.general": "General",
@@ -59,7 +59,7 @@
"global.color": "Color",
"global.advancedParams": "Advanced parameters",
"global.matrix": "Matrix",
- "global.matrixes": "Matrixes",
+ "global.matrices": "Matrices",
"global.chooseFile": "Choose a file",
"global.assign": "Assign",
"global.time.hourly": "Hourly",
@@ -83,8 +83,9 @@
"settings.title": "Settings",
"data.title": "Data",
"dialog.title.confirmation": "Confirmation",
- "dialog.message.logout": "Are you sure you want to logout ?",
- "button.hide": "Hide",
+ "dialog.message.logout": "Are you sure you want to logout?",
+ "button.collapse": "Collapse",
+ "button.expand": "Expand",
"button.yes": "Yes",
"button.no": "No",
"button.ok": "Ok",
@@ -106,9 +107,10 @@
"form.submit.inProgress": "The form is being submitted. Are you sure you want to leave the page?",
"form.field.required": "Field required",
"form.field.minLength": "{{0}} character(s) minimum",
+ "form.field.minValue": "The minimum value is {{0}}",
"form.field.notAllowedValue": "Not allowed value",
"matrix.graphSelector": "Columns",
- "matrix.message.importHint": "Click or drag'n'drop a matrix here",
+ "matrix.message.importHint": "Click or drag and drop a matrix here",
"matrix.importNewMatrix": "Import a new matrix",
"matrix.monotonicView": "Monotonic",
"matrix.message.matrixEmpty": "Empty matrix",
@@ -150,9 +152,9 @@
"settings.noUser": "No user",
"settings.noGroup": "No group",
"settings.noToken": "No token",
- "settings.question.deleteGroup": "Are you sure you want to delete '{{0}}' group ?",
- "settings.question.deleteUser": "Are you sure you want to delete '{{0}}' user ?",
- "settings.question.deleteToken": "Are you sure you want to delete '{{0}}' token ?",
+ "settings.question.deleteGroup": "Are you sure you want to delete '{{0}}' group?",
+ "settings.question.deleteUser": "Are you sure you want to delete '{{0}}' user?",
+ "settings.question.deleteToken": "Are you sure you want to delete '{{0}}' token?",
"settings.question.updateMaintenance": "Are you sure you want to change the maintenance settings?",
"settings.success.groupCreation": "'{{0}}' group successfully created",
"settings.success.groupUpdate": "'{{0}}' group successfully updated",
@@ -177,7 +179,7 @@
"settings.error.updateMaintenance": "Maintenance mode not updated",
"launcher.additionalModes": "Additional modes",
"launcher.autoUnzip": "Automatically unzip",
- "launcher.xpress": "Use xpress solver (>= 8.3)",
+ "launcher.xpress": "Use Xpress Solver (>= 8.3)",
"launcher.xpansion.sensitivityMode": "Sensitivity mode",
"launcher.xpansion.versionCpp": "Version C++",
"launcher.xpansion.versionR": "Version R (<= 7.x)",
@@ -188,7 +190,7 @@
"study.postProcessing": "Post processing",
"study.timeLimit": "Time limit",
"study.timeLimitHelper": "Time limit in hours (max: {{max}}h)",
- "study.nbCpu": "Number of core",
+ "study.nbCpu": "Number of cores",
"study.clusterLoad": "Cluster load",
"study.synthesis": "Synthesis",
"study.level": "Level",
@@ -231,10 +233,8 @@
"study.modelization": "Modelization",
"study.configuration": "Configuration",
"study.results": "Results",
- "study.copyId": "Copy the study id",
- "study.copyJobId": "Copy the job id",
- "study.modelization.map.newArea": "New Area",
- "study.modelization.map.areaName": "Area name",
+ "study.copyId": "Copy the study ID",
+ "study.copyJobId": "Copy the job ID",
"study.modelization.links.hurdleCost": "Hurdle costs",
"study.modelization.links.loopFlows": "Loop flows",
"study.modelization.links.pst": "PST",
@@ -254,7 +254,7 @@
"study.modelization.links.matrix.columns.transCapaIndirect": "Trans. capacity indirect",
"study.modelization.links.matrix.columns.hurdleCostsDirect": "Hurdle costs direct",
"study.modelization.links.matrix.columns.hurdleCostsIndirect": "Hurdle costs indirect",
- "study.modelization.links.matrix.columns.inpedances": "Inpedances",
+ "study.modelization.links.matrix.columns.impedances": "Impedances",
"study.modelization.links.matrix.columns.loopFlow": "Loop flow",
"study.modelization.links.matrix.columns.pShiftMin": "P.Shift Min",
"study.modelization.links.matrix.columns.pShiftMax": "P.Shift Max",
@@ -264,7 +264,7 @@
"study.modelization.tableMode.template.geographicTrimmingLinks": "Geographic Trimming (links)",
"study.modelization.tableMode.dialog.add.title": "Add table",
"study.modelization.tableMode.dialog.edit.title": "Edit table",
- "study.modelization.tableMode.dialog.delete.text": "Are you sure you want to delete '{{0}}' table ?",
+ "study.modelization.tableMode.dialog.delete.text": "Are you sure you want to delete '{{0}}' table?",
"study.configuration.general.simulation": "Simulation",
"study.configuration.general.mode": "Mode",
"study.configuration.general.firstDay": "First day",
@@ -284,7 +284,7 @@
"study.configuration.general.yearByYear": "Year-by-year",
"study.configuration.general.mcScenario": "MC Scenario",
"study.configuration.general.mcScenarioBuilder": "MC Scenario builder",
- "study.configuration.general.mcScenarioBuilder.activeRuleset": "Active uleset:",
+ "study.configuration.general.mcScenarioBuilder.activeRuleset": "Active ruleset:",
"study.configuration.general.mcScenarioBuilder.year": "Year",
"study.configuration.general.mcScenarioBuilder.tab.load": "Load",
"study.configuration.general.mcScenarioBuilder.tab.thermal": "Thermal",
@@ -316,7 +316,7 @@
"study.configuration.optimization.transmissionCapacities": "Transmission capacities",
"study.configuration.optimization.linkType": "Link type",
"study.configuration.optimization.thermalClustersMinStablePower": "Thermal clusters min stable power",
- "study.configuration.optimization.thermalClustersMinUdTime": "Thermal clusters min ud time",
+ "study.configuration.optimization.thermalClustersMinUdTime": "Thermal clusters min UD time",
"study.configuration.optimization.dayAheadReserve": "Day ahead reserve",
"study.configuration.optimization.primaryReserve": "Primary reserve",
"study.configuration.optimization.strategicReserve": "Strategic reserve",
@@ -357,15 +357,27 @@
"study.modelization.nodeProperties.nodalOptimization": "Nodal Optimization",
"study.modelization.nodeProperties.energyCost": "Energy cost",
"study.modelization.nodeProperties.unsupplied": "Unsupplied",
- "study.modelization.nodeProperties.splilled": "Spilled",
+ "study.modelization.nodeProperties.spilled": "Spilled",
"study.modelization.nodeProperties.lastResortShedding": "Last resort shedding status",
"study.modelization.nodeProperties.nonDispatchPower": "Non dispatch. power",
"study.modelization.nodeProperties.dispatchHydroPower": "Dispatch. hydropower",
"study.modelization.nodeProperties.otherDispatchPower": "Other dispatch. power",
"study.modelization.nodeProperties.outputFilter": "Output print status",
"study.modelization.nodeProperties.filterByYear": "Output year by year",
- "study.modelization.nodeProperties.filterSynthesis": "Sorties synthesis",
+ "study.modelization.nodeProperties.filterSynthesis": "Synthesis outputs",
"study.modelization.map": "Map",
+ "study.modelization.map.newArea": "New Area",
+ "study.modelization.map.areaName": "Area name",
+ "study.modelization.map.layers": "Layers",
+ "study.modelization.map.layers.add": "Add layer",
+ "study.modelization.map.layers.edit": "Edit layers",
+ "study.modelization.map.layers.delete.confirm": "Are you sure you want to delete '{{0}}' layer?",
+ "study.modelization.map.districts": "Districts",
+ "study.modelization.map.districts.field.comments": "Comments",
+ "study.modelization.map.districts.field.outputs": "Outputs",
+ "study.modelization.map.districts.add": "Add district",
+ "study.modelization.map.districts.edit": "Edit districts",
+ "study.modelization.map.districts.delete.confirm": "Are you sure you want to delete '{{0}}' district?",
"study.modelization.posX": "Position X",
"study.modelization.posY": "Position Y",
"study.modelization.properties": "Properties",
@@ -397,8 +409,8 @@
"study.modelization.clusters.startupCost": "Startup cost",
"study.modelization.clusters.marketBidCost": "Market bid",
"study.modelization.clusters.spreadCost": "Spread cost",
- "study.modelization.clusters.timeSeriesGen": "Timeseries generation",
- "study.modelization.clusters.genTs": "Generate timeseries",
+ "study.modelization.clusters.timeSeriesGen": "Time-Series generation",
+ "study.modelization.clusters.genTs": "Generate Time-Series",
"study.modelization.clusters.volatilityForced": "Volatility forced",
"study.modelization.clusters.volatilityPlanned": "Volatility planned",
"study.modelization.clusters.lawForced": "Law forced",
@@ -407,9 +419,9 @@
"study.modelization.clusters.matrix.tsGen": "TS generator",
"study.modelization.clusters.matrix.timeSeries": "Time-Series",
"study.modelization.clusters.backClusterList": "Back to cluster list",
- "study.modelization.clusters.tsInterpretation": "Timeseries mode",
+ "study.modelization.clusters.tsInterpretation": "TS interpretation",
"study.modelization.clusters.group": "Group",
- "studies.modelization.clusters.question.delete": "Are you sure you want to delete this cluster ?",
+ "studies.modelization.clusters.question.delete": "Are you sure you want to delete this cluster?",
"study.modelization.bindingConst.comments": "Comments",
"study.modelization.bindingConst.type": "Type",
"study.modelization.bindingConst.constraints": "Constraints",
@@ -425,10 +437,10 @@
"study.modelization.bindingConst.addConstraintTerm": "Add constraint term",
"study.modelization.bindingConst.weight": "Weight",
"study.modelization.bindingConst.offset": "Offset",
- "study.modelization.bindingConst.question.deleteConstraintTerm": "Are you sure you want to delete this constraint term ?",
- "study.modelization.bindingConst.question.deleteBindingConstraint": "Are you sure you want to delete this binding constraint ?",
+ "study.modelization.bindingConst.question.deleteConstraintTerm": "Are you sure you want to delete this constraint term?",
+ "study.modelization.bindingConst.question.deleteBindingConstraint": "Are you sure you want to delete this binding constraint?",
"study.results.mc": "Monte-Carlo",
- "study.results.mc.year": "year",
+ "study.results.mc.year": "Year",
"study.results.display": "Display",
"study.results.temporality": "Temporality",
"study.results.noData": "No data available",
@@ -449,32 +461,32 @@
"study.success.deleteCluster": "Cluster deleted successfully",
"study.message.upgradeInProgress": "Running study upgrade",
"study.message.outputExportInProgress": "Downloading study outputs...",
- "study.question.deleteLink": "Are you sure you want to delete this link ?",
- "study.question.deleteArea": "Are you sure you want to delete this area ?",
- "study.question.upgrade": "Are you sure you want to upgrade this study ?",
- "study.question.killJob": "Are you sure you want to cancel the simulation job ?",
+ "study.question.deleteLink": "Are you sure you want to delete this link?",
+ "study.question.deleteArea": "Are you sure you want to delete this area?",
+ "study.question.upgrade": "Are you sure you want to upgrade this study?",
+ "study.question.killJob": "Are you sure you want to cancel the simulation job?",
"study.error.exportOutput": "Failed to export the output",
"study.error.listOutputs": "Failed to retrieve output list",
"study.error.fetchComments": "Failed to fetch comments",
"study.error.commentsNotSaved": "Comments not saved",
- "study.error.studyIdCopy": "Failed to copy study id",
- "study.error.jobIdCopy": "Failed to copy job id",
+ "study.error.studyIdCopy": "Failed to copy study ID",
+ "study.error.jobIdCopy": "Failed to copy job ID",
"study.error.createArea": "Failed to create the area",
"study.error.createLink": "Failed to create the link",
"study.error.updateUI": "Failed to update the area",
- "study.error.deleteAreaOrLink": "Area or link not deleted",
+ "study.error.deleteAreaOrLink": "Failed to delete area or link",
"study.error.getAreasInfo": "Failed to fetch areas data",
- "study.error.modifiedStudy": "Study {{studyname}} not updated",
- "study.error.launchLoad": "Failed to retrieve the load of the cluster",
+ "study.error.modifiedStudy": "Failed to update Study {{studyname}}",
+ "study.error.launchLoad": "Failed to retrieve cluster load",
"study.error.upgrade": "Failed to upgrade your study",
"study.error.createDistrict": "Failed to add district",
"study.error.createLayer": "Failed to add layer",
"study.success.commentsSaved": "Comments saved successfully",
- "study.success.studyIdCopy": "Study id copied !",
- "study.success.jobIdCopy": "Job id copied !",
+ "study.success.studyIdCopy": "Study ID copied!",
+ "study.success.jobIdCopy": "Job ID copied!",
"study.success.modifiedStudy": "Study {{studyname}} updated successfully",
- "studies.question.delete": "Are you sure you want to delete this study ?",
- "studies.deleteSubvariants": "Delete all children variants",
+ "studies.question.delete": "Are you sure you want to delete this study?",
+ "studies.deleteSubvariants": "Are you sure you want to delete all children variants?",
"studies.error.retrieveData": "Failed to retrieve data",
"studies.error.retrieveStudies": "Failed to retrieve studies",
"studies.error.deleteStudy": "Failed to delete study",
@@ -484,18 +496,18 @@
"studies.error.moveStudy": "Failed to move study {{study}}",
"studies.error.saveData": "Failed to save data",
"studies.error.copyStudy": "Failed to copy study",
- "studies.error.import": "Study import has failed ({{uploadFile}})",
+ "studies.error.import": "Failed to import Study ({{uploadFile}})",
"studies.error.archive": "Failed to archive study {{studyname}}",
"studies.error.unarchive": "Failed to unarchive study {{studyname}}",
"studies.error.archiveOutput": "Failed to archive study output {{outputname}}",
"studies.error.unarchiveOutput": "Failed to unarchive study output {{outputname}}",
- "studies.error.createStudy": "Study {{studyname}} not created",
+ "studies.error.createStudy": "Failed to create Study {{studyname}}",
"studies.success.saveData": "Data saved with success",
"studies.success.scanFolder": "Folder scan started",
"studies.success.moveStudy": "Study {{study}} was successfully moved to {{folder}}",
"studies.success.import": "Study import was successful ({{uploadFile}})",
"studies.success.createStudy": "Study {{studyname}} created successfully",
- "studies.studylaunched": "{{studyname}} launched !",
+ "studies.studylaunched": "{{studyname}} launched!",
"studies.copySuffix": "Copy",
"studies.folder": "Folder",
"studies.filters.strictfolder": "Show only direct folder children",
@@ -504,7 +516,7 @@
"studies.movefolderplaceholder": "Path separated by '/'",
"studies.importcopy": "Copy to database",
"studies.importNewStudy": "Import a new study",
- "studies.importHint": "Click or drag'n'drop a zipped study here",
+ "studies.importHint": "Click or drag and drop a zipped study here",
"studies.studycopying": "Copying study...",
"studies.studyarchiving": "Archiving study...",
"studies.studyunarchiving": "Unarchiving study...",
@@ -533,22 +545,22 @@
"studies.variant": "Variant",
"variants.createNewVariant": "Create new variant",
"variants.newVariant": "New variant",
- "variants.error.variantCreation": "Variant not created",
+ "variants.error.variantCreation": "Failed to create variant",
"variants.newCommand": "Add new command",
"variants.commandActionLabel": "Select action",
"variants.success.save": "Command updated successfully",
"variants.success.delete": "Command deleted successfully",
"variants.success.commandAdded": "Command added successfully",
"variants.success.commandMoved": "Command moved successfully",
- "variants.error.commandUpdated": "Command not updated",
- "variants.error.commandDeleted": "Command not deleted",
- "variants.error.addCommand": "Command not added",
- "variants.error.moveCommand": "Command not moved",
- "variants.error.fetchCommand": "Error while retrieving commands",
+ "variants.error.commandUpdated": "Failed to update command",
+ "variants.error.commandDeleted": "Failed to delete command",
+ "variants.error.addCommand": "Failed to add command",
+ "variants.error.moveCommand": "Failed to move command",
+ "variants.error.fetchCommand": "Failed to retrieve commands",
"variants.success.import": "File imported successfully",
- "variants.error.import": "Error during file importation",
- "variants.error.jsonParsing": "Error while parsing json command file",
- "variants.error.export": "Error during file exportation",
+ "variants.error.import": "Failed to import file",
+ "variants.error.jsonParsing": "Failed to parse json command file",
+ "variants.error.export": "Failed to export file",
"variants.success.launchGeneration": "Variant generation launched",
"variants.error.launchGeneration": "Variant generation could not launched",
"variants.generationInProgress": "Generation in progress...",
@@ -562,10 +574,11 @@
"variants.commands.import": "Replace all commands",
"variants.commands.export": "Export all commands",
"variants.commands.exportMatrices": "Export matrices",
- "variants.commands.question.deleteAll": "Are you sure you want to delete all commands ?",
- "xpansion.timeSeries": "Time series",
+ "variants.commands.question.deleteAll": "Are you sure you want to delete all commands?",
+ "variants.commands.question.delete": "Are you sure you want to delete this command?",
+ "xpansion.timeSeries": "Time-Series",
"xpansion.link": "Link",
- "xpansion.annualCost": "Annual cost per mw",
+ "xpansion.annualCost": "Annual cost per MW",
"xpansion.unitSize": "Unit size",
"xpansion.maxUnits": "Max units",
"xpansion.maxInvestments": "Max investment",
@@ -581,7 +594,7 @@
"xpansion.epsilon": "Maximum gap with the optimal solution",
"xpansion.ucType": "UC Type",
"xpansion.master": "Master",
- "xpansion.optimalyGap": "Optimality gap",
+ "xpansion.optimalityGap": "Optimality gap",
"xpansion.maxIteration": "Max iteration",
"xpansion.yearlyWeight": "Yearly weight",
"xpansion.additionalConstraints": "Additional constraints",
@@ -604,8 +617,8 @@
"xpansion.newXpansionConfig": "New Xpansion configuration",
"xpansion.candidates": "Candidates",
"xpansion.newCandidate": "New candidate",
- "xpansion.question.deleteFile": "Are you sure you want to delete this file ?",
- "xpansion.question.deleteConfiguration": "Are you sure you want to delete the configuration of Xpansion ?",
+ "xpansion.question.deleteFile": "Are you sure you want to delete this file?",
+ "xpansion.question.deleteConfiguration": "Are you sure you want to delete the configuration of Xpansion?",
"xpansion.question.deleteCandidate": "Are you sure you want to delete this candidate?",
"xpansion.error.loadConfiguration": "Failed to load the configuration of Xpansion",
"xpansion.error.createConfiguration": "Failed to create the configuration of Xpansion",
@@ -622,24 +635,24 @@
"data.newMatrixTitle": "Create new matrix dataset",
"data.uploadingmatrix": "Uploading matrices",
"data.analyzingmatrix": "Analyzing matrices",
- "data.success.matrixIdCopied": "Matrix id copied !",
+ "data.success.matrixIdCopied": "Matrix ID copied!",
"data.jsonFormat": "JSON Format",
"data.assignMatrix": "Assign a matrix",
"data.error.matrixList": "Unable to retrieve matrix list",
"data.error.matrix": "Unable to retrieve matrix data",
"data.error.fileNotUploaded": "Please select a file",
- "data.error.matrixDelete": "Matrix not deleted",
+ "data.error.matrixDelete": "Failed to delete matrix",
"data.error.copyMatrixId": "Failed to copy the matrix ID",
"data.error.matrixAssignation": "Failed to assign the matrix",
- "data.succes.matrixAssignation": "Matrix successfully assigned",
+ "data.success.matrixAssignation": "Matrix successfully assigned",
"data.success.matrixUpdate": "Matrix successfully updated",
"data.success.matrixCreation": "Matrix successfully created",
"data.success.matrixDelete": "Matrix successfully deleted",
- "data.question.deleteMatrix": "Are you sure you want to delete this matrix ?",
- "data.question.deleteDataset": "Are you sure you want to delete this dataset ?",
+ "data.question.deleteMatrix": "Are you sure you want to delete this matrix?",
+ "data.question.deleteDataset": "Are you sure you want to delete this dataset?",
"data.message.uploadHelp": "The file must be a single matrix file or a zip containing a list of matrix files",
"results.error.jobs": "Failed to retrieve study launch jobs",
- "results.error.outputs": "Failed to retrieve study ouptut list",
+ "results.error.outputs": "Failed to retrieve study output list",
"results.noOutputs": "No outputs",
- "results.question.deleteOutput": "Are you sure you want to delete the output {{outputname}} ?"
+ "results.question.deleteOutput": "Are you sure you want to delete the output {{outputname}}?"
}
diff --git a/webapp/public/locales/fr/main.json b/webapp/public/locales/fr/main.json
index 74c47471bd..e0d3293c73 100644
--- a/webapp/public/locales/fr/main.json
+++ b/webapp/public/locales/fr/main.json
@@ -19,7 +19,7 @@
"global.copyId": "Copier l'ID",
"global.data": "Données",
"global.loading": "Chargement",
- "global.metadata": "Metadonnées",
+ "global.metadata": "Métadonnées",
"global.groups": "Groupes",
"global.permission": "Permission",
"global.permissions": "Permissions",
@@ -59,7 +59,7 @@
"global.color": "Couleur",
"global.advancedParams": "Paramètres avancés",
"global.matrix": "Matrice",
- "global.matrixes": "Matrices",
+ "global.matrices": "Matrices",
"global.chooseFile": "Choisir un fichier",
"global.assign": "Assigner",
"global.time.hourly": "Horaire",
@@ -84,7 +84,8 @@
"data.title": "Données",
"dialog.title.confirmation": "Confirmation",
"dialog.message.logout": "Êtes vous sûr de vouloir vous déconnecter ?",
- "button.hide": "Masquer",
+ "button.collapse": "Réduire",
+ "button.expand": "Étendre",
"button.yes": "Oui",
"button.no": "Non",
"button.ok": "Ok",
@@ -106,6 +107,7 @@
"form.submit.inProgress": "Le formulaire est en cours de soumission. Etes-vous sûr de vouloir quitter la page ?",
"form.field.required": "Champ requis",
"form.field.minLength": "{{0}} caractère(s) minimum",
+ "form.field.minValue": "La valeur minimum est {{0}}",
"form.field.notAllowedValue": "Valeur non autorisée",
"matrix.graphSelector": "Colonnes",
"matrix.message.importHint": "Cliquer ou glisser une matrice ici",
@@ -177,7 +179,7 @@
"settings.error.updateMaintenance": "Erreur lors du changement du status de maintenance",
"launcher.additionalModes": "Mode additionnels",
"launcher.autoUnzip": "Dézippage automatique",
- "launcher.xpress": "Utiliser le solver xpress (>= 8.3)",
+ "launcher.xpress": "Utiliser le solver Xpress (>= 8.3)",
"launcher.xpansion.sensitivityMode": "Analyse de sensibilité",
"launcher.xpansion.versionCpp": "Version C++",
"launcher.xpansion.versionR": "Version R (<= 7.x)",
@@ -185,7 +187,7 @@
"study.otherOptions": "Autres options",
"study.xpansionMode": "Mode Xpansion",
"study.archiveOutputMode": "Mode archivé",
- "study.postProcessing": "Post processing",
+ "study.postProcessing": "Post-traitement",
"study.timeLimit": "Limite de temps",
"study.timeLimitHelper": "Limite de temps en heures (max: {{max}}h)",
"study.nbCpu": "Nombre de coeurs",
@@ -233,28 +235,26 @@
"study.results": "Résultats",
"study.copyId": "Copier l'identifiant de l'étude",
"study.copyJobId": "Copier l'identifiant de la tâche",
- "study.modelization.map.newArea": "Nouvelle zone",
- "study.modelization.map.areaName": "Nom de la zone",
"study.modelization.links.hurdleCost": "Hurdle costs",
"study.modelization.links.loopFlows": "Loop flows",
"study.modelization.links.pst": "PST",
"study.modelization.links.type": "Type",
- "study.modelization.links.transmissionCapa": "Transmission capacities",
+ "study.modelization.links.transmissionCapa": "Capacités de transmission",
"study.modelization.links.transmissionCapa.infinite": "Infinite",
"study.modelization.links.transmissionCapa.ignore": "Null",
- "study.modelization.links.transmissionCapa.enabled": "Enabled",
+ "study.modelization.links.transmissionCapa.enabled": "Activé",
"study.modelization.links.type.ac": "AC",
"study.modelization.links.type.dc": "DC",
"study.modelization.links.type.gaz": "Gas",
"study.modelization.links.type.virt": "Virt",
- "study.modelization.links.type.other": "Other",
+ "study.modelization.links.type.other": "Autre",
"study.modelization.links.matrix.parameters": "Paramètres",
"study.modelization.links.matrix.capacities": "Capacités",
- "study.modelization.links.matrix.columns.transCapaDirect": "Trans. capacity direct",
- "study.modelization.links.matrix.columns.transCapaIndirect": "Trans. capacity indirect",
+ "study.modelization.links.matrix.columns.transCapaDirect": "Capacités de transmission directes",
+ "study.modelization.links.matrix.columns.transCapaIndirect": "Capacités de transmission indirectes",
"study.modelization.links.matrix.columns.hurdleCostsDirect": "Hurdle costs direct",
"study.modelization.links.matrix.columns.hurdleCostsIndirect": "Hurdle costs indirect",
- "study.modelization.links.matrix.columns.inpedances": "Inpedances",
+ "study.modelization.links.matrix.columns.impedances": "Impedances",
"study.modelization.links.matrix.columns.loopFlow": "Loop flow",
"study.modelization.links.matrix.columns.pShiftMin": "P.Shift Min",
"study.modelization.links.matrix.columns.pShiftMax": "P.Shift Max",
@@ -286,24 +286,24 @@
"study.configuration.general.mcScenarioBuilder": "MC Scenario builder",
"study.configuration.general.mcScenarioBuilder.activeRuleset": "Ruleset actif :",
"study.configuration.general.mcScenarioBuilder.year": "Année",
- "study.configuration.general.mcScenarioBuilder.tab.load": "Load",
- "study.configuration.general.mcScenarioBuilder.tab.thermal": "Thermal",
+ "study.configuration.general.mcScenarioBuilder.tab.load": "Conso",
+ "study.configuration.general.mcScenarioBuilder.tab.thermal": "Clus. Thermiques",
"study.configuration.general.mcScenarioBuilder.tab.hydro": "Hydro",
- "study.configuration.general.mcScenarioBuilder.tab.wind": "Wind",
- "study.configuration.general.mcScenarioBuilder.tab.solar": "Solar",
+ "study.configuration.general.mcScenarioBuilder.tab.wind": "Éolien",
+ "study.configuration.general.mcScenarioBuilder.tab.solar": "Solaire",
"study.configuration.general.mcScenarioBuilder.tab.ntc": "NTC",
"study.configuration.general.mcScenarioBuilder.tab.hydroLevels": "Hydro Levels",
"study.configuration.general.mcScenarioBuilder.dialog.delete.text": "Êtes-vous sûr de vouloir supprimer la ruleset '{{0}}' ?",
"study.configuration.general.mcScenarioBuilder.error.table": "La table '{{0}}' n'a pas été mise à jour",
"study.configuration.general.mcScenarioBuilder.error.ruleset.rename": "La ruleset '{{0}}' n'a pas été renommée",
"study.configuration.general.mcScenarioBuilder.error.ruleset.add": "La ruleset '{{0}}' n'a pas été ajoutée",
- "study.configuration.general.mcScenarioBuilder.error.ruleset.delete": "La ruleset '{{0}}' n'a pas été suprimée",
+ "study.configuration.general.mcScenarioBuilder.error.ruleset.delete": "La ruleset '{{0}}' n'a pas été supprimée",
"study.configuration.general.mcScenarioBuilder.error.ruleset.duplicate": "La ruleset '{{0}}' n'a pas été dupliquée",
"study.configuration.general.mcScenarioBuilder.error.ruleset.changeActive": "La ruleset active n'a pas été changée",
"study.configuration.general.mcScenarioPlaylist": "MC Scenario playlist",
- "study.configuration.general.mcScenarioPlaylist.action.enableAll": "Enable all",
- "study.configuration.general.mcScenarioPlaylist.action.disableAll": "Disable all",
- "study.configuration.general.mcScenarioPlaylist.action.reverse": "Reverse",
+ "study.configuration.general.mcScenarioPlaylist.action.enableAll": "Activer tous",
+ "study.configuration.general.mcScenarioPlaylist.action.disableAll": "Désactiver tous",
+ "study.configuration.general.mcScenarioPlaylist.action.reverse": "Inverser",
"study.configuration.general.mcScenarioPlaylist.action.resetWeights": "Reset weights",
"study.configuration.general.mcScenarioPlaylist.status": "Status",
"study.configuration.general.mcScenarioPlaylist.weight": "Weight",
@@ -316,7 +316,7 @@
"study.configuration.optimization.transmissionCapacities": "Transmission capacities",
"study.configuration.optimization.linkType": "Link type",
"study.configuration.optimization.thermalClustersMinStablePower": "Thermal clusters min stable power",
- "study.configuration.optimization.thermalClustersMinUdTime": "Thermal clusters min ud time",
+ "study.configuration.optimization.thermalClustersMinUdTime": "Thermal clusters min UD time",
"study.configuration.optimization.dayAheadReserve": "Day ahead reserve",
"study.configuration.optimization.primaryReserve": "Primary reserve",
"study.configuration.optimization.strategicReserve": "Strategic reserve",
@@ -326,12 +326,12 @@
"study.configuration.optimization.unfeasibleProblemBehavior": "Unfeasible problem behavior",
"study.configuration.optimization.simplexOptimizationRange": "Simplex optimization range",
"study.configuration.optimization.adequacyPatch": "Adequacy patch",
- "study.configuration.optimization.enableAdequacyPatch": "Enable adequacy patch",
+ "study.configuration.optimization.enableAdequacyPatch": "Activer l'adequacy patch",
"study.configuration.optimization.ntcFromPhysicalAreasOutToPhysicalAreasInAdequacyPatch": "NTC from physical areas out to physical areas in adequacy patch",
"study.configuration.optimization.ntcBetweenPhysicalAreasOutAdequacyPatch": "NTC between physical areas out adequacy patch",
"study.configuration.advancedParameters.seedsForRandomNumbers": "Seeds for random numbers",
"study.configuration.advancedParameters.spatialTimeSeriesCorrelation": "Spatial time-series correlation",
- "study.configuration.advancedParameters.otherPreferences": "Other preferences",
+ "study.configuration.advancedParameters.otherPreferences": "Autres préférences",
"study.configuration.advancedParameters.windTimeSeriesGeneration": "Wind time-series generation",
"study.configuration.advancedParameters.loadTimeSeriesGeneration": "Load time-series generation",
"study.configuration.advancedParameters.hydroTimeSeriesGeneration": "Hydro time-series generation",
@@ -357,7 +357,7 @@
"study.modelization.nodeProperties.nodalOptimization": "Optimisation nodale",
"study.modelization.nodeProperties.energyCost": "Coût de l'énergie",
"study.modelization.nodeProperties.unsupplied": "Non distribuée",
- "study.modelization.nodeProperties.splilled": "Non évacuée",
+ "study.modelization.nodeProperties.spilled": "Non évacuée",
"study.modelization.nodeProperties.lastResortShedding": "Moyen de dernier recours pour l'écrêtement",
"study.modelization.nodeProperties.nonDispatchPower": "Production non pilotable",
"study.modelization.nodeProperties.dispatchHydroPower": "Hydraulique pilotable",
@@ -366,6 +366,18 @@
"study.modelization.nodeProperties.filterByYear": "Sorties année par année",
"study.modelization.nodeProperties.filterSynthesis": "Sorties de la synthèse",
"study.modelization.map": "Carte",
+ "study.modelization.map.newArea": "Nouvelle zone",
+ "study.modelization.map.areaName": "Nom de la zone",
+ "study.modelization.map.layers": "Layers",
+ "study.modelization.map.layers.add": "Ajouter un layer",
+ "study.modelization.map.layers.edit": "Modifier un layer",
+ "study.modelization.map.layers.delete.confirm": "Êtes-vous sûr de vouloir supprimer le layer '{{0}}' ?",
+ "study.modelization.map.districts.field.comments": "Commentaires",
+ "study.modelization.map.districts.field.outputs": "Sorties",
+ "study.modelization.map.districts": "Districts",
+ "study.modelization.map.districts.add": "Ajouter un district",
+ "study.modelization.map.districts.edit": "Modifier un district",
+ "study.modelization.map.districts.delete.confirm": "Êtes-vous sûr de vouloir supprimer le district '{{0}}' ?",
"study.modelization.posX": "Position X",
"study.modelization.posY": "Position Y",
"study.modelization.properties": "Propriétés",
@@ -382,7 +394,7 @@
"study.modelization.clusters.newCluster": "Nouveau cluster",
"study.modelization.clusters.clusterGroup": "Groupe du cluster",
"study.modelization.clusters.operatingParameters": "Paramètres de fonctionnement",
- "study.modelization.clusters.unitcount": "Unit",
+ "study.modelization.clusters.unitcount": "Nombre d'unités",
"study.modelization.clusters.enabled": "Activé",
"study.modelization.clusters.nominalCapacity": "Capacité nominale",
"study.modelization.clusters.mustRun": "Must run",
@@ -397,17 +409,17 @@
"study.modelization.clusters.startupCost": "Coûts de démarrage",
"study.modelization.clusters.marketBidCost": "Offre de marché",
"study.modelization.clusters.spreadCost": "Coûts de répartition",
- "study.modelization.clusters.timeSeriesGen": "Génération des Timeseries",
- "study.modelization.clusters.genTs": "Générer des timeseries",
+ "study.modelization.clusters.timeSeriesGen": "Génération des Séries temporelles",
+ "study.modelization.clusters.genTs": "Générer des Séries temporelles",
"study.modelization.clusters.volatilityForced": "Volatilité forcée",
"study.modelization.clusters.volatilityPlanned": "Volatilité prévue",
"study.modelization.clusters.lawForced": "Loi forcée",
"study.modelization.clusters.lawPlanned": "Loi planifiée",
"study.modelization.clusters.matrix.common": "Common",
"study.modelization.clusters.matrix.tsGen": "TS generator",
- "study.modelization.clusters.matrix.timeSeries": "Time-Series",
+ "study.modelization.clusters.matrix.timeSeries": "Séries temporelles",
"study.modelization.clusters.backClusterList": "Retour à la liste des clusters",
- "study.modelization.clusters.tsInterpretation": "Timeseries mode",
+ "study.modelization.clusters.tsInterpretation": "TS interpretation",
"study.modelization.clusters.group": "Groupes",
"studies.modelization.clusters.question.delete": "Êtes-vous sûr de vouloir supprimer ce cluster ?",
"study.modelization.bindingConst.comments": "Commentaires",
@@ -424,7 +436,7 @@
"study.modelization.bindingConst.newConstraintTerm": "Nouveau terme",
"study.modelization.bindingConst.addConstraintTerm": "Ajouter un terme",
"study.modelization.bindingConst.weight": "Poids",
- "study.modelization.bindingConst.offset": "Offset",
+ "study.modelization.bindingConst.offset": "Décalage",
"study.modelization.bindingConst.question.deleteConstraintTerm": "Êtes-vous sûr de vouloir supprimer ce terme ?",
"study.modelization.bindingConst.question.deleteBindingConstraint": "Êtes-vous sûr de vouloir supprimer cette contrainte couplante ?",
"study.results.mc": "Monte-Carlo",
@@ -487,12 +499,12 @@
"studies.error.unarchive": "Erreur lors du désarchivage de l'étude {{studyname}}",
"studies.error.archiveOutput": "Erreur lors de l'archivage du résultat {{outputname}}",
"studies.error.unarchiveOutput": "Erreur lors du désarchivage du résultat {{outputname}}",
- "studies.error.createStudy": "Study {{studyname}} not created",
- "studies.success.saveData": "Data saved with success",
- "studies.success.scanFolder": "Folder scan started",
- "studies.success.moveStudy": "Study {{study}} was successfully moved to {{folder}}",
- "studies.success.import": "Study import was successful ({{uploadFile}})",
- "studies.success.createStudy": "L'étude {{studyname}} a été créée avec succès",
+ "studies.error.createStudy": "Erreur lors de la création de l'étude {{studyname}}",
+ "studies.success.saveData": "Donnée sauvegardée avec succès",
+ "studies.success.scanFolder": "L'analyse du dossier a commencé",
+ "studies.success.moveStudy": "L'étude {{study}} a été déplacée avec succès vers {{folder}}",
+ "studies.success.import": "L'importation de l'étude a réussi ({{uploadFile}})",
+ "studies.success.createStudy": "L'étude {{studyname}} a été crée avec succès",
"studies.studylaunched": "{{studyname}} lancé(s) !",
"studies.copySuffix": "Copie",
"studies.folder": "Dossier",
@@ -531,7 +543,7 @@
"studies.variant": "Variante",
"variants.createNewVariant": "Créer une nouvelle variante",
"variants.newVariant": "Nouvelle variante",
- "variants.error.variantCreation": "Erreur lors de la création du variant",
+ "variants.error.variantCreation": "Erreur lors de la création de la variante",
"variants.newCommand": "Ajouter une nouvelle commande",
"variants.commandActionLabel": "Sélectionnez le type",
"variants.success.save": "Commande modifiée avec succès",
@@ -561,6 +573,7 @@
"variants.commands.export": "Exporter les commandes",
"variants.commands.exportMatrices": "Exporter les matrices",
"variants.commands.question.deleteAll": "Êtes-vous sûr de vouloir supprimer toutes les commandes ?",
+ "variants.commands.question.delete": "Êtes-vous sûr de vouloir supprimer cette commande ?",
"xpansion.timeSeries": "Séries temporelles",
"xpansion.link": "Lien",
"xpansion.annualCost": "Coût annuel par mw",
@@ -579,7 +592,7 @@
"xpansion.epsilon": "Ecart maximum avec la solution optimale",
"xpansion.ucType": "Type UC",
"xpansion.master": "Maître",
- "xpansion.optimalyGap": "Gap d'optimalité absolu",
+ "xpansion.optimalityGap": "Écart d'optimalité absolu",
"xpansion.maxIteration": "Iteration max",
"xpansion.yearlyWeight": "Poids annuel",
"xpansion.additionalConstraints": "Contraintes additionnelles",
@@ -620,7 +633,7 @@
"data.newMatrixTitle": "Créer un nouveau jeu de données",
"data.uploadingmatrix": "Chargement des matrices",
"data.analyzingmatrix": "Analyse des matrices",
- "data.success.matrixIdCopied": "Id de la Matrice copié !",
+ "data.success.matrixIdCopied": "ID de la Matrice copié !",
"data.jsonFormat": "Format JSON",
"data.assignMatrix": "Assigner une matrice",
"data.error.matrixList": "Impossible de récupérer la liste des matrices",
@@ -629,7 +642,7 @@
"data.error.matrixDelete": "Matrice non supprimée",
"data.error.copyMatrixId": "Erreur lors de la copie de l'ID de la matrice",
"data.error.matrixAssignation": "Erreur lors de l'assignation de la matrice",
- "data.succes.matrixAssignation": "Matrice assignée avec succès",
+ "data.success.matrixAssignation": "Matrice assignée avec succès",
"data.success.matrixUpdate": "Matrice chargée avec succès",
"data.success.matrixCreation": "Matrice créée avec succès",
"data.success.matrixDelete": "Matrice supprimée avec succès",
diff --git a/webapp/src/components/App/Singlestudy/Commands/Edition/AddCommandDialog.tsx b/webapp/src/components/App/Singlestudy/Commands/Edition/AddCommandDialog.tsx
deleted file mode 100644
index 49db2c6a6f..0000000000
--- a/webapp/src/components/App/Singlestudy/Commands/Edition/AddCommandDialog.tsx
+++ /dev/null
@@ -1,86 +0,0 @@
-import { Autocomplete, Box, Button, TextField } from "@mui/material";
-import { useState } from "react";
-import { useTranslation } from "react-i18next";
-import BasicDialog from "../../../../common/dialogs/BasicDialog";
-import { CommandList } from "./utils";
-
-interface PropTypes {
- open: boolean;
- onNewCommand: (action: string) => void;
- onClose: () => void;
-}
-
-function AddCommandDialog(props: PropTypes) {
- const [t] = useTranslation();
- const { open, onNewCommand, onClose } = props;
- const [action, setAction] = useState(CommandList[0]);
-
- const onSave = async () => {
- onNewCommand(action);
- onClose();
- };
-
- return (
-
-
-
- >
- }
- >
-
- option}
- value={action || null}
- onChange={(event, newValue: string | null) =>
- setAction(newValue !== null ? newValue : CommandList[0])
- }
- sx={{
- width: "70%",
- }}
- renderInput={(params) => (
-
- )}
- />
-
-
- );
-}
-
-export default AddCommandDialog;
diff --git a/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx b/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx
index a71acb5c37..dbb282c6a4 100644
--- a/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx
+++ b/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx
@@ -3,7 +3,6 @@ import { useSnackbar } from "notistack";
import { useTranslation } from "react-i18next";
import { DropResult } from "react-beautiful-dnd";
import _ from "lodash";
-import QueueIcon from "@mui/icons-material/Queue";
import CloudDownloadOutlinedIcon from "@mui/icons-material/CloudDownloadOutlined";
import DeleteForeverIcon from "@mui/icons-material/DeleteForever";
import BoltIcon from "@mui/icons-material/Bolt";
@@ -23,7 +22,6 @@ import {
updateCommandResults,
} from "./utils";
import {
- appendCommand,
deleteCommand,
getCommand,
getCommands,
@@ -34,9 +32,7 @@ import {
getStudyTask,
exportCommandsMatrices,
} from "../../../../../services/api/variant";
-import AddCommandDialog from "./AddCommandDialog";
import {
- CommandDTO,
WSEvent,
WSMessage,
CommandResultDTO,
@@ -47,7 +43,6 @@ import CommandImportButton from "./DraggableCommands/CommandImportButton";
import { getTask } from "../../../../../services/api/tasks";
import { Body, EditHeader, Header, headerIconStyle, Root } from "./style";
import SimpleLoader from "../../../../common/loaders/SimpleLoader";
-import SimpleContent from "../../../../common/page/SimpleContent";
import useEnqueueErrorSnackbar from "../../../../../hooks/useEnqueueErrorSnackbar";
import {
addWsMessageListener,
@@ -56,6 +51,7 @@ import {
} from "../../../../../services/webSockets";
import ConfirmationDialog from "../../../../common/dialogs/ConfirmationDialog";
import CheckBoxFE from "../../../../common/fieldEditors/CheckBoxFE";
+import SimpleContent from "../../../../common/page/SimpleContent";
const logError = debug("antares:variantedition:error");
@@ -69,14 +65,12 @@ function EditionView(props: Props) {
const { enqueueSnackbar } = useSnackbar();
const enqueueErrorSnackbar = useEnqueueErrorSnackbar();
const { studyId } = props;
- const [openAddCommandDialog, setOpenAddCommandDialog] =
- useState(false);
- const [openClearCommandsDialog, setOpenClearCommandsDialog] =
- useState(false);
+ const [openClearCommandsDialog, setOpenClearCommandsDialog] = useState(false);
+ const [openDeleteCommandDialog, setOpenDeleteCommandDialog] = useState(-1);
const [openExportCommandsDialog, setOpenExportCommandsDialog] =
- useState(false);
+ useState(false);
const [exportMatrices, setExportMatrices] = useState(false);
- const [generationStatus, setGenerationStatus] = useState(false);
+ const [generationStatus, setGenerationStatus] = useState(false);
const [generationTaskId, setGenerationTaskId] = useState();
const [currentCommandGenerationIndex, setCurrentCommandGenerationIndex] =
useState(-1);
@@ -126,33 +120,7 @@ function EditionView(props: Props) {
};
const onDelete = async (index: number) => {
- try {
- const elm = commands[index];
- await deleteCommand(studyId, elm.id as string);
- setCommands((commandList) =>
- commandList
- .filter((item, idx) => idx !== index)
- .map((item) => ({ ...item, results: undefined }))
- );
- enqueueSnackbar(t("variants.success.delete"), {
- variant: "success",
- });
- } catch (e) {
- enqueueErrorSnackbar(t("variants.error.commandDeleted"), e as AxiosError);
- }
- };
-
- const onNewCommand = async (action: string) => {
- try {
- const elmDTO: CommandDTO = { action, args: {} };
- const newId = await appendCommand(studyId, elmDTO);
- setCommands(commands.concat([{ ...elmDTO, id: newId, updated: false }]));
- enqueueSnackbar(t("variants.success.commandAdded"), {
- variant: "success",
- });
- } catch (e) {
- enqueueErrorSnackbar(t("variants.error.addCommand"), e as AxiosError);
- }
+ setOpenDeleteCommandDialog(index);
};
const onArgsUpdate = (index: number, args: object) => {
@@ -445,6 +413,25 @@ function EditionView(props: Props) {
}
};
+ const handleDeleteCommand = async () => {
+ setOpenDeleteCommandDialog(-1);
+ try {
+ const index = openDeleteCommandDialog;
+ const elm = commands[index];
+ await deleteCommand(studyId, elm.id as string);
+ setCommands((commandList) =>
+ commandList
+ .filter((item, idx) => idx !== index)
+ .map((item) => ({ ...item, results: undefined }))
+ );
+ enqueueSnackbar(t("variants.success.delete"), {
+ variant: "success",
+ });
+ } catch (e) {
+ enqueueErrorSnackbar(t("variants.error.commandDeleted"), e as AxiosError);
+ }
+ };
+
////////////////////////////////////////////////////////////////
// JSX
////////////////////////////////////////////////////////////////
@@ -467,12 +454,6 @@ function EditionView(props: Props) {
onClick={() => setOpenExportCommandsDialog(true)}
/>
-
- setOpenAddCommandDialog(true)}
- />
-
- setOpenAddCommandDialog(true)}
- >
- {t("button.newCommand")}
-
- }
- />
+